Как проверить, если С# 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"