C# - 未修改对象引用

时间:2014-10-23 14:43:24

标签: c# oop exception properties reference

我有以下代码:

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

2 个答案:

答案 0 :(得分:4)

  

这应该打印一个带有消息“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");

答案 1 :(得分:0)

  

我没有修改参考对象吗?

不,你不是。

  

当我调用exception.InnerException时,是否有对象的副本返回给我?

不,会向您返回参考的副本。

以下是发生的事情:

Exception inner = exception.InnerException;

inner现在引用 exception.InnerException也引用的对象。

inner = new Exception("3");

inner现在引用不同的对象。 id 执行引用的对象未更改。