【问题标题】:C# ref weird behaviour [duplicate]C# ref 奇怪的行为[重复]
【发布时间】:2022-01-13 18:24:28
【问题描述】:

我最近对 ​​C# refs 有一个奇怪的体验。

请看一下这段代码:

class Program
{
    public static bool testBool = true;
    public static RefClass RefObject;
    public static int X = 0;

    static void Main(string[] args)
    {
        while (true)
        {
            
            if (testBool)
            {
                RefObject = new RefClass(ref X);
                testBool = false;
            }

            X++;
            Thread.Sleep(200);
            Debug.WriteLine(X);
            Debug.WriteLine(RefObject.X);
        }
    }

    public class RefClass
    {
        public int X { get; set; }
        public RefClass(ref int x)
        {
            X = x;
        }
    }
}

我仍然不明白为什么RefObject 的属性X 没有使用变量X 更新。 ref 不应该是对原始变量的引用吗?这意味着XRefObject 的属性)应该只是对静态X 变量的引用,这应该会导致它们相同。

【问题讨论】:

  • 这个想法是,如果您在RefClass 的构造函数中为x 分配了一个新值,您可以观察到它,但您没有观察到。不涉及事后的新分配,并且 RefClass.X 不会永远与您的初始参数相关联。

标签: c# object reference parameter-passing ref


【解决方案1】:

我们来看看构造函数:

public RefClass(ref int x)
{
    X = x;
}

特别是这一行:

X = x;

此时,小写的x 变量ISref 变量。但是,当您将其复制到大写的 X 属性时,您仍然会将其当时的 复制到该属性。 X 属性仍然只是一个常规整数,据我所知,没有办法以您想要的方式声明引用属性。

【讨论】:

  • 这是不可能的,因为它会使 RefClass 持有对其范围之外定义的东西的引用,字面意思是......你会......在路上产生大量的孤立问题。注意 ref 的所有使用是如何沿着代码路径流动的——拥有一个 ref 变量意味着引用将存在于代码路径之外。
  • 谢谢,我只是对解释感到好奇!再次感谢,祝您有美好的一天!
猜你喜欢
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多