在运行时测试传入的ByRef参数是否与给定的“”共享存储位置;其他“;变量
本文关键字:共享 存储 位置 变量 其他 测试 运行时 ByRef 是否 参数 | 更新日期: 2023-09-27 18:20:22
这个问题更多的是出于好奇而非实际需要。
有没有任何方法可以测试传递给ByRef
(即C#中的ref
或out
)参数的参数是否与某个"其他"变量具有相同的存储位置?我不想测试对象是否相同,因为两个不同的引用变量可能是对同一对象的两个不同引用。
我举了一些例子来解释我的意思。考虑:
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如果a
和b
的存储位置相等,我有什么方法可以在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;
}
假设某个陌生人为first
和second
传入相同的变量。我们能在方法中检查一下吗?
一种方法是使用不安全的代码并比较指向变量的指针:
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));
}