C#-在没有占位符的情况下交换对象

C#-在没有占位符的情况下交换对象,c#,C#,我被告知使用临时对象不是交换数组中元素的最有效方法 例如: Object[] objects = new Object[10]; // -- Assign the 10 objects some values var Temp = objects[2]; objects[2] = objects[4]; objects[4] = Temp; 是否真的可以在不使用其他对象的情况下交换数组的元素 我知道用数学单位你可以,但我不知道用任何其他对象类型怎么做。用临时对象交换对象是最正确的方法。这应该比

我被告知使用临时对象不是交换数组中元素的最有效方法

例如:

Object[] objects = new Object[10];
// -- Assign the 10 objects some values
var Temp = objects[2];
objects[2] = objects[4];
objects[4] = Temp;
是否真的可以在不使用其他对象的情况下交换数组的元素


我知道用数学单位你可以,但我不知道用任何其他对象类型怎么做。

用临时对象交换对象是最正确的方法。这应该比速度更重要。编写输出垃圾的快速软件非常容易

在处理对象时,您无法以不同的方式进行处理。这一点也不低效。指向已存在对象的额外引用变量几乎不会成为问题


但是,即使使用数值,大多数聪明的技术在某些时候也无法产生正确的结果。

我在网上找到的每个示例都使用这种方法来交换数组中的两个元素。事实上,如果这是我经常做的事情,我肯定会考虑一个通用的ExtAcExod方法,类似于这个例子:


您可以使用Interlocked.Exchange进行操作,但这不会比使用temp变量更快。。。对于面试之外的这类问题,速度可能并不重要。

你唯一应该担心的是创建一个临时对象的时间是当它很大的时候,复制该对象所需的时间将足够长,例如,如果你经常这样做,或者如果你正在做10k项,并将其从9999移到1,一次测试一个阶段,测试它是否应该移动,然后每次交换它都是一个消耗。然而,一种更有效的方法是测试所有测试并移动一次。

可能是告诉你这件事的人在想这样的事情:

objects[2] = Interlocked.Exchange(ref objects[4], objects[2]);

当然,仅仅因为这是一行并不意味着它不使用临时变量。它只是以一个方法参数的形式隐藏(对
对象[2]
的引用被复制并传递给
交换
方法),使得它不那么明显。

谁告诉你的?为什么他们没有告诉你怎么做?用数字你可以将两个对象“存储”在和的同一个元素中,但这在通用对象中是不可能的…谁告诉你有更好的方法在C中实现这一点?显然他不知道他在说什么。这里没有涉及到副本,除了一些引用。可能是32位或64位。拥有“海量”对象一点问题都没有。当然,这不适用于OP的示例。在C#中使用临时变量交换两个引用不会“复制”除引用本身之外的任何内容;它没有分配一个新对象。没有,但试图给出一个不用担心的理由。但这不是一个“真正”的问题。这是一个面试问题,是由在互联网上读过一些奇特数学的人提出的,他们要么不懂,要么想出了一些可怕的方法,在一个不安全的代码块中完成。应该使用XCHG,它不需要中间值。。。尽管如果JIT中出现了次优代码,我一点也不感到惊讶。无论如何,如果这个人认为这是最有效的方法,他甚至比我想象的更无知。为了同步而同步(或者更糟,为了“效率”而同步)不是一个好主意。