【发布时间】:2018-02-19 09:04:11
【问题描述】:
我想了解更多关于 ref 关键字的工作原理,所以我做了以下实验:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var main = new Main { Property = 1 };
var dependent = new Dependent(main);
void ChangeRef(ref Main Oldmain, Main newMain)
{
Oldmain = newMain;
}
ChangeRef(ref main, new Main { Property = 5 });
Assert.AreEqual(5,dependent.Main.Property);
}
}
public class Main
{
public int Property { get; set; }
}
public class Dependent
{
public Dependent(Main main)
{
Main = main;
}
public Main Main { get; set; }
}
如您所见,我希望能够在保留引用的同时替换 main 引用的对象,但测试失败并且值仍然为 1。有人可以详细说明为什么这不起作用或指出我到可以阅读更多内容的地方?
更新: 就像下面有人回答的那样,但后来被删除了。 如果我通过引用构造函数中的依赖项来传递主对象,为什么它不起作用? 他们不应该都有相同的参考吗?
【问题讨论】:
-
您创建了一个
Main。您创建了一个Dependent并引用了该Main。然后创建一个全新的Main。dependent看不到Main。dependent没有对mainvariable 的引用 - 它对mainvariable 的 object 的引用指向那个时间点。如果您将main变量 指向不同的对象(就像您在此处所做的那样),dependent不会神奇地知道它。 现在,如果ChangeRef没有分配到Oldmain但内部更改了其属性,那么一切都会按您的预期工作。 -
因为都是引用类型。您创建 main 指向内存位置 #1,然后创建dependent.Main 指向相同的内存位置 #1。然后您创建了指向内存位置#2 的新 Main { Property = 5},然后将 main 分配给指向 #2。但是dependent.Main 仍然指向#1。
-
好的,但是有什么方法可以替换依赖对象指向的对象,而无需更改它们的所有属性?
-
Ok, but is there any way that I can replace the object that dependent objects are pointing at without just changing all their properties?号 -
@mjwills 不,它不会工作。我有其他想法,因为我试图解释指向可能令人困惑的内存...谢谢您的指点。