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