Существует ли такой метод в любом месте в рамках?Есть ли общий способ обмена в рамках?
public static void Swap<T>(ref T left, ref T right) {
T temp;
temp = left;
left = right;
right = temp;
}
Если нет, то почему?
Существует ли такой метод в любом месте в рамках?Есть ли общий способ обмена в рамках?
public static void Swap<T>(ref T left, ref T right) {
T temp;
temp = left;
left = right;
right = temp;
}
Если нет, то почему?
Interlocked.Exchange. Это делает это в потокобезопасном атомарном вызове.
Edit после комментариев:
Просто чтобы прояснить, как это работает, используя Interlocked.Exchange, вы могли бы сделать:
left = Interlocked.Exchange(ref right, left);
Это будет эквивалентно (в действительности) делать:
Swap(ref left, ref right);
Однако Interlocked.Exchange делает это как атомную операцию, поэтому она является потокобезопасной.
Нет, у рамки нет такого метода. Вероятно, причина в том, что нет большой выгоды, чтобы встроить его, и вы могли бы легко (как и вы) добавить его сами. Это также требует использования ref
в качестве параметра, что значительно ограничит использование. Например, вы не могли этого сделать:
List<int> test;
// ...
Swap(ref test[0], ref test[1]); // won't work, it's an indexer, not an array
Interlocked.Exchange устанавливает значение, оно фактически не меняет значения. Вам все равно нужно сохранить временную задержку и дважды вызвать Interlocked.Exchange, так что вы ничего не получите. – jrista
Interlocked.Exchange на самом деле не эквивалентен указанной Swap. Он меняет только первое значение и не касается второго (самого себя). –
@Mehdrad: left = InterlockedExchange (правый правый, левый); –