《.NET 設計規範》第 4 章:類型設計規範

來源:互聯網
上載者:User

標籤:net   功能   定義類   次方   調用   功能區   指定   沒有   階層   

第 4 章:類型設計規範4.1 類型和命名空間

  要用命名空間把類型組織成一個由相關的功能區所構成的階層中。

  避免非常深的命名空間層次。因為使用者需要經常回找,所以這樣的層次瀏覽起來很困難。

  避免有太多的命名空間。

  避免把為進階方案而設計的類型和為常見編程任務而設計的類型放在同一個命名空間中。

  不要不指定類型的命名空間就定義類型。

  要把那些為基本命名空間提供設計時功能的類型放在帶“.Design”尾碼的命名空間中。

  要把那些為基本命名空間提供自訂許可權的類型放在帶“.Permissions”尾碼的命名空間中。

  要把那些為基本命名空間提供互操作功能的類型放在帶“.Interop”尾碼的命名空間中。

  要把所有位於主要 Interop 組件中的代碼放在帶“.Interop”尾碼的命名空間中。

 

4.2 類和結構之間的選擇

  考慮定義結構而不要定義類 - 如果該類型的執行個體比較小而且聲明周期比較短,或者是經常被內嵌在其它對象中。

  避免定義結構,除非該類型具有以下所有特徵。

    它在邏輯上代表一個獨立的值,與基本類型(int、double 等等)相似;

    它的執行個體的大小小於 16 個位元組;

    它是不可變的;

    它不需要經常被裝箱。

  

4.3 類和介面之間的選擇

  要優先定義類而不是介面

  要用抽象類別而不是用介面來解除契約與實現之間的耦合。

  要定義介面 - 如果需要提供多態階層的實值型別的話。

  考慮通過定義介面來達到與多重繼承相類似的效果。

  

4.4 抽象類別的設計

  不要在抽象類別型中定義公有的或內部受保護的建構函式。

  要為抽象類別定義受保護的建構函式或內部建構函式。

  要為每個抽象類別提供至少一個繼承自該抽象類別的具體類型。

  

4.5 靜態類的設計

  要盡量少用靜態類。

  不要把靜態類當做是雜物箱。

  不要聲明或覆蓋靜態類中的執行個體成員。

  要把靜態類定義為密封的、抽象的,並添加一個私人的執行個體建構函式 - 如果程式設計語言不直接支援靜態類。

  

4.6 介面的設計

  要定義介面 - 如果想讓一組包括實值型別在內的類型支援一些公用的 API。

  考慮定義介面 - 如果想讓已經繼承自其它基類的類型支援該介面提供的功能。

  避免使用記號介面(沒有成員的介面)。

  要為介面提供至少一個實現該介面的類型。

  要為每個介面提供至少一個使用該介面的 API(一個以該介面為參數的方法,或是一個類型為該介面的屬性)。

  不要給已經發行的介面再新增成員。

 

4.7 結構的設計

  不要為結構提供預設的建構函式。

  不要定義可變的實值型別。

  要確保當結構執行個體的所有資料都為 0、false 或 null(如果合適)時,結構仍處於有效狀態。

  要為實值型別實現 IEquatable<T>。

  不要顯式地擴充 System.ValueType,事實上大多數程式設計語言不允許這樣做。

 

4.8 枚舉的設計

  要用枚舉來加強那些表示值的集合的參數、屬性以及傳回值的類型性。

  要優先使用枚舉而不要使用靜態常量。

  不要把枚舉用於開放的集合(比如作業系統的版本、朋友的名字等)。

  不要提供為了今後使用而保留的枚舉值。

  避免顯示地暴露只有一個值的枚舉。

  不要在枚舉中包含 sentinel 值。

  要為簡單枚舉類型提供零值。

  考慮以 Int32 為載體來實現枚舉(大多數程式設計語言的預設選擇),除非下面的任何一條成立。

  要用複數名詞或名詞短語來命名標記枚舉,用單數名詞或名詞短語來命名簡單枚舉。

  不要直接擴充 System.Enum。

  要對標記枚舉使用 System.FlagsAttribute。不要把該修飾屬性用於簡單枚舉。

  要用 2 的冪次方作為標記枚舉的值,這樣就可以使用按位 OR 操作來自由地組合他們。

  考慮為常用的標記組合提供特殊的枚舉值。

  避免讓建立的標記枚舉包含某些無效的組合。

  避免把 0 用作標記枚舉的值,除非該值表示“所有標記都被清除”,而且按下一條規範進行了適當地命名。

  要把標記枚舉的 0 值命名為 None。對標記枚舉來說,該值必須始終表示“所有標記均被清除”。

  考慮給枚舉添加值,儘管要冒一點相容性的風險。

  

4.9 巢狀型別

  要在想讓一個類型能夠訪問外層類型的成員時才使用巢狀型別。

  不要用公用巢狀型別來進行邏輯分組,應該用命名空間來達到這一目的。

  避免公開地暴露巢狀型別。除非是只需在極少數的情況下聲明巢狀型別的變數,比如派生子類時,或者其它需要定製的進階情境中。

  不要使用巢狀型別 - 如果該類型可能會被除了它的外層類型之外的類型引用。

  不要使用嵌套 - 如果需要讓客戶代碼來執行個體化它們。如果某個類型具有公有建構函式,那麼他不應該被嵌套在其它類型中。

  不要把巢狀型別定義為介面的成員,許多程式設計語言不支援這樣做。

 

4.10 類型和組件中繼資料

  要在包含公用類型的程式集中使用 CLSCompliant(true) 修飾屬性。

  要在包含公用類型的程式集中使用 AssemblyVersionAttribute 修飾屬性。

  考慮在程式集版本號碼中使用 <V>、<S>、<B>、<R> 的格式。其中 V 是主要版本號,S 是服務版本號碼,B 是構建號,R 是構建修訂編號。

  要在程式集中使用下面的修飾屬性來提供額外的資訊。

  考慮在程式集中使用 ComVisible(false)。可供 COM 調用的 API 需要特別地設計。

  考慮在程式集這種使用 AssemblyFileVersionAttribute 和 AssemblyCopyrightAttribut,其目的是為了提供與程式集有關的額外資訊。

 

《.NET 設計規範》第 4 章:類型設計規範

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.