C#內部類

來源:互聯網
上載者:User

標籤: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#內部類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.