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时,对象的副本是否返回给我?

C#-未修改对象引用

这应该打印一个带有消息"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确实引用的对象保持不变。