在 System.Exception 基类中有以下属性(如 pro c# 5.0 书中所述):
public virtual string Message { get; }
这看起来像一个只读属性或没有正文的常规属性。无论哪种方式,我都无法自己复制上述代码。
编辑:
如果这描述了一个常规属性,编译器会抱怨 get 没有正文。
在 System.Exception 基类中有以下属性(如 pro c# 5.0 书中所述):
public virtual string Message { get; }
这看起来像一个只读属性或没有正文的常规属性。无论哪种方式,我都无法自己复制上述代码。
编辑:
如果这描述了一个常规属性,编译器会抱怨 get 没有正文。
如果你定义一个这样的类:
public class YourClass
{
public string MyProperty { get; private set; }
}
它将在外部显示为只能获取。Exception
可能看起来像这样:
public class Exception
{
public Exception(string message)
{
this.Message = message;
}
public string Message { get; private set; }
}
只有 getter 的原因Message
是它不是自动属性。在内部,这就是 Message 的实现方式(取自 .NET 参考源):
[__DynamicallyInvokable]
public virtual string Message
{
[__DynamicallyInvokable] get
{
if (this._message != null)
return this._message;
if (this._className == null)
this._className = this.GetClassName();
return Environment.GetRuntimeResourceString("Exception_WasThrown", new object[1]
{
(object) this._className
});
}
}
内部 Execption 将值写入_message
,最终用户没有对该成员的读取或写入访问权限,但它提供了一个包装器,因此最终用户可以获得对其的只读访问权限。
这本书没有展示属性的实现,Message
而是展示了它的元数据。试图编译这样一行代码是行不通的(正如你所发现的。)
要明白我的意思,请将以下代码弹出到 VS 中:
Exception e; string m = e.Message;
将光标放在Message
属性上,然后按 F12:您将被带到书中显示的行。