在运行时测试传入的ByRef参数是否与给定的“”共享存储位置;其他“;变量

本文关键字:共享 存储 位置 变量 其他 测试 运行时 ByRef 是否 参数 | 更新日期: 2023-09-27 18:20:22

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

有没有任何方法可以测试传递给ByRef(即C#中的refout)参数的参数是否与某个"其他"变量具有相同的存储位置?我不想测试对象是否相同,因为两个不同的引用变量可能是对同一对象的两个不同引用。

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

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);

它将湮灭CCD_ 5如果ab的存储位置相等,我有什么方法可以在SillySwap的体内进行测试吗

下面是一个修改后的示例,带有一个字段("类变量"):

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;
}

假设某个陌生人为firstsecond传入相同的变量。我们能在方法中检查一下吗?

在运行时测试传入的ByRef参数是否与给定的“”共享存储位置;其他“;变量

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

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));           
}