2013-06-18 84 views
0

內的System.Exception基類有以下特性(如親書C#5.0解釋):怎麼可能寫出看起來像只讀屬性?

public virtual string Message { get; }

這看起來像一個只讀屬性或常規性質沒有身體。無論哪種方式,我不能自己複製上面的代碼。

編輯:

如果這描述了一個普通的屬性,編譯器抱怨GET沒有主體。

+2

您是如何查看代碼的?如果您使用的是像DotPeek或Reflector這樣的工具,那麼您並不總是得到可編譯的源代碼。 – JMK

+0

出書o_O? –

+0

請包括更多細節。你提到的代碼完全可以工作 – Rohit

回答

4

究其原因,只爲Message一個getter的是,它不是一個自動屬性。內部,這是消息是如何implmented(從.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,但它提供了一個包裝所以最終用戶只能讀取它的訪問權限。

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

本書沒有顯示實施Message財產,而是其。 (如你發現)試圖讓這樣的代碼行編譯將無法正常工作

要明白我的意思,彈出下面的代碼VS:

Exception e; string m = e.Message; 

把光標放在Message財產,然後打F12:你會被帶到圖書展示的那一行。