0

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

public virtual string Message { get; }

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

编辑:

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

4

3 回答 3

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; }
}
于 2013-06-18T17:48:01.707 回答
4

只有 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,最终用户没有对该成员的读取或写入访问权限,但它提供了一个包装器,因此最终用户可以获得对其的只读访问权限。

于 2013-06-18T17:49:47.777 回答
1

这本书没有展示属性的实现Message而是展示了它的元数据。试图编译这样一行代码是行不通的(正如你所发现的。)

要明白我的意思,请将以下代码弹出到 VS 中:

Exception e; string m = e.Message;

将光标放在Message属性上,然后按 F12:您将被带到书中显示的行。

于 2013-06-18T17:50:38.897 回答