2

这个问题更多是出于好奇而不是出于实际需要。

有什么方法可以测试传入ByRef(即refout在 C# 中)参数的参数是否与某个“其他”变量具有相同的存储位置?我并不是要测试对象是否相同,因为两个不同的引用变量可能是对同一对象的两个不同的引用。

我想出了一些例子来解释我的意思。考虑:

public static void SillySwap(ref int a, ref int b)
{
  // first put sum of original numbers into slot a,
  // then use that to get out the original numbers swapped
  a = a + b;
  b = a - b;
  a = a - b;
}

(我们通常会使用第三个临时变量,但为了说明我的问题,我会这样做。)SillySwap如果你有两个变量,数值相同或不同,效果很好。但如果你这样称呼它:

int shared = 42;
SillySwap(ref shared, ref shared);

它会歼灭shared有什么方法可以在SillySwapifabare equal 作为存储位置的主体内进行测试?

这是一个带有字段(“类变量”)的修改示例:

protected static int field;
public static void SillySwap2(ref int arg)
{
  arg = arg + field;
  field = arg - field;
  arg = arg - field;
}

在这里,我们要检查arg传入的是否实际上是变量field

最后一个例子,考虑这个:

static bool SillyTryGetStrings(out string first, out string second)
{
  // the order of assignment may matter here!
  second = "world";
  first = "Hello";

  return true;
}

假设某个陌生人为first和传入了相同的变量second。我们可以在方法内部检查吗?

4

1 回答 1

3

一种方法是使用不安全的代码并比较指向变量的指针:

public unsafe bool AreRefsEqual(ref int a, ref int b)
{
    fixed (int* aptr = &a)
    fixed (int* bptr = &b)
    {
        return aptr == bptr;
    }         
}

[TestMethod]
public void ShouldRefsEqualWork()
{
    int a = 1, b = 1;
    Assert.IsTrue(AreRefsEqual(ref a, ref a));
    Assert.IsFalse(AreRefsEqual(ref a, ref b));           
}
于 2013-06-30T10:29:30.067 回答