2014-04-03 60 views
1

什麼是在下面的任務右側的類層次結構/調用鏈?Encoding.UTF8.GetBytes(「hag」)中的類層次結構/調用鏈是什麼?

byte[] data= Encoding.UTF8.GetBytes("hag"); 

我目前的理解是這樣的:

UTF8是抽象編碼類的靜態屬性。此屬性實例化並返回型 System.Text.UTF8Encoding的對象。此對象有一個名爲GetBytes方法()其是Encoding.GetBytes的重寫版本()。

1)爲上述說法是否正確?

2)如果上述說法是正確的,是共同使用靜態屬性來實例化一個對象? (它是否與工廠方法模式相同)?

+0

您錯過了類型初始化器(又稱靜態構造器)(如果存在)的激活。 –

+0

@BenVoigt:所以你的意思是在編碼的靜態構造函數中,該對象是否已經創建? –

+0

我的意思是當你訪問UTF8屬性時,在屬性getter運行之前,類的靜態構造函數會運行。其中一個或兩個都可能參與創建實例。 –

回答

2

什麼是在下面的任務右側的類層次結構/調用鏈?

它等同於:

Encoding e = Encoding.UTF8; 
byte[] data= e.GetBytes("hag"); 

是上述說法是否正確?

是共同使用靜態屬性來實例化一個對象?

好吧,這不是真的實例對象 - 對象已經存在,你只是使用它的靜態參考。但是,是的,使用靜態屬性來暴露一個有限的可輕鬆分類的類實例是常見的做法。例如,請參閱Color課程。

編輯

我想我明白你的問題好 - 屬性被實例化對象第一次調用getter時。之後,它在隨後的獲取中返回相同的實例

是否相同

它類似於,工廠模式看起來更像

Encoding.GetEncoder("UTF8").GetBytes("hag"); 

工廠模式通常產生單一類型的多個實例工廠方法圖案(儘管一些工廠將重新使用實例)。

+0

那麼對象已經被實例化了嗎? –

+2

在Encoding類中,它在第一次調用屬性時被實例化。在其他類中,它們可以在靜態構造函數中實例化。 –

+1

更多細節或者更確切的說:http://referencesource.microsoft.com/#mscorlib/system/text/encoding.cs#a10eb90a3d884500 – floele

1

對於這樣的問題,你可以查看最近更新的.NET reference source website。搜索「encoding.utf8」(是的,這個工程)產生了source code that shows the actual construction

private static volatile Encoding utf8Encoding; 
public static Encoding UTF8 
{ 
    get 
    { 
     if (utf8Encoding == null) 
      utf8Encoding = new UTF8Encoding(true); 
     return utf8Encoding; 
    } 
} 

它也可能是有趣的是,Encoding.GetEncoding("...")actually returns the UTF8 property,如果你把它wuth「UTF-8」。