1. 程式人生 > >【.Net】 C#訪問修飾符

【.Net】 C#訪問修飾符

一 類的修飾符: 
C#中類的預設修飾符是internal。
1 private 只有對包.NET中的應用程式或庫才能訪問。
2 public 不限制對類的訪問。 
3 protected 只可以被本類和其繼承子類訪問; 

4 internal 只可以被本集合(Assembly)內所有的類存取。集合是C#語言中類被組合後的邏輯單位和物理單位,其編譯後的副檔名往往 是“.DLL”或“.EXE”。 僅為同項目(這裡的專案是隻單獨的專案,而不是整個解決方案)呼叫。

5 protected internal 唯一的一種組合限制修飾符,它只可以被本集合體內所有的類和這些類的繼承子類所存取。(注意:提供的不是internal且protected訪問方式) 

6 abstract 抽象類,表示該類只能作為父類被用於繼承,而不能進行物件例項化。抽象類可以包含抽象的成員,但這並非必須。abstract不能和new同時用。

7 sealed 密封類,阻止該類被繼承。同時對一個類作abstract和sealed的修飾是沒有意義的,也是被禁止的。 

8 new 修飾符只能用於巢狀的類,表示隱藏了由基類繼承來的、與基類中同名的成員和方法。

注:如果不是巢狀的類,名稱空間或編譯單元內的類只有public和internal兩種修飾。 

二 成員訪問修飾符

類成員和結構成員的預設訪問修飾符是private。 
1 private 私有型別成員只能從定義它的型別中訪問。類成員和結構成員預設時為私有。
2 public  公有型別或型別成員能從程式的任何地方訪問。
3 protected 受保護類成員只可以被本類和其繼承子類訪問。(?在外部集合是否可以訪問?)

4 internal 內部受保護類成員只可以被定義它的所在集合(Assembly)內所有的類存取。集合是C#語言中類被組合後的邏輯單位和物理單位,其編譯後的副檔名 往往是“.DLL”或“.EXE”。 僅為同項目呼叫(這裡的專案是指單獨的專案,而不是整個解決方案)。

5 internal protected 唯一的一種組合限制修飾符,它只可以被本集合體內所有的類和這些類的繼承子類所存取。(注意:提供的不是internal且protected訪問方式) 
  
6 override用於成員函式,說明本函式覆蓋父類中的同名函式。呼叫時系統會在整個繼承結構中找到最具體的類並執行此最具體類中的函式,不管當時的物件是儲存在哪一個層次的類物件中。這是錯的,呼叫時會找到本物件型別之前最後被定義的那個函式。

7 new 用於成員函式,說明本函式隱藏父類中的同名函式。從此之後本函式不再處於父類同名函式的繼承結構體系中,就如同在本類中定義了一個全新的不同名函式一樣。

8 virtual 虛方法 用於成員函式,說明本函式可以在子類中被改寫,也可以被隱藏,如果子類中沒有重定義該函式,那就使用父類的函式體。除了靜態方法外,非靜態屬性和非靜態索引器也能宣告為virtual。其他的函式成員不能宣告為virtual,因而也不能被覆蓋。(注意:一個虛方法不能為私有) abstract:抽象方法(C++中的純虛擬函式)必須定義在抽象類中,但抽象類不一定要有抽象方法。一個abstract函式總是一個virtual函式。 其實這也很好理解,抽象方法只有宣告不能有定義,含有抽象方法的類如果可以被例項化無法保證抽象方法的行為,所以必須阻止其例項化。同時抽象方法的意義也就在於在子類中定以實現多型,所以抽象方法必須放在抽象類中,抽象類不可以被例項化。   定義virtual方法後子類同名方法自動為虛方法,不寫virtual也是。
extern 修飾符用於宣告在外部實現的方法。

extern 修飾符的常見用法是在使用 Interop 服務調入非託管程式碼時與 DllImport 特性一起使用(呼叫DDL等)。在這種情況下,還必須將方法宣告為 static,如下示例所示:

[DllImport("avifil32.dll")]

private static extern void AVIFileInit();


10 const 關鍵字宣告的成員叫常量,在應用程式生命期中保持不變的域。必須在編譯期初賦值,可以預設。
常量預設都是靜態的(static),而且編譯器禁止static const這種寫法。

11 readonly用於類成員變數,該變數可以在建構函式內被初始化(只此一次修改機會),從此之後就不可再被修改。readonly可以用static修飾。

12 static readonly 修飾符宣告的成員依然是變數,只不過具有和常量類似的使用方法:通過類進行訪問、初始化後不可以修改。但與常量不同的是這種變數是在執行期初始化。所以我個人認為readonly只是一個在建構函式初始化,之後不可以修改的特殊變數。它與常量是兩回事。

13 static 適用於類成員函式和成員變數,說明本成員是一個類級別的成員,所有物件共享此成員,可以通過類名來訪問。

14 event事件成員,用以觸發某個事件。   15 volatile是變數修飾符。一個變數經volatile修飾後在所有執行緒中必須是同步的;任何執行緒中改變了它的值,所有其他執行緒立即獲取到了相同的值。


注意:不管訪問修飾符是什麼,基類的建構函式和解構函式永遠也不能被派生類繼承。
派生類不能繼承基類的建構函式,但可以通過派生類建構函式中的建構函式初始化器呼叫它們。編譯器自動在沒有顯式定義建構函式初始化器的派生類的建構函式上附加建構函式初始化器(呼叫預設的基類建構函式)。

附加:
1下面是抽象類用法的偽碼: 
abstract class A 

  public abstract void F(); 

abstract class B: A 

  public void G() {} 

class C: B 

  public override void F() 
  { 
    //方法F的實現 
  } 

抽象類A內含一個抽象方法F(),它不能被例項化。類B繼承自類A,其內包含了一個例項方法G(),但並沒有實現抽象方法F(),所以仍然必須宣告為抽象類。類C繼承自類B,實現類抽象方法F(),於是可以進行物件例項化。 

2在C#中有一個規定:編譯器不允許派生類的可訪問性比其基類更高。也就是說,內部類可以繼承於一個公共類,但公共類不能繼承於一個內部類。

合法的:內部類繼承公共類
  public class MyBase
  {
  //class members
  }
  internal class MyClass : MyBase
  {
  //class members
  }
  不合法的:公共類繼承內部類(編譯器會說可訪問性不一致)
  internal class MyBase
  {
  //class members
  }
  public class MyClass : MyBase
  {
  //class members
  }   合法的   from: https://www.cnblogs.com/TonyZhao/p/3481707.html