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_item
和set_item
。但是可以通過[indexernameattribute]
特性來重新命名這些方法。
using system.runtime.compilerservices;
[indexername
("othername")]
public
bool
this
[int pos]
// 這裡至少定義乙個訪問器方法
}
使用該特性標記後,編譯器將生成名為get_othername
和set_othername
的方法,而不是get_item
和set_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...