1. 簡述 private、 protected、 public、 internal 修飾符的訪問權限。
private : 私有成員, 在類的內部才可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
internal: 在同一命名空間內可以訪問。
2、區分internal和protected
C#中 protected internal 和 internal 的區別
http://kudick.blog.163.com/blog/static/1666066320091055414453/ DoDo:
protected: 奶奶有一張銀行卡,媽媽可以用,女兒也可以用,隔壁老趙不可以用(因為老趙跟奶奶沒有繼承關系)
internal: 王總有一張銀行卡,秘書可以用,經理可以用,王總兒子不可以用(因為銀行卡屬於公家財務,只能由公司內部人員【同一個程序集】使用,王總兒子雖然繼承王總,但是他不是公司內部人員,所以也不能公款私用)
PS: 如果各個程序集使用了相同的強命名,那么internal也可以在不同的程序集下使用,就比如上面的internal例子,
王總有一張銀行卡(而且還有一本存折【存折相當於強命名】),同時王總的兒子也有一本存折【一樣的強命名】,那么王總的兒子也可以使用了,隔壁老王也有同樣的存折【強命名】所以他也可以取錢!!
private<protected/internal<public 這個很明顯了。 關鍵是protected和internal的問題。 protected限定的是只有在繼承的子類中才可以訪問,可以跨程序集 internal限定的是只有在同一個程序集中才可以訪問,可以跨類 所以它們是有點交叉的。 當一個CLASS是ITERNAL的時候,要求其所有的成員的限定范圍不能大於internal。 所以,當一個INTERNAL的CLASS寫PROTECTED的時候,就需要兩個限定符了: internal protected 這樣,限定了訪問范圍是:本程序集、繼承的子類。 因此,關系是: private<internal protected<internal/protected<public internal和protected的具體范圍大小就不能准確的界頂了。
3、程序集:
被編譯到同一個dll或exe中的程序就是處於同一個程序集中,在不同的dll或exe文件中的程序就是處於不同的程序集中。
.net中的程序集就是一個編譯器直接生成的dll或可執行的exe文件,包含程序集清單、元數據和MSIL等。是一個或者多個類型定義及資源文件的集合體。
.net中的程序集就是一個編譯器直接生成的dll或可執行的exe文件,包含程序集清單、元數據和MSIL等。是一個或者多個類型定義及資源文件的集合體。
程序集,對於C#程序員來說一定不陌生,不就是VS生成的那些exe,dll么。是的,程序集(.net中exe與dll的區別就是exe有程序接入口,即Main函數)就是.net框架下,可以被CLR加載並運行的一堆數據集(類似java中的jar包,無法脫離虛擬機自己運行)。它們和之前C\C++生成的可執行程序和動態鏈接庫有本質的區別。
說了半天,程序集里到底有什么呢。作為一堆數據集,程序集的數據可以分為:類型元數據,程序元數據,IL代碼,資源。
先說下什么是元數據,元數據一般就是指描述自身的數據。
程序集元數據:包含程序集的版本信息,安全信息,簽名等。
類型元數據:記錄了程序集將引用了哪些類,用戶自定義了哪些類,字段,數據類型等一系列信息(VS的編程助手靠的就是反射獲取類型元數據)。
IL代碼:MSIL,微軟中間語言,微軟跨語言的根基所在,所有的C#代碼都編譯成IL代碼,保存在程序集中,在被CLR加載后,由JIT調用BCL,FTL即時編譯成機器碼來讓CPU運行。
說了半天,程序集里到底有什么呢。作為一堆數據集,程序集的數據可以分為:類型元數據,程序元數據,IL代碼,資源。
先說下什么是元數據,元數據一般就是指描述自身的數據。
程序集元數據:包含程序集的版本信息,安全信息,簽名等。
類型元數據:記錄了程序集將引用了哪些類,用戶自定義了哪些類,字段,數據類型等一系列信息(VS的編程助手靠的就是反射獲取類型元數據)。
IL代碼:MSIL,微軟中間語言,微軟跨語言的根基所在,所有的C#代碼都編譯成IL代碼,保存在程序集中,在被CLR加載后,由JIT調用BCL,FTL即時編譯成機器碼來讓CPU運行。