框架中是否存在通用交换方法?

Bob*_*Bob 14 .net

这样的方法是否存在于框架中的任何位置?

public static void Swap<T>(ref T left, ref T right) {
    T temp;
    temp = left;
    left = right;
    right = temp;
}
Run Code Online (Sandbox Code Playgroud)

如果没有,有什么理由吗?

Ree*_*sey 10

Interlocked.Exchange.这是在线程安全的原子调用中完成的.


评论后编辑:

为了澄清使用Interlocked.Exchange如何工作,你会做:

left = Interlocked.Exchange(ref right, left);
Run Code Online (Sandbox Code Playgroud)

这将与执行相同(实际上):

Swap(ref left, ref right);
Run Code Online (Sandbox Code Playgroud)

但是,Interlocked.Exchange将其作为原子操作执行,因此它是线程安全的.

  • 说这是原子的误导,"左"的赋值将在赋予"正确"之后发生. (5认同)

Meh*_*ari 5

不,框架没有这样的方法。原因可能是内置它没有太大好处,并且您可以非常轻松地(就像您所做的那样)自己添加它。这也需要使用refas 参数,这将极大地限制用例。例如,你不能这样做:

List<int> test; 
// ...
Swap(ref test[0], ref test[1]); // won't work, it's an indexer, not an array
Run Code Online (Sandbox Code Playgroud)