標籤:blog http ar java sp 檔案 art log bs
http://blog.csdn.net/yanghua_kobe/article/details/6685222
在《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#內部類的其他用處。
C#內部類