3

我只是好奇在 c# 中是否有可能发生这样的事情。我不知道为什么会有人想要这样做,但是如果可以这样做仍然很有趣。:

public class Test
{
    public string TestString { private set; get; }
    public Test(string val) { TestString = val; }
}

    public class IsItPossible
    {
        public void IsItPossible()
        {
            Test a = new Test("original");
            var b = a;
            //instead of assigning be to new object, I want to get where b is pointing and change the original object
            b = new Test("Changed"); // this will assign "b" to a new object", "a" will stay the same. We want to change "a" through "b"
            //now they will point to different things
            b.Equals(a); // will be false
            //what I'm curious about is getting where b is pointing and changing the object itself, not making just b to point to a new object
            //obviously, don't touch a, that's the whole point of this challenge

            b = a;
            //some magic function
            ReplaceOriginalObject(b, new Test("Changed"));
            if (a.TestString == "Changed" && a.Equals(b)) Console.WriteLine("Success");
        }
    }
4

1 回答 1

8

如果您的意思是“我可以通过更改 的值来更改 的值a以引用不同的对象b吗?” 那么答案是否定的。

重要的是要了解变量的值永远不是对象 - 始终是值类型值或引用。我喜欢把变量想象成纸片,把物体想象成房子。

一张纸上可以写有值类型的值(例如数字)或房子的地址。当你写:

var b = a;

这是创建一张新纸 ( b) 并将纸上写的内容复制a到 sheet 上b。此时您可以做两件事:

  • 更改上写的内容b。这不会影响所写的内容,a即使是切向的
  • 去写在上面的地址b,修改房子(例如粉刷前门)。这也不会改变上面写的内容a,但这确实意味着当你访问上面写的地址时,a你会看到变化(因为你要去同一所房子)。

请注意,这是假设“常规”变量 - 如果您使用ref参数,您实际上是在使一个变量成为另一个变量的别名。例如:

Test a = new Test("Original");
ChangeMe(ref a);
Conosole.WriteLine(a.TestString); // Changed

...

static void ChangeMe(ref Test b)
{
    b = new Test("Changed"); // This will change the value of a!
}

在这里,我们实际上有一张纸,上面有名称a(在调用代码中) b(在方法中)。

于 2013-09-26T18:12:30.620 回答