標籤:mod method except 標識符 初始化 stream 存在 type one
建議106:為靜態類添加靜態建構函式
靜態類可以擁有構造方法,這就是靜態構造方法。靜態構造方法與執行個體構造方法比較有幾個自己的特點:
- 只被執行一次,且在第一次調用類成員之前被運行時執行。
- 代碼無法調用它,不像執行個體構造方法使用new關鍵字就可以被執行。
- 沒有訪問標識符。
- 不能帶任何參數。
使用靜態構造方法的好處是,可以初始化靜態成員並捕獲在這過程中發生的異常。而使用靜態成員初始化器則不能在類型內部捕獲異常了。查看下面代碼:
static class SampleClass { private static FileStream fileStream = File.Open(@"c:\temp.txt",FileMode.Open); public static void SampleMethod(){} } static void Main(string[] args) { SampleClass.SampleMethod(); Console.ReadKey(); }
如果檔案“c:\temp.txt”不存在,這段代碼將會拋出一個TypeInitializationException。比較理想的做法是,在類型SampleClass的內部對fileStream進行初始化。提供靜態構造器的SampleClass應該如下所示:
static class SampleClass { private static FileStream fileStream; static SampleClass() { try { fileStream = File.Open(@"c:\temp.txt", FileMode.Open); } catch (Exception ex) { Console.WriteLine(ex.Message); //異常處理 } } public static void SampleMethod() { } }
在上面的代碼中,如果類型初始化不成功,會在類型的內部處理完畢,並不會將異常拋給調用者。因為有時候調用者甚至都不知道類型需要初始化什麼內容,所以將初始化失敗的異常處理交給上層是不合理的。
對靜態參考型別的初始化應該使用靜態構造方法。但是,如果一個靜態類只有實值型別的變數,則可以放寬這種限制。
轉自:《編寫高品質代碼改善C#程式的157個建議》陸敏技
【轉】編寫高品質代碼改善C#程式的157個建議——建議106:為靜態類添加靜態建構函式