C#内部类
2019獨角獸企業重金招聘Python工程師標準>>>
在《Java編程思想》中花了一章的篇幅介紹,內部類的相關特性。而在C#的書籍中很少有提交內部類的介紹。這篇文章,就簡要介紹一下,C#中的內部類。
我們新建一個測試類文件,定義一個類:OuterClass。在其內部定義一個類:InnerClass1(暫且將其訪問級別設置為public)。
來做幾個簡單測試,截圖如下:
以上在InnerClass1中試圖訪問outerClass的實例變量失敗!
內部類訪問外部類的實例方法同樣失敗!
外部類也無法索引到內部類的實例變量(同樣外部類也無法調用內部類的任何實例方法,即使方法是公有方法)。
這在預料之中:不管innerClass1定義在外部還是在OutClass內部,一個類的非靜態方法和變量都只屬于該類的對象。所以在一個類的外部,必須要通過類的實例來訪問它的非靜態成員。
可以看到內部類和外部類都可以順利得訪問各自的靜態成員,這是因為靜態成員是屬于類本身的,只要能夠訪問類,就可以訪問類的靜態成員。上圖中,由于是在內部類的外部引用內部類的靜態成員,已經出了內部類的定義,所以需要內部類的類名來索引。而內部類訪問外部類的靜態成員時,由于內部類的定義在外部類中,并未出外部類,所以可以直接引用。
上圖僅僅更改了一下,各個成員的訪問級別。就出現了不同的結果。上圖說明,外部類所有訪問級別的靜態成員對內部類始終可見。而內部類中靜態成員的可見性,與普通類一樣,受其定義時的訪問級別控制。需要注意的是,其可見性與內部類【innerClass1】的訪問級別無關。這是因為,從大的層面上來講,innerClass1仍然是outerClass的成員之一,給它定義的訪問級別是針對outerClass外部的,所以innerClass本身對outclass是一直可見的,而innerClass的內部成員卻并不是都對outClass可見,因為outClass相對這些成員來說已經是innerClass的"外部"了。
如果將innerClass定義為public,那么它和普通的類并沒有太大的區別,只是在創建它的時候需要“套”上外部類的名稱罷了。這也是為什么可以將內部類視為外部類的成員的原因。示例如下:
其中,test()為內部類的公有實例方法。
但是,如果將內部類的訪問級別修改為private,就無法在外部索引它了。這不同于普通類(因為普通類不可以被定義為私有的)。但是還是有辦法獲得它的實例,我們可以在外部類中公有方法中,創建一個內部類的實例,并返回其引用:
雖然無法將實例對象的引用賦予一個該類型的變量(因為已經無法獲得內部類的類型了),但是這并不影響去調用它的實例方法。因為outerClass的實例方法:GetInnerClassInstance()拿到了innerclass1對象的引用。
控制這種“非法”訪問的機制可以有幾種:將內部類的構造器設為私有、或者嚴格設置內部類成員的訪問級別。
這里只是粗略地講解一下,C#中普通內部類的成員訪問機制。這當然不是內部類的存在的意義。下面會繼續探討C#內部類的其他用處。
閱讀原文
轉載于:https://my.oschina.net/u/3715907/blog/1579342
總結
- 上一篇: 关于PMP
- 下一篇: Unity引擎与C#脚本简介