C 巢狀類的使用方法及特性

2021-04-15 11:24:31 字數 2244 閱讀 7143

巢狀類(nested class)是在類中定義的類。以下把擁有內嵌類的類稱為外部類。根據《

深入理解巢狀類和內部類》巢狀類分為靜態巢狀類和非靜態巢狀類,其中非靜態巢狀類頁被稱為內部類。 巢狀類在uml中是composite的另外一種**表示形式,表示耦合度更高,並且與外部類更加緊密。

一般類的 訪問修飾符可以定義為預設的internal 或者public,而內嵌類就有比較多的選擇,可以是為protected、internal、public以及預設的private。

內嵌類與外部類的訪問限制

巢狀類可以訪問外部類的方法、屬性、欄位而不管訪問修飾符的限制。如: 

public

class

apublic

void

sayit()

/*巢狀類 定義

*/private

class

nesteda}}

但是外部類只能夠訪問修飾符為public、internal巢狀類的字段、方法、屬性。示例如下:

public

classa/*

巢狀類 定義

*/private

class

nesteda

public

void

method(){}}}

巢狀類訪問外部類例項的方法、字段、屬性時候。一般在採取建構函式輸入外部類。如下:

public

class

a              }}

繼承繼承類,也就是繼承類外部類的類,只能使用父類中巢狀類的public或者internal(同乙個程式集合)方法。但是繼承類可以再定義乙個內嵌類並從繼承父類中巢狀類。如:

public

classa}

}public

class

c : a}}

因為c中a中繼承,因此c_nested可以繼承nested類,從而獲取重寫父巢狀類的機會。但是nested必須是可繼承類及可訪問的(非private 、sealed、static)。

巢狀類可以隨意外部類的任何資料屬性,而外部類訪問巢狀類就只能遵守訪問修飾符。從這個角度看,巢狀類是外部類的補充,通過巢狀類可以獲取更好的封裝性,增加外部類的可維護性和可讀性。       

從程式結構看,巢狀類在邏輯上更加接近使用類。可以更有效地表示類與類之間的緊密程度。為類管理提供除命名空間外的另一種方法。

懶載入巢狀類的靜態建構函式不會隨著外部類的觸發而初始化。因此可以有效地避免建立時候初始化時間,當需要使用內嵌類的時候,巢狀類才開始初始化才開始初始化。

public

class

outside

public

void

sayit()

private

class

nested

public

static

void

run()}}

執行結果

outside o 

=new

outside();

//列印"outside inilizlized"

console.readline();

o.sayit();

//首先列印"nested initilized" 再列印 "nested run"

console.readline();

一般應用這個特性會在一些c#單例模式中找到,而這種模式可以被稱為fully lazy singleton模式。下面是簡單的演示**(singleton模式可以在這裡有更加詳細的解釋):

public

class

singleton

}private

class

nested}

反射反射內嵌類需要使用"+"而不是我們常使用的"." 。如a類在assembly名稱為insideclass中。

namespace

insideclass}}

} 執行//

成功object

o1 =

system.activator.createinstance(

"insideclass", 

"insideclass.a+nested");

//失敗 丟擲system.typeloadexception 異常

object

o2 =

system.activator.createinstance(

"insideclass", 

"insideclass.a.nested");

excel中if的巢狀使用方法

if函式是 excel 中的條件判斷函式,它由條件與兩個返回結果組成,當條件成立時,返回真,否則返回假。if函式中的條件既可以單條件,也可以是多條件 多條件組合有三種方式,一種為多個 if 巢狀,第二種為用 and 或 組合多個條件,第三種為用 or 或 組合多個條件。用 and 或 組合條件是 與...

C 中ArrayList類的使用方法

arraylist元素的新增 using system using system.collections.generic using system.linq using system.text using system.collections 在c 中使用arraylist必須引用collectio...

C 中ArrayList類的使用方法

arraylist元素的新增 using system using system.collections.generic using system.linq using system.text using system.collections 在c 中使用arraylist必須引用collectio...