如何编写看似只读属性的内容?

时间:2013-06-18 17:44:07

标签: c#

在System.Exception基类中,有以下属性(如专业书#5.0中所述):

public virtual string Message { get; }

这看起来像只读属性或没有正文的常规属性。无论哪种方式,我都无法自己复制上述代码。

编辑:

如果这描述了常规属性,编译器会抱怨get没有正文。

3 个答案:

答案 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:您将进入图书所示的行。