4.
object and collection initializers(物件和集合初始器)
object initializer(物件初始器),顧名思義就是一種初始化物件的方式,這個「器」並非某個具體的類或者方法。
假設我們有乙個用於個人資訊的資料類,如下所示:
public
class
person
public
intuserage
public
string
username }
這個資料類只用於在記憶體中儲存使用者資訊的用途,那麼如果是以往,我們是這樣初始化它的,首先我們可以生成乙個例項,然後把各個屬性值一一賦給這個例項物件,或者如果這個類的屬性數量不算多,我們也可以提供乙個包含所有屬性的建構函式,這樣我們只要在例項化的時候就可以把預先知道的屬性值賦給這個物件。這是過去的老方法。下面看看
c# 3.0
給我們帶來了新的物件初始器,那麼新在**呢?請看下面一行**:
person person
=new
person ;
在不需要提供任何自定義建構函式的情況下,物件初始器可以讓我們實現在建立類例項的時候就對它進行初始化,可以想象一下物件初始器為我們節省了多少編寫自定義建構函式的工作量。物件初始化器由一系列成員物件組成,其物件必須初始化,用逗號間隔,使用{}封閉。
例如,我把二個
person
加到乙個基於泛型的型別為
person
的personlist
集合中:
ilist
<
person
>
personlist
=new
list
<
person
>
, new
person };
有相同名字和型別的兩個物件初始化器將會產生相同的例項,可以相互賦值
,例如:
person person1
=new
person ;
person person2
=new
person ;
person2
=person1;
除了在初始化類時設定簡單的屬性值外,物件初始化器特性也允許我們設定更複雜的巢狀
(nested)
屬性型別。例如我們可以在上面定義的
person
型別同時擁有乙個屬於
address
型別的叫「
address
public
class
address
public
string
postcode }
然後在person
類中新增位址屬性
,如下:
public
class
person
public
intuserage
public
string
username
private
address useraddress
=new
address();
public
address useraddress
set}}
接下來我們例項化
person
類:person person1
=new
person };
也可以這樣例項化:
person person2
=new
person };
這一次我們初始化時省略了其它
3個屬性,因為物件初始器並不要求開發人員如果使用它就必須一次性對所有屬性進行初始化。
collection initializer(集合初始器):就是在例項化集合類的時候採用的一種新的初始化方式。集合初始化器由一系列集合物件組成,用逗號間隔,使用
{}封閉。集合初始化器可以簡化把幾個物件一起新增到乙個集合,編譯器會自動為你做集合插入操作。例如:
list
<
string
>
weekday
=new
list
<
string
>;
物件與集合初始化器要點:物件初始化器實際上利用了編譯器對物件中對外可見的字段和屬性進行按序賦值。;物件初始化器允許只給一部分屬性賦值,包括
internal
訪問級別;物件初始化器可以結合建構函式一起使用,並且建構函式初始化先於物件初始化器執行;集合初始化器會對初始化器中的元素進行按序呼叫
icollection.add(t)
方法;注意物件初始化器和集合初始化器中成員的可見性和呼叫順序;物件與集合初始化器同樣是一種編譯時技術。
5.
extension methods(擴充套件方法)
擴充套件方法是一種開發人員輕鬆快捷地擴充套件已有型別的方法定義和實現的機制。擴充套件方法能夠向現有型別「新增」方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。
首先,擴充套件方法必須是靜態方法,例如下面的**的是擴充套件
string
型別,使其擁有直接將
string
型別轉換成
decimal
或int
型別的方法,**如下:
public
static
class
extensionmethod
return
number;
} public
static
inttoage(
this
string
age)
return
number;
} }
其呼叫方法如下:
string
strinpurtmoney
=console.readline();
decimal
usermoney
=strinpurtmoney.tomoney();
string
strinpurtage
=console.readline();
intuserage
=strinpurtage.toage();
我們很輕鬆地就為字串增加了兩個可能在實際專案中常常需要用到的方法,同時擴充套件方法還傳承了
c#簡潔高雅的語法傳統。
如上所示,擴充套件方法必須是靜態的,因此
static
關鍵字是少不了的,擴充套件方法只能在非泛型或非巢狀的靜態類中宣告,它是通過關鍵字
this
作為其第乙個引數的修飾符來宣告,它的第乙個引數除了
this
關鍵字以外可以沒有別的修飾符,同時這個引數不能是指標型別。擴充套件方法具備和常規靜態方法一樣的能力。
擴充套件方法要點:
擴充套件方法的本質為將例項方法呼叫在編譯期改變為靜態類中的靜態方法呼叫。事實上,它確實擁有靜態方法所具有的所有功能;擴充套件方法的作用域是整個
namespace
可見的,並且可以通過
using namespace
來匯入其它命名空間中的擴充套件方法;擴充套件方法的優先順序:現有例項方法優先順序最高,其次為最近的
namespace
下的靜態類的靜態方法,最後為較遠的
namespace
下的靜態類的靜態方法;擴充套件方法是一種編譯時技術,注意與反射等執行時技術進行區別,並慎重使用。
C 3 0新特性 linq相關
隱含型別區域性變數 var age 26 var username zhuye var userlist new foreach var user in userlist console.writeline user 純粹給懶人用的var關鍵字,告訴編譯器 對於clr來說,它是不會知道你是否使用了v...
C 3 0中的新特性(1)
1.隱式型別 以前這樣宣告變數 string str hello world 現在可以寫成 var str hello world str仍然被認為是string型別,因為c 編譯器根據初始值可以判斷出來。所以這種寫法要求在宣告變數時必須提供初始值。下面是陣列的寫法 var points new 注...
C 3 0中的新特性(1)
1.隱式型別 以前這樣宣告變數 string str hello world 現在可以寫成 var str hello world str仍然被認為是string型別,因為c 編譯器根據初始值可以判斷出來。所以這種寫法要求在宣告變數時必須提供初始值。下面是陣列的寫法 var points new 注...