巢狀類(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...