【轉】編寫高質量代碼改善C#程序的157個建議——建議107:區分靜態類和單例
建議107:區分靜態類和單例
有一種觀點認為:靜態類可以作為單件模式的一種實現方式。事實上,這是不妥當的。按照傳統的觀點來看,單例是一個實例對象。而靜態類並不滿足這一點。靜態類也直接違反面向對象三大特性的兩項:繼承和多態。
無法讓一個靜態類從其它類型繼承的實例如下:
interface ISample { } static class SampleClass:ISample { }
上面代碼編譯直接通不過。同時,已不能讓靜態類作為參數和返回值進行傳遞,如下所示:
static voidSampleMethod(SampleClass sample) { }
這個方法也會導致編譯問題。
從本質上講,在C#中,靜態類不會被認為是一個“真正的對象”。而單例,則不會存在這樣的問題。單例,它是一個實例對象,僅僅因為特殊的要求,它被自己實現為在整個系統中只有一個對象。
轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技
【轉】編寫高質量代碼改善C#程序的157個建議——建議107:區分靜態類和單例
相關推薦
【轉】編寫高質量代碼改善C#程序的157個建議——建議7: 將0值作為枚舉的默認值
enum 整型 沒有 spa day rda alt 編寫 它的 建議7: 將0值作為枚舉的默認值 允許使用的枚舉類型有byte、sbyte、short、ushort、int、uint、long和ulong。應該始終將0值作為枚舉類型的默認值。不過,這樣做不是因為允許使
【轉】編寫高質量代碼改善C#程序的157個建議——建議8: 避免給枚舉類型的元素提供顯式的值
bsp clas val () spa true tel str none 建議8: 避免給枚舉類型的元素提供顯式的值 一般情況下,沒有必要給枚舉類型的元素提供顯式的值。創建枚舉的理由之一,就是為了代替使用實際的數值。不正確地為枚舉類型的元素設定顯式的值,會帶來意想不到
【轉】編寫高質量代碼改善C#程序的157個建議——建議10: 創建對象時需要考慮是否實現比較器
form compareto 最簡 復雜 args 就是 改善 object base 建議10: 創建對象時需要考慮是否實現比較器 有對象的地方就會存在比較,在.NET的世界中也一樣。舉個最簡單的例子,在UI中,有一個10個人的Salary列表。根據排序的需要,列表要
【轉】編寫高質量代碼改善C#程序的157個建議——建議18:foreach不能代替for
aries 不同 針對 一次 help 停止 pre ica tof 建議18:foreach不能代替for 上一個建議中提到了foreach的兩個優點:語法更簡單,默認調用Dispose方法,所有我們強烈建議在實際的代碼編寫中更多的使用foreach。但是,該建議也有
【轉】編寫高質量代碼改善C#程序的157個建議——建議17:多數情況下使用foreach進行循環遍歷
else enume spa 開閉 next str items tro var 建議17:多數情況下使用foreach進行循環遍歷 由於本建議涉及集合的遍歷,所以在開始講解本建議之前,我們不妨來設想一下如何對結合進行遍歷。假設存在一個數組,其遍歷模式可以采用依據索引來
【轉】編寫高質量代碼改善C#程序的157個建議——建議16:元素數量可變的情況下不應使用數組
system sed 維數 優化 高質量 watch 擴展方法 calling 64 bit 建議16:元素數量可變的情況下不應使用數組 在C#中,數組一旦被創建,長度就不能改變。如果我們需要一個動態且可變長度的集合,就應該使用ArrayList或List<T&g
【轉】編寫高質量代碼改善C#程序的157個建議——建議19:使用更有效的對象和集合初始化
color 有效 void ons ron public 類型 通過 esc 建議19:使用更有效的對象和集合初始化 依賴於屬性和FCL 3.5之後的語法規則,現在我們有了更加簡潔有效的對象和集合初始化機制:對象和集合初始化設定項。 對象初始化: class
【轉】編寫高質量代碼改善C#程序的157個建議——建議28:理解延遲求值和主動求值之間的區別
ons ati rgs 理解 問題 效率 sele 而不是 reac 建議28:理解延遲求值和主動求值之間的區別 要理解延遲求值(lazy evaluation)和主動求值(eager evaluation),先看個例子: List<in
【轉】編寫高質量代碼改善C#程序的157個建議——建議30:使用LINQ取代集合中的比較器和叠代器
main tor 命名空間 span line 繼承 new each 類型 建議30:使用LINQ取代集合中的比較器和叠代器 LINQ提供了類似於SQL的語法來實現遍歷、篩選與投影集合的功能。 static void Main(string[] ar
【轉】編寫高質量代碼改善C#程序的157個建議——建議27:在查詢中使用Lambda表達式
with 代碼 esc red 工作 一行 derby 命名空間 any 建議27:在查詢中使用Lambda表達式 LINQ實際上是基於擴展方法和Lambda表達式的。任何LINQ查詢都能通過擴展方法的方式來代替。 var personWithCompanyList
【轉】編寫高質量代碼改善C#程序的157個建議——建議31:在LINQ查詢中避免不必要的叠代
public line linq查詢 接收 string 第一個元素 style 屬性 但是 建議31:在LINQ查詢中避免不必要的叠代 無論是SQL查詢還是LINQ查詢,搜索到結果立刻返回總比搜索完所有的結果再將結果返回的效率要高。 示例代碼: class
【轉】編寫高質量代碼改善C#程序的157個建議——建議38:小心閉包中的陷阱
class對象 輸出 局部變量 als lambda rate 完全 attribute 方法 建議38:小心閉包中的陷阱 先看一下下面的代碼,設想一下輸出的是什麽? static void Main(string[] args) {
【轉】編寫高質量代碼改善C#程序的157個建議——建議35:使用default為泛型類型變量指定初始值
如果 items item 類型變量 color 高質量 使用 per match 建議35:使用default為泛型類型變量指定初始值 有些算法,比如泛型集合List<T>的Find算法,所查找的對象可能會是值類型,也有可能是引用類型。在這種算法內部,我
【轉】編寫高質量代碼改善C#程序的157個建議——建議42:使用泛型參數兼容泛型接口的不可變性
-c out bsp counter nag oid 需求 turn ring 建議42:使用泛型參數兼容泛型接口的不可變性 讓返回值類型返回比聲明的類型派生程度更大的類型,就是“協變”。如: public Employee GetAEmployee(
【轉】編寫高質量代碼改善C#程序的157個建議——建議45:為泛型類型參數指定逆變
str 質量 red 方法的參數 turn test col nbsp 改善 建議45:為泛型類型參數指定逆變 逆變是指方法的參數可以是委托或者泛型接口的參數類型的基類。FCL4.0中支持逆變的常用委托有: Func<int T,out TResult> P
【轉】編寫高質量代碼改善C#程序的157個建議——建議46:顯式釋放資源需繼承接口IDisposable
cep nag pre 回收 如果 win name 實現 每一個 建議46:顯式釋放資源需繼承接口IDisposable C#中的每一個類型都代表一種資源,資源分為兩類: 托管資源:由CLR管理分配和釋放的資源,即從CLR裏new出來的對象。 非托管資源:不受CLR管
【轉】編寫高質量代碼改善C#程序的157個建議——建議44:理解委托中的協變
關鍵字 man 常常 manage count () leg temp res 建議44:理解委托中的協變 委托中的泛型變量天然是部分支持協變的。為什麽是“部分支持協變”?看下面示例: class Program { public del
【轉】編寫高質量代碼改善C#程序的157個建議——建議54:為無用字段標註不可序列化
快捷鍵 語法 文件中 chan 有意 否則 [] strong 還原 建議54:為無用字段標註不可序列化 序列化是指這樣一種技術:把對象轉變成流。相反過程,我們稱為反序列化。在很多場合都需要用到這項技術。 把對象保存到本地,在下次運行程序的時候,恢復這個對象。 把對象
【轉】編寫高質量代碼改善C#程序的157個建議——建議60:重新引發異常時使用Inner Exception
開發 網絡連接 方便 額外 write com ket 捕獲 分布式系 建議60:重新引發異常時使用Inner Exception 當捕獲了某個異常,將其包裝或重新引發異常的時候,如果其中包含了Inner Exception,則有助於程序員分析內部信息,方便代碼調試。
【轉】編寫高質量代碼改善C#程序的157個建議——建議68:從System.Exception或其他常見的基本異常中派生異常
base 信息 crypt 滿足 需要 sys sdn private exc 建議68:從System.Exception或其他常見的基本異常中派生異常 微軟建議:從System.Exception或其他常見基本異常之一派生異常。在Visual Studio中輸入Ex