new:
定義:僅允許在嵌套類聲明時使用,表明類中隱藏了由基類中繼承而來的,與基類中同名的成員。
備注:只能用於嵌套的類,表示對繼承父類同名類型的隱藏。
例子:private class ClassA { }
}
public class ClassB{
public class ClassC{
Form1.ClassA ca = new Form1.ClassA(); //錯誤
ClassB cb = new ClassB(); //正確
}
}
測試總結:可以在任何嵌套類聲明中使用,但其父類的可訪問性不可低於基類,否則報錯:找不到類型或命名空間名稱”A”(是否缺少using指令或程序集引用?)
public
定義:表示不限制對該類的訪問;可以被任意存取
備注:命名空間或編譯單元內的類只有public和internal兩種修飾符。派生類為public類,其基類為protected,internal,private,abstract
例子:internal class ClassA{
//protected class ClassA{
public class ClassB { }
}
}
public class ClassC{
Form1.ClassA ca = new Form1.ClassA();
Form1.ClassA.ClassB cb = new Form1.ClassA.ClassB();
}
測試總結:但是如果public類為嵌套中的類(如ClassB),且其外在類的可訪問性為protected,private,abstract,sealed,則不能訪問(因嵌套類作為外在類的內部成員,在訪問類中不能訪問到),但如果外在類的可訪問性為internal,則可以訪問(因嵌套類作為外在類的內部成員,在訪問類中可以訪問到)。
protected
定義:表示只能從所在類和所在類派生的子類進行訪問
備注:只可以被本類和其繼承子類存取
例子:protected class ClassA {
protected class ClassB { }
ClassB cb = new ClassB(); //正確,在ClassB所在類內訪問
}
//ClassB cb = new ClassB(); //錯誤,不在ClassB所在類內訪問
}
public class ClassC:Form1 {
ClassA ca = new ClassA(); //正確,在ClassA所在類的繼承子類中訪問
//ClassA.ClassB cb = new ClassA.ClassB(); //錯誤,不在ClassB所在類的繼承子類中訪問
}
測試總結:限定的是只有在同一程序集中才可以訪問,可以跨程序集
internal
定義:只有其所在類才能訪問
備注:默認為internal;只可以被本組合體(Assembly)內所有的類存取,組合體是C#語言中類被組合後的邏輯單位和物理單位,其編譯後的文件擴展名往往是“.DLL”或“.EXE”。
例子:internal class ClassA{
internal class ClassB { }
}
//} //錯誤 訪問類不在internal所在類Form1中
public class ClassC{
ClassA ca = new ClassA();
ClassA.ClassB cb = new ClassA.ClassB();
}
} //正確
測試總結:限定得是只有在同一個程序集中才可以訪問,可以跨類。在namespace空間下類默認的修飾符為internal,但當嵌套類作為類的內部成員,則嵌套類默認的修飾符為private
private
定義:只有對包.net中的應用程序或庫才能訪問
備注:只可以被本類所存取。包是由.class文件組成的一個集合,.class文件是可以用java解釋器編譯執行的文件,它也是由java的源文件即.java經編譯而生成的。
例子: private class ClassA {
private class ClassB { }
}
private class ClassC{
ClassA ca = new ClassA(); //正確
//ClassA.ClassB cb = new ClassA.ClassB(); //錯誤
}
測試總結:只能被和private類在同一所在類的類訪問
abstract
定義:抽象類,表示該類只能作為父類被用於繼承,而不能進行對象實例化。抽象類可以包含抽象的成員,但這並非必須。
備注:Abstract不能和new同時用
例子:abstract class A {
public abstract void F();
}
abstract class B : A{
public void G() { }
}
class C : B{
public override void F(){ }
}
測試總結:類繼承時,如果基類的可訪問性比派生類的可訪問性低,則不可以繼承(報錯),
例子:
private class C { }
protected class D :C {}
sealed
定義:密封類,不允許被繼承。同時對一個類作abstract和sealed的修飾是沒有意義的,也是被禁止的。
備注:密封類可以阻止其他程序員在無意中繼承該類,而且密封類可以起到運行時優化的效果。實際上,密封類中不可能有派生類,如果密封類實例中存在虛成員函數,改成員函數可以轉化為非虛的,函數修飾符virtual不再生效。
例子:sealed class A {}
class C : A {}