C#-未修改对象引用
本文关键字:对象引用 未修改 C#- | 更新日期: 2023-09-27 18:27:31
我有以下代码:
public static void Main() {
Exception exception = new Exception("1", new Exception("2"));
Exception inner = exception.InnerException;
inner = new Exception("3");
Console.WriteLine(exception);
Console.ReadLine();
}
这应该打印一个带有消息"1"
的异常,以及一个具有消息"3"
的内部异常
但是,打印时,内部异常具有消息"2"
。
这怎么会发生?我不是在修改引用对象吗?当我调用exception.InnerException
时,对象的副本是否返回给我?
这应该打印一个带有消息"1"的异常,以及带有消息"3"的内部异常
不应该,因为您根本没有修改exception
变量所引用的对象。相反,您声明了一个变量,并使用exception
:给它一个初始值
Exception inner = exception.InnerException;
这将exception.InnerException
的值(它是一个引用)复制到inner
变量。然后在下一行中,您忽略当前值,只给inner
一个不同的值:
inner = new Exception("3");
这对exception
没有任何改变。inner
的原始值恰好是从exception.InnerException
属性中提取的,这一事实根本不影响将新值分配给inner
。你不妨写下:
Exception inner = new Exception("3");
在构造异常之后,不能更改Exception.InnerException
——InnerException
属性是只读的。即使它是可写属性,您的代码也不会达到您想要的效果。相反,你需要:
// This won't work because InnerException is read-only, but it would *otherwise*
// have worked.
excetion.InnerException = new Exception("3");
我不是在修改引用对象吗?
不,你不是。
是调用异常时返回给我的对象的副本。InnerException?
否,引用的副本将返回给您。
以下是正在发生的事情:
Exception inner = exception.InnerException;
inner
现在引用了exception.InnerException
也引用的对象。
inner = new Exception("3");
inner
现在引用一个不同的对象。id确实引用的对象保持不变。