public class A
{
public int publicI; //public 和private 主要用于定義單個類的成員存取權限
private int privateI;
protected int protectedI;
private void f() //隻要是類A 直接定義的執行個體方法,不管它是公有還是私有的,都可以通路類自身的私有執行個體字段
{
privateI = 100; //OK! 類A 的私有執行個體字段privateI 隻能被自身的執行個體方法所使用
}
}
A a = new A();
a.publicI = 100; //OK!當外界建立一個A 的對象後,隻能通路A 的公有執行個體字段publicI
class Parent
{
public int publicField=0;
private int privateFiled=0;
protected int protectedField=0;
protected void protectedFunc()
{ }
}
class Son:Parent
{
public void ChildFunc()
{
publicField = 100; //正确!子類能通路父類的公有字段
privateFiled = 200; //錯誤!子類不能通路父類的私有字段
protectedField = 300; //正确!子類能通路父類的保護字段
protectedFunc(); //正确!子類能通路父類的保護方法
}
}
當建立子類對象後,外界可以通路子類的公有成員和父類公有成員。通過子類對象通路其父類的所有公有成員,事實上,外界根本分不清楚對象的哪些公有成員來自父類,哪些公有成員來自子類自身。
Son obj = new Son ();
obj.ChildFunc(); //可以調用子類的公有方法
obj.publicField=1000;//可以通路父類的公有字段
程式集(一個DLL 或EXE 檔案)中可以有多個類,如果某個類可被同一程式集中的類通路,但其他程式集中的類不能通路它,則稱此類具有internal 通路性。internal 有點像public,外界類也可以直接通路聲明為internal 的類或類的成員,但這隻局限于同一個程式集内部。
例如類庫項目ClassLibrary1 可以生成一個獨立的程式集(假定項目編譯後生成ClassLibrary1.DLL),其中定義了兩個類A 和B:
namespace ClassLibrary1
{
internal class A
{
internal int InternalI=0;
}
public class B
{
public void f()
{
A a = new A(); //OK!
a. InternalI= 100; //OK!
}
}
}
在程式集ClassLibrary1.DLL 之外,外界隻能建立聲明為public 的類B 的對象,不能建立聲明為internal 的類A 的對象。
internal 是C#的預設可通路性,這就是說,如果程式集中的某個類沒有任何可通路性關鍵字在它前面,則它就是internal 的。但要注意,在類中,如果省略成員的可通路性關鍵,則預設為private 的。