1.Class的可見度分為public和internal.
public:在任意assembly中可見,internal:僅在所在Assembly中可見。
如果不做定義,預設為Internal.
2.成員的存取層級
存取層級的定義在C#和CLR中的定義有所不同。
| CLR術語 |
C#術語 |
| Private |
private |
| Family |
protected |
| Family and Assembly |
不支援 |
| Assembly |
internal |
| Family or Assembly |
protected internal |
| Public |
public |
成員預設為Private(私人)。
對於繼承關係的類之間,C#規定繼承類重寫父類方法,存取層級必須一致。而CLR則沒有此限制,只要求重寫方法的存取層級高於虛方法即可。
3.靜態類
Static用來定義靜態類。靜態類通常用來定義一組具有相同使命的方法(或屬性等成員),這些方法當然必須都是靜態,public的。
比如Math, Console等類的使用。
Static只能用於Class,不能用於Struct.
靜態類不能被執行個體化,直接繼承與System.Object.不能實現任何介面;
從MSIL可見,靜態類編譯為IL後,以abstract sealed定義出現。
4.部分類,結構,介面
通常在出現下面情況時,會用到partial關鍵字。
1)多人同時開發時。此時可把一個類,寫在多個檔案中,供多人同時開發。
2)winform, webform的實現機制。當我們拖動控制項時,vs幫我們把自動產生的程式碼放在單獨的檔案中(.desinger.cs),而對於後台編程代碼放在另一個單獨檔案中,單可以看到,他們是屬於一個類的,用Partial標記。
要說明的是,partial只在C#中定義,CLR不知道它的存在。所以同一類型的源碼應該用統一程式設計語言實現。
5.IL指令:Call,Callvirt
可以在類型中定義靜態方法,虛方法,執行個體方法。
當在程式中調用這些方法時,會在IL中調用相應的IL指令。
通常,call指令可以調用靜態方法,虛方法,執行個體方法;callvirt可以調用虛方法和執行個體方法,callvirt調用前會進行為空白性檢查,效能比call要差些。
C#中,靜態方法由call調用,虛方法和執行個體方法由callvirt調用。
Code
using System;
using System.Collections.Generic;
using System.Text;
namespace Demo1
{
public class AccessDemo
{
static void Main()
{
Aclass.f();
Aclass a = new Aclass();
a.f1();
a.f2();
}
}
class Aclass
{
public static void f()
{
}
public void f1()
{
}
public virtual void f2()
{
}
}
}
MSIL:
Code
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] class Demo1.Aclass a)
L_0000: nop
L_0001: call void Demo1.Aclass::f()
L_0006: nop
L_0007: newobj instance void Demo1.Aclass::.ctor()
L_000c: stloc.0
L_000d: ldloc.0
L_000e: callvirt instance void Demo1.Aclass::f1()
L_0013: nop
L_0014: ldloc.0
L_0015: callvirt instance void Demo1.Aclass::f2()
L_001a: nop
L_001b: ret
}