在System.Exception基类中,有以下属性(如专业书#5.0中所述):
public virtual string Message { get; }
这看起来像只读属性或没有正文的常规属性。无论哪种方式,我都无法自己复制上述代码。
编辑:
如果这描述了常规属性,编译器会抱怨get没有正文。
答案 0 :(得分:5)
如果您定义这样的类:
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; }
}
答案 1 :(得分:4)
Message
只有一个getter的原因是它不是一个自动属性。在内部,这就是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
});
}
}
内部执行将值写入_message
,最终用户没有对该成员的读取或写入权限,但它提供了一个包装器,以便最终用户可以只读访问它。
答案 2 :(得分:1)
本书未显示Message
属性的实现,而是显示元数据。试图获得这样一行代码进行编译是行不通的(如你所发现的那样。)
要了解我的意思,请将以下代码弹出到VS中:
Exception e; string m = e.Message;
将光标放在Message
属性上,然后点击F12:您将进入图书所示的行。