C# ref 奇怪的行为[重复]
Posted
技术标签:
【中文标题】C# ref 奇怪的行为[重复]【英文标题】:C# ref weird behaviour [duplicate] 【发布时间】: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
不应该是对原始变量的引用吗?这意味着X
(RefObject
的属性)应该只是对静态X
变量的引用,这应该会导致它们相同。
【问题讨论】:
这个想法是,如果您在RefClass
的构造函数中为x
分配了一个新值,您可以观察到它,但您没有观察到。不涉及事后的新分配,并且 RefClass.X 不会永远与您的初始参数相关联。
【参考方案1】:
我们来看看构造函数:
public RefClass(ref int x)
X = x;
特别是这一行:
X = x;
此时,小写的x
变量IS 是ref
变量。但是,当您将其复制到大写的 X
属性时,您仍然会将其当时的 值 复制到该属性。 X
属性仍然只是一个常规整数,据我所知,没有办法以您想要的方式声明引用属性。
【讨论】:
这是不可能的,因为它会使 RefClass 持有对其范围之外定义的东西的引用,字面意思是......你会......在路上产生大量的孤立问题。注意 ref 的所有使用是如何沿着代码路径流动的——拥有一个 ref 变量意味着引用将存在于代码路径之外。 谢谢,我只是对解释感到好奇!再次感谢,祝您有美好的一天!以上是关于C# ref 奇怪的行为[重复]的主要内容,如果未能解决你的问题,请参考以下文章
React Native TextInput ref 导致奇怪的崩溃/锁定
比较 c#、c++ 和 java 的性能(c# 的奇怪行为)