自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解讀C#中內(nèi)部類(lèi)的語(yǔ)法結(jié)構(gòu)

開(kāi)發(fā) 后端
文章簡(jiǎn)單介紹了C#中的內(nèi)部類(lèi),C#內(nèi)部類(lèi)能夠使用外部類(lèi)定義的類(lèi)型和靜態(tài)方法,但是不能直接使用外部類(lèi)的實(shí)例方法,本文也結(jié)合實(shí)例分析了C#中內(nèi)部類(lèi)的使用。

最近在看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)!

51CTO推薦閱讀: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)

  1. 外部類(lèi)訪問(wèn)內(nèi)部類(lèi) 例子  
  2.  namespace GameStatistical.Test.InnerClass  
  3.  {  
  4.      public class Person  
  5.      {  
  6.          public class Student  
  7.          {  
  8.              public static int age;  
  9.              internal static int height;  
  10.              private static string sex;  
  11.  
  12.              public virtual void Show()  
  13.             {  
  14.                  Console.WriteLine("年齡:"+age);  
  15.                  Console.WriteLine("身高:"+height);  
  16.              }  
  17.    
  18.              internal void Display()  
  19.             {  
  20.                  Console.WriteLine("internal");  
  21.                 Console.WriteLine("年齡:" + age);  
  22.                  Console.WriteLine("身高:" + height);  
  23.              }  
  24.          }  
  25.    
  26.    
  27.          public void Show()  
  28.          {  
  29.              Student.age = 21;  
  30.              Student.height = 75;  
  31.              Student student = new Student();  
  32.              student.Show();  
  33.          }  
  34.      }  
  35.  } 

該段代碼定義了一個(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)

  1. 內(nèi)部類(lèi)訪問(wèn)外部類(lèi) 例子  
  2.  namespace GameStatistical.Test.InnerClass  
  3.  {  
  4.      public class Person1  
  5.      {  
  6.          private string name;  
  7.    
  8.          public string Name  
  9.          {  
  10.              get { return name; }  
  11.              set { name = value; }  
  12.          }  
  13.          private string sex;  
  14.    
  15.          public string Sex  
  16.          {  
  17.              get { return sex; }  
  18.              set { sex = value; }  
  19.          }  
  20.    
  21.          public void Show1()  
  22.          {  
  23.              Console.WriteLine(this.name + "==>" + this.sex);  
  24.          }  
  25.    
  26.          private static void Show2()  
  27.          {  
  28.              Console.WriteLine("===================>");  
  29.          }  
  30.    
  31.         internal void Show3()  
  32.          {  
  33.              Console.WriteLine(this.name + "==>" + this.sex);  
  34.          }  
  35.    
  36.    
  37.    
  38.          public class Student  
  39.          {  
  40.              public void SetPer(string name, string sex)  
  41.              {  
  42.                  Person1 p = new Person1();  
  43.                  p.name = name;  
  44.                  p.sex = sex;  
  45.    
  46.                  p.Show3();  
  47.                  p.Show1();  
  48.              }  
  49.    
  50.          }  
  51.      }  
  52.  } 

這段代碼同樣定義了一個(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)的繼承

  1. 內(nèi)部類(lèi)繼承例子1  
  2.  namespace GameStatistical.Test.InnerClass  
  3.  {  
  4.      public class Person  
  5.      {  
  6.          public class Student  
  7.          {  
  8.              public static int age;  
  9.              internal static int height;  
  10.              private static string sex;  
  11.    
  12.              public virtual void Show()  
  13.              {  
  14.                  Console.WriteLine("年齡:"+age);  
  15.                  Console.WriteLine("身高:"+height);  
  16.              }  
  17.    
  18.              internal void Display()  
  19.              {  
  20.                  Console.WriteLine("internal");  
  21.                  Console.WriteLine("年齡:" + age);  
  22.                  Console.WriteLine("身高:" + height);  
  23.              }  
  24.          }  
  25.    
  26.    
  27.          public void Show()  
  28.          {  
  29.              Student.age = 21;  
  30.              Student.height = 75;  
  31.              Student student = new Student();  
  32.              student.Show();  
  33.              student.Display();  
  34.          }  
  35.      }  
  36.  } 

內(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è)方法。

  1. 內(nèi)部類(lèi)繼承例子2  
  2.  namespace GameStatistical.Test.InnerClass  
  3.  {  
  4.      public class SubPerson:Person  
  5.      {  
  6.          public class SubStudent : Student  
  7.          {  
  8.              public override void Show()  
  9.              {  
  10.                  base.Show();  
  11.              }  
  12.          }  
  13.      }  
  14.  } 

上面的代碼重寫(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)

  1. Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson+Student");
  2.   

反射普通類(lèi)

  1. Activator.CreateInstance("GameStatistical.Test.InnerClass", "GameStatistical.Test.InnerClass.ReflectionPerson.Student");
  2.   

在實(shí)際操作中,內(nèi)部類(lèi)好像使用的比較少,這里也只是非常簡(jiǎn)單的介紹,作為一個(gè)知識(shí)點(diǎn)總結(jié)起來(lái)。

【編輯推薦】

  1. C#內(nèi)部類(lèi)簡(jiǎn)單分析 
  2. 介紹嵌套類(lèi)和內(nèi)部類(lèi)
  3. Java編程中的內(nèi)部類(lèi) 
責(zé)任編輯:王曉東 來(lái)源: 博客園
相關(guān)推薦

2024-06-26 12:59:29

C#代碼開(kāi)發(fā)

2009-12-09 10:34:54

PHP基本語(yǔ)法結(jié)構(gòu)

2009-08-26 18:00:07

C#內(nèi)部類(lèi)

2010-01-12 09:39:58

C++語(yǔ)言

2010-09-07 10:33:04

CSS

2020-01-15 11:14:21

Java算法排序

2009-06-11 13:08:29

Java內(nèi)部類(lèi)Java編程思想

2015-07-28 10:06:03

C#內(nèi)部實(shí)現(xiàn)剖析

2011-07-21 15:44:33

Java內(nèi)部類(lèi)

2009-08-18 17:17:05

C#局部類(lèi)型

2009-08-19 15:38:59

C#代碼

2020-12-14 10:23:23

Java內(nèi)部類(lèi)外部類(lèi)

2014-03-11 11:35:00

.NETC#

2009-08-27 11:43:31

C#語(yǔ)法

2011-06-09 09:08:00

C#循環(huán)結(jié)構(gòu)

2011-09-21 10:56:31

C#結(jié)構(gòu)

2010-02-05 11:23:01

C++聲明語(yǔ)法

2009-08-27 16:18:47

C#類(lèi)C#結(jié)構(gòu)體

2023-10-19 13:24:00

Java工具

2009-08-18 12:52:33

C#枚舉類(lèi)型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)