Как проверить, если С# ref Аргументы Ссылка на тот же элемент
В С# задана функция с подписи
public static void Foo(ref int x, ref int y)
Если функция вызывается с использованием
int A = 10;
Foo(ref A, ref A)
Внутри функции Foo можно проверить, что аргументы x и y ссылаются на одну и ту же переменную? Простой эквивалентный тест x и y недостаточен, так как это также верно в случае, когда две разные переменные имеют одинаковое значение.
Ответы
Ответ 1
Если вы хотите использовать небезопасный код, вы можете сравнить базовые адреса переменных:
public static bool Foo(ref int a, ref int b)
{
unsafe
{
fixed (int* pa = &a, pb = &b)
{
// return true iff a and b are references to the same variable
return pa == pb;
}
}
}
(Отредактировано для удаления unsafe
из подписи метода на основе комментария @Michael Graczyk.)
Ответ 2
Вы можете использовать Object.ReferenceEquals(x, y)
, чтобы определить, являются ли x
и y
ссылками на один и тот же объект.
Изменить: Как указал Кирк Волл (подтвержденный в этой статье на MSDN), этот метод не работает для значения (из-за бокса). Вы можете обойти это, изменив типы параметров метода от int
до object
(конечно, это означает, что вам также нужно передать переменную object
в метод - это все равно может быть int
, хотя).
то есть. метод становится:
public static void Foo(ref object x, ref object y) {
Console.WriteLine("x and y the same ref: {0}", Object.ReferenceEquals(x, y));
}
и называя его:
object A = 10;
Foo(ref A, ref A);
приведет к "x and y are the same ref: True"