c# 是否可以获取对象的引用,获取对象本身并对其进行更改,而不是断言到新对象

本文关键字:取对象 获取 断言 新对象 对象 引用 是否 | 更新日期: 2023-09-27 18:32:52

我只是好奇在 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");
        }
    }

c# 是否可以获取对象的引用,获取对象本身并对其进行更改,而不是断言到新对象

如果你的意思是"我可以通过更改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(在方法中(。