解讀C#中內(nèi)部類的語法結構
最近在看Java一方面的書籍,看到一個很奇怪的問題,Java類中還可以再定義一個類,這種結構非常特殊!后來才發(fā)現(xiàn),原來C#中也有內(nèi)部類,之前都一直沒有注意過這個語法結構!
51CTO推薦閱讀:C#內(nèi)部類簡單分析
使用內(nèi)部類有這樣幾個好處:
(1)抽象外部類的某一狀態(tài)下的行為,隱藏實現(xiàn),通過修改該內(nèi)的訪問修飾符,可以設置僅有外部類可以訪問該類。
(2)擴展了命名空間,可以將外部類的類名作為內(nèi)部類的一個命名空間(這里只是相當于,但不是真正的命名空間)。
(3)內(nèi)部類可以當作外部類的一個擴展,可以活的更好的封裝。
上面的這些特點胡亂的總結了一下,可能有些詞不達意,下面有些具體例子:
1.內(nèi)部類的定義:
嵌套類:在一個類中定義另外一個類,主要分為靜態(tài)嵌套類和非靜態(tài)嵌套類(又稱之為"內(nèi)部類")。內(nèi)部類的定義結構:
(1)在一個類中直接定義類。
(2)在一個方法中定義類。
(3)匿名內(nèi)部類。
2.外部類訪問內(nèi)部類
- 外部類訪問內(nèi)部類 例子
- namespace GameStatistical.Test.InnerClass
- {
- public class Person
- {
- public class Student
- {
- public static int age;
- internal static int height;
- private static string sex;
- public virtual void Show()
- {
- Console.WriteLine("年齡:"+age);
- Console.WriteLine("身高:"+height);
- }
- internal void Display()
- {
- Console.WriteLine("internal");
- Console.WriteLine("年齡:" + age);
- Console.WriteLine("身高:" + height);
- }
- }
- public void Show()
- {
- Student.age = 21;
- Student.height = 75;
- Student student = new Student();
- student.Show();
- }
- }
- }
該段代碼定義了一個外部類Person 和一個內(nèi)部類Student, 其中內(nèi)部類Student中使用了各種修飾符修飾的變量和方法,從上面的例子可以看出外部類只能夠訪問嵌套類中修飾符為public、internal的字段、方法、屬性。調(diào)用外部類的 Show()方法運行得到如下結果:
#p#
3.內(nèi)部類訪問外部類
- 內(nèi)部類訪問外部類 例子
- namespace GameStatistical.Test.InnerClass
- {
- public class Person1
- {
- private string name;
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
- private string sex;
- public string Sex
- {
- get { return sex; }
- set { sex = value; }
- }
- public void Show1()
- {
- Console.WriteLine(this.name + "==>" + this.sex);
- }
- private static void Show2()
- {
- Console.WriteLine("===================>");
- }
- internal void Show3()
- {
- Console.WriteLine(this.name + "==>" + this.sex);
- }
- public class Student
- {
- public void SetPer(string name, string sex)
- {
- Person1 p = new Person1();
- p.name = name;
- p.sex = sex;
- p.Show3();
- p.Show1();
- }
- }
- }
- }
這段代碼同樣定義了一個外部類Person1 和一個內(nèi)部類Student,內(nèi)部類中的SetPer()調(diào)用了外部類中的方法,寫這段代碼我們可以發(fā)現(xiàn) 嵌套類可以訪問外部類的方法、屬性、字段而不受訪問修飾符的限制
4.內(nèi)部類的繼承
- 內(nèi)部類繼承例子1
- namespace GameStatistical.Test.InnerClass
- {
- public class Person
- {
- public class Student
- {
- public static int age;
- internal static int height;
- private static string sex;
- public virtual void Show()
- {
- Console.WriteLine("年齡:"+age);
- Console.WriteLine("身高:"+height);
- }
- internal void Display()
- {
- Console.WriteLine("internal");
- Console.WriteLine("年齡:" + age);
- Console.WriteLine("身高:" + height);
- }
- }
- public void Show()
- {
- Student.age = 21;
- Student.height = 75;
- Student student = new Student();
- student.Show();
- student.Display();
- }
- }
- }
內(nèi)部類繼承,上面的內(nèi)部類定義了父類,其中public virtual void Show() 使用virtual 修飾,可以用于子類重寫這個方法,看內(nèi)部類繼承子類是否能夠重寫這個方法。
- 內(nèi)部類繼承例子2
- namespace GameStatistical.Test.InnerClass
- {
- public class SubPerson:Person
- {
- public class SubStudent : Student
- {
- public override void Show()
- {
- base.Show();
- }
- }
- }
- }
上面的代碼重寫了Show() 這個方法,說明內(nèi)部類的繼承可以通過
5.反射內(nèi)部類
對于這段代碼,是從其他網(wǎng)站看到的,反射內(nèi)部類我們不能直接通過 "." 操作符直接來操作,而是通過 "+" 操作符。前面也提到過內(nèi)部類也是一種有效的管理命名空間的方法,這里也是普通類和內(nèi)部類的一點區(qū)別:
反射內(nèi)部類
- Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson+Student");
反射普通類
- Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson.Student");
在實際操作中,內(nèi)部類好像使用的比較少,這里也只是非常簡單的介紹,作為一個知識點總結起來。
【編輯推薦】