c#是否有可能获取对象的引用,获取对象本身并对其进行更改,而不是附加到新对象?

c#是否有可能获取对象的引用,获取对象本身并对其进行更改,而不是附加到新对象?,c#,object,reference,assign,C#,Object,Reference,Assign,我只是好奇这样的事情在c#中是否可能发生。我不知道为什么会有人想这样做,但如果能做到这一点,那还是很有趣的 public class Test { public string TestString { private set; get; } public Test(string val) { TestString = val; } } public class IsItPossible { public void IsItPossible()

我只是好奇这样的事情在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");
        }
    }
如果您的意思是“我可以通过更改
b
的值来更改
a
的值以引用不同的对象吗?”那么答案是否定的

重要的是要理解变量的值永远不是对象-始终是值类型值或引用。我喜欢考虑像纸片这样的变量,以及像房子这样的对象

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

var b = a;
这就是创建一张新的纸张(
b
),并将写在纸张
a
上的内容复制到纸张
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
(在方法中)。

我不这么认为,尽管我认为这也不重要。当您创建新对象并将变量指向新对象(堆上的新空间)时,如果没有任何内容引用旧对象(堆上的旧空间),则垃圾收集器将快速将其清除,使您在逻辑上处于与希望实现的状态相同的状态这里你说“/”这将把“b”分配给一个新对象,从技术上讲,你应该说“/”这将把一个新对象分配给“b”`创建一个新对象是条件之一吗?如果不是,b=a;后跟b.TestString=“Changed”“将更改对象的值。虽然你只有一个。@alvaro是的。它想替换对象本身,而不仅仅是它的部分。@CoolCodeBro那么,这是不可能的。C#不允许您更改此类指针是的,a是引用,b是引用。我想得到引用指向的位置,并在c#@CoolCodeBro中更改它:不,
a
是一个变量,
b
是一个变量。他们的价值观是参考。好的,A上面写着房子的地址。B复制a中所写的内容。B和A有相同的房子地址。知道这所房子的地址,我们就不能到房子里去换一下吗。a会写上相同的地址,但现在房子会不同了,因为B告诉了某人地址,他们就把地址换了house@CoolCodeBro:你可以改变里面的东西,但你不能把它换成完全不同的房子。(在您的情况下,
Test
不允许您更改
TestString
属性,例如,这样“房子”的那部分就不能更改。)@是的,这就是我所好奇的。这就是为什么我不可能改变字符串。我不想改变油漆或门的尺寸。我对更换整栋房子很感兴趣。