c#嵌套類的使用


1.基本概念

嵌套類:在一個類中定義另一個類,分為靜態嵌套類(使用少)和非靜態嵌套類(又稱內部類)。

內部類: (1) 在一個類中直接定義類。

2) 在一個方法中定義類。
3) 匿名內部類。

2. 嵌套類的使用

(1)外部類只能夠訪問嵌套類中修飾符為public、internal的字段、方法、屬性。示例如下

public class Animal

{

static void Set_Animal()

{

//編譯正確

Monkey._high = 123;

Monkey._age = 4;

//編譯失敗

Monkey._name = "hoho";

}

private class Monkey

{

private static string _name;

protected string _sex;

internal static int _age;

public static int _high;

public Monkey() { }

public void show()

{ }

}

}



2)嵌套類可以訪問外部類的方法、屬性、字段而不受訪問修飾符的限制

public class Animal

{

private static int _Age;

private string name;

private static void DoSomething()

{

Console.WriteLine(_Age);

}

private void DoStr()

{

monkey.method(this);

}

/*嵌套類 定義*/

class monkey

{

public static void method(Animal a)

{

_Age = 23; //靜態成員

a.name = "test"; //實例成員

}

}

}

3. 嵌套類訪問外部類實例的方法、字段、屬性時候。一般在采取構造函數輸入外部類

public class Animal

{

private string _name;

//*嵌套類 定義*/

class monkey

{

public monkey(Animal a)

{

a._name = "test";

}

}

}

4.繼承類可以再定義一個內嵌類並從繼承父類中嵌套類

public class Animal

{

//*嵌套類 定義*/

protected class monkey

{

public virtual void Method()

{

Console.WriteLine("monkey");

}

}

}

public class S_Animal : Animal

{

class s_monkey :monkey

{

public override void Method()

{

Console.WriteLine("s_monkey");

}

}

}注:因為S_Animal 繼承於Animal ,因此s_monkey可以繼承monkey類,從而獲取重寫父嵌套類的機會。
但是monkey必須是可繼承類及可訪問的(非private 、sealed、static)。
嵌套類可以隨意外部類的任何數據屬性,而外部類訪問嵌套類就只能遵守訪問修飾符。從這個角度看,嵌套類是外部類的補充,
通過嵌套類可以獲取更好的封裝性,增加外部類的可維護性和可讀性。       

從程序結構看,嵌套類在邏輯上更加接近使用類。可以更有效地表示類與類之間的緊密程度。為類管理提供除命名空間外的另一種方法。

5.單例模式(singleton)就采用一種為 延遲加載初始化實例 的方法如下:



public class Animal

{

public Animal(){}

public static Animal Intance

{

get { return monkey._intance; }

}

class monkey

{

public readonly static Animal _intance = new Animal();

}

}注: 延遲加載 嵌套類的靜態構造函數不會隨着外部類的觸發而初始化。因此可以有效地避免創建時候初始化時間,
當需要使用內嵌類的時候,嵌套類才開始初始化才開始初始化。



6.反射內嵌類需要使用"+"而不是我們常使用的"."

namespace AnimalClass

{

public class Animal

{

public class monkey

{

protected void Method()

{

//do something...

}

}

}

} 注://成功

object o1 = System.Activator.CreateInstance("AnimalClass", "AnimalClass.Animal+monkey");

//失敗 拋出System.TypeLoadException 異常

object o2 = System.Activator.CreateInstance("AnimalClass", "AnimalClass.Animal.monkey");


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM