首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在运行时测试传入的ByRef参数是否与给定的“其他”变量共享存储位置

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

Stack Overflow用户
提问于 2013-06-30 10:20:01
回答 1查看 118关注 0票数 2

这个问题与其说是出于实际需要,不如说是出于好奇。

有没有办法测试传递给ByRef (即ref或C#中的out )参数的参数是否与“其他”变量具有相同的存储位置?我并不打算测试对象是否相同,因为两个不同的引用变量可能是对同一个对象的两个不同的引用。

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

代码语言:javascript
运行
复制
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工作得很好。但如果你这么说的话

代码语言:javascript
运行
复制
int shared = 42;
SillySwap(ref shared, ref shared);

它将消灭shared。如果SillySwap a b 与存储位置相等,那么是否可以在的体内进行测试?

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

代码语言:javascript
运行
复制
protected static int field;
public static void SillySwap2(ref int arg)
{
  arg = arg + field;
  field = arg - field;
  arg = arg - field;
}

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

最后一个例子是:

代码语言:javascript
运行
复制
static bool SillyTryGetStrings(out string first, out string second)
{
  // the order of assignment may matter here!
  second = "world";
  first = "Hello";

  return true;
}

假设某个奇怪的人为firstsecond传入相同的变量。我们能在方法里面检查一下吗?

EN

回答 1

Stack Overflow用户

发布于 2013-06-30 10:29:30

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

代码语言:javascript
运行
复制
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));           
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17389346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档