新聞中心
最近在看Java一方面的書(shū)籍,看到一個(gè)很奇怪的問(wèn)題,Java類(lèi)中還可以再定義一個(gè)類(lèi),這種結(jié)構(gòu)非常特殊!后來(lái)才發(fā)現(xiàn),原來(lái)C#中也有內(nèi)部類(lèi),之前都一直沒(méi)有注意過(guò)這個(gè)語(yǔ)法結(jié)構(gòu)!

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)推出漳縣免費(fèi)做網(wǎng)站回饋大家。
推薦閱讀:C#內(nèi)部類(lèi)簡(jiǎn)單分析
使用內(nèi)部類(lèi)有這樣幾個(gè)好處:
(1)抽象外部類(lèi)的某一狀態(tài)下的行為,隱藏實(shí)現(xiàn),通過(guò)修改該內(nèi)的訪問(wèn)修飾符,可以設(shè)置僅有外部類(lèi)可以訪問(wèn)該類(lèi)。
(2)擴(kuò)展了命名空間,可以將外部類(lèi)的類(lèi)名作為內(nèi)部類(lèi)的一個(gè)命名空間(這里只是相當(dāng)于,但不是真正的命名空間)。
(3)內(nèi)部類(lèi)可以當(dāng)作外部類(lèi)的一個(gè)擴(kuò)展,可以活的更好的封裝。
上面的這些特點(diǎn)胡亂的總結(jié)了一下,可能有些詞不達(dá)意,下面有些具體例子:
1.內(nèi)部類(lèi)的定義:
嵌套類(lèi):在一個(gè)類(lèi)中定義另外一個(gè)類(lèi),主要分為靜態(tài)嵌套類(lèi)和非靜態(tài)嵌套類(lèi)(又稱(chēng)之為"內(nèi)部類(lèi)")。內(nèi)部類(lèi)的定義結(jié)構(gòu):
(1)在一個(gè)類(lèi)中直接定義類(lèi)。
(2)在一個(gè)方法中定義類(lèi)。
(3)匿名內(nèi)部類(lèi)。
2.外部類(lèi)訪問(wèn)內(nèi)部類(lèi)
- 外部類(lèi)訪問(wèn)內(nèi)部類(lè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();
- }
- }
- }
該段代碼定義了一個(gè)外部類(lèi)Person 和一個(gè)內(nèi)部類(lèi)Student, 其中內(nèi)部類(lèi)Student中使用了各種修飾符修飾的變量和方法,從上面的例子可以看出外部類(lèi)只能夠訪問(wèn)嵌套類(lèi)中修飾符為public、internal的字段、方法、屬性。調(diào)用外部類(lèi)的 Show()方法運(yùn)行得到如下結(jié)果:
#p#
3.內(nèi)部類(lèi)訪問(wèn)外部類(lèi)
- 內(nèi)部類(lèi)訪問(wèn)外部類(lè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();
- }
- }
- }
- }
這段代碼同樣定義了一個(gè)外部類(lèi)Person1 和一個(gè)內(nèi)部類(lèi)Student,內(nèi)部類(lèi)中的SetPer()調(diào)用了外部類(lèi)中的方法,寫(xiě)這段代碼我們可以發(fā)現(xiàn) 嵌套類(lèi)可以訪問(wèn)外部類(lèi)的方法、屬性、字段而不受訪問(wèn)修飾符的限制
4.內(nèi)部類(lèi)的繼承
- 內(nèi)部類(lè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)部類(lèi)繼承,上面的內(nèi)部類(lèi)定義了父類(lèi),其中public virtual void Show() 使用virtual 修飾,可以用于子類(lèi)重寫(xiě)這個(gè)方法,看內(nèi)部類(lèi)繼承子類(lèi)是否能夠重寫(xiě)這個(gè)方法。
- 內(nèi)部類(lèi)繼承例子2
- namespace GameStatistical.Test.InnerClass
- {
- public class SubPerson:Person
- {
- public class SubStudent : Student
- {
- public override void Show()
- {
- base.Show();
- }
- }
- }
- }
上面的代碼重寫(xiě)了Show() 這個(gè)方法,說(shuō)明內(nèi)部類(lèi)的繼承可以通過(guò)
5.反射內(nèi)部類(lèi)
對(duì)于這段代碼,是從其他網(wǎng)站看到的,反射內(nèi)部類(lèi)我們不能直接通過(guò) "." 操作符直接來(lái)操作,而是通過(guò) "+" 操作符。前面也提到過(guò)內(nèi)部類(lèi)也是一種有效的管理命名空間的方法,這里也是普通類(lèi)和內(nèi)部類(lèi)的一點(diǎn)區(qū)別:
反射內(nèi)部類(lèi)
- Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson+Student");
反射普通類(lèi)
- Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson.Student");
在實(shí)際操作中,內(nèi)部類(lèi)好像使用的比較少,這里也只是非常簡(jiǎn)單的介紹,作為一個(gè)知識(shí)點(diǎn)總結(jié)起來(lái)。
分享標(biāo)題:解讀C#中內(nèi)部類(lèi)的語(yǔ)法結(jié)構(gòu)
URL標(biāo)題:http://m.fisionsoft.com.cn/article/coopipo.html


咨詢(xún)
建站咨詢(xún)
