这个问题与其说是出于实际需要,不如说是出于好奇。
有没有办法测试传递给ByRef (即ref或C#中的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);它将消灭shared。如果SillySwap a 和 b 与存储位置相等,那么是否可以在的体内进行测试?
下面是一个带有字段("class变量“)的修改示例:
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传入相同的变量。我们能在方法里面检查一下吗?
发布于 2013-06-30 10:29:30
一种方法是使用不安全代码并比较指向变量的指针:
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));
}https://stackoverflow.com/questions/17389346
复制相似问题