CLR via C 第10章 屬性

2021-10-09 22:11:16 字數 2116 閱讀 3088

1.clr支援的屬性有兩種:無參屬性,這也是我們平常說的屬性;有參屬性,它在不同的程式語言中有不同的稱呼。例如:在c#中有參屬性被稱為索引器,而在vb中被稱為預設屬性。

2.屬性不能作為out或者ref引數傳給方法,而字段可以。

public

class

sometype

set}

static

void

methodwithoutparam

(out

string n)

=> n =

null

;public

static

void

main()

}

3.expandoobject配合dynamic可以動態的插入屬性
using system.dynamic;

dynamic e =

newexpandoobject()

;e.x =6;

e.y =

"six"

;e.z = datetime.now;

// 遍歷

foreach

(var v in

(idictionary<

string

,object

>

)e);value=");

}// 刪除

var d =

(idictionary<

string

,object

>

)e;d.

remove

("x"

);

4.索引器(有參屬性)至少要有乙個引數,並且這些引數(和返回型別)可以是除void之外的任意型別。

5.和無參屬性的set訪問器方法相似,索引器的set訪問器方法同樣包含了乙個隱藏引數,在c#中稱為value。該引數代表想賦給「被索引元素」的新值。

6.clr本身不區分無參屬性和有參屬性。對clr來說,每個屬性都只是型別中定義的一對方法和一些元資料。將this作為表達索引器的語法,這純粹是c#團隊自己的選擇。也正是這個選擇,所以c#只允許在物件的例項上定義索引器。c#不支援定義靜態索引器屬性,雖然clr是支援靜態有參屬性的。

7.編譯器在索引器名稱之前附加get_或者set_字首,從而自動生成這些方法的名稱。由於c#的索引器語法不允許開發人員指定索引器名稱,所以便指定item為預設名稱,因此,編譯器生成的方法名就是get_itemset_item。但是可以通過[indexernameattribute]特性來重新命名這些方法。

using system.runtime.compilerservices;

[indexername

("othername")]

public

bool

this

[int pos]

// 這裡至少定義乙個訪問器方法

}

使用該特性標記後,編譯器將生成名為get_othernameset_othername的方法,而不是get_itemset_item。編譯時,c#編譯器會注意到indexername特性,它告訴編譯器如何對方法和屬性的元資料進行命名。注意,特性本身不會進入程式集的元資料。

system.string中就是使用了該特性

CLR via C 第4章 型別基礎

1.clr最重要的特性之一就是型別安全 在執行時,clr總是知道物件的型別是什麼,呼叫gettype 方法即可知道物件的確切型別。這也就是為什麼gettype 方法是基類object中的非虛方法,因為如果可以重寫gettype 方法,那麼他返回的就不一定是當前的物件型別,違背了型別安全。2.使用 i...

Clr via C 讀書筆記 Cp10屬性

屬性的本質就是方法,只是看起來像字段罷了 就是一般屬性 字段一般要private,然後通過設定訪問方法 訪問器來訪問 屬性是方法語法變種 getset不一定要訪問支援字段 編譯的時候會自動生成對應的方法和對映關係 可以為以後建立複雜一點的屬性做好佔位,隨時更換。作者不喜歡自動屬性 作者甚至不喜歡屬性...

clr via c 引數和屬性

1,可選引數和命名引數 private static void m ref int x int a 5 呼叫方法 m x ref a class program s dt guid x,s,dt,guid static void main string args 結果 x 9,s a,dt 0001...