首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

CLR 筆記:類型與成員基礎——可見性、靜態類別、部分類別與版本控制

     編輯:關於.NET

1. 類別可見性

  • public:對所有組件可見。
  • internal:僅對所在組件可見。預設為 public。

2. 友元組件

使用 friend assembly 實現單元測試而不需反射。命令列編譯與 VS2005 Solution 設定示例。

3. 成員可存取性

  • 成員預設 private;介面成員皆 public。
  • 衍生類別覆寫成員時,原始與覆寫成員需相同可存取性(C# 約束);CLR 約束:覆寫成員可存取性不能更低。
CLR 術語C# 術語
Privateprivate
Familyprotected
Family and Assembly不支援
Assemblyinternal
Family or Assemblyprotected internal
Publicpublic

4. 靜態類別

  • static 僅用於 class,不可用於 struct(CLR 要求值類型必須實例化且不可控制實例化過程)。
  • C# 約束:直接繼承 System.Object、不可實作介面、僅定義靜態成員、不可作為欄位/方法/參數/區域變數。
  • MSIL 中不產生建構函式,標記為 abstract 和 sealed。

5. 部分類別

CLR 不支援 partial,僅為 C# 語法。故某型別原始碼必須使用同一程式語言。

6. 組件、多型與版本控制

  • .NET 版本號四部份:主/次/內部/修訂。修訂版向後相容;新版本不相容改主/次版本號。
  • 多型中衍生類別覆寫基底虛方法會引起版本控制問題(基底變更版本低於衍生類別導致行為變化)。
  • C# 5 個影響組件版本控制的關鍵字:abstract、virtual/override、sealed、new。

方法呼叫 IL 指令

  • call:呼叫靜態/實例/虛方法。必須指定型別或物件;找不到則檢查基底類別。
  • callvirt:呼叫實例/虛方法(不可用於靜態)。必須指定實例物件;為 null 拋 NullReferenceException(每次呼叫額外 null 檢查,較 call 慢)。

C# 編譯器:實例方法(含虛方法)用 callvirt,靜態方法用 call。其他編譯器不保證,故虛/非虛方法改動未重編譯會產生不可預測問題。

特例

  • ToString 覆寫呼叫 base.ToString() 時用 call(避免 callvirt 導致遞迴堆疊溢位)。
  • 值類型定義的方法用 call(密封無虛方法、永不為 null、避免裝箱效能損失)。

設計建議

  • 盡量少定義虛方法。替代方案:定義多載組,最複雜的方法虛擬化,其餘實用多載非虛擬化。
  • 盡量使用 sealed 密封類別(易改非密封、難逆向;效能快、安全性高)。
  • 衍生類別隱藏基底方法產生警告,用 new 關鍵字消除。

補充

  • 靜態成員在堆上配置,CLR 建立型別物件時同步建立。
  • 實例類別可包含靜態成員。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved