C 3 0新特性 linq相關

2021-04-24 08:14:53 字數 3701 閱讀 9721

隱含型別區域性變數

var age = 26;

var username = 

"zhuye";

var userlist = 

new  ;

foreach(

var user in userlist)

console.writeline(user);

純粹給懶人用的var關鍵字,告訴編譯器(對於clr來說,它是不會知道你是否使用了var,苦力是編譯器出的),你自己推斷它的型別吧,我不管了。但是既然讓編譯器推斷型別就必須宣告的時候賦值,而且不能是null值。注意,這只能用於區域性變數,用於欄位是不可以的。

匿名型別

var data = 

new ;

console.writeline(

"username: age:", data.username, data.age);

匿名型別允許開發人員定義行內型別,無須顯式定義型別。常和var配合使用,var用於宣告匿名型別。定義乙個臨時的匿名型別在linq查詢句法中非常常見,我們可以很方便的實現物件的轉換和投影。

擴充套件方法

public static class helper

public static bool in(this object o, ienumerable b)

return false;

}       

}

// 呼叫擴充套件方法

console.writeline(

"123456".md5hash());

console.writeline(

"1".in(new));

很多時候我們需要對clr型別進行一些操作,苦於無法擴充套件clr型別的方法,只能建立一些helper方法,或者生成子類。擴充套件方法使得這些需求得意實現,同時也是實現linq的基礎。定義擴充套件方法需要注意,只能在靜態類中定義並且是靜態方法,如果擴充套件方法名和原有方法名發生衝突,那麼擴充套件方法將失效。

自動屬性

public class person

public int age

public person()

}

person p = 

new person();

//p.username = "aa";

console.writeline(p.username);

意義不是很大,純粹解決機械勞動。編譯器自動為你生成get、set操作以及字段,並且你不能使用欄位也不能自定義get、set操作,不過你可以分別定義get和set的訪問級別。

物件初始化器

public class person

public int age

public override string  tostring()

age:", this.username, this.age);

}

}

person p = 

new person() ;

console.writeline(p.tostring());

編譯器會自動為你做setter操作,使得原本幾行的屬性賦值操作能在一行中完成。這裡需要注意:

l         允許只給一部分屬性賦值,包括internal訪問級別

l         可以結合建構函式一起使用,並且建構函式初始化先於物件初始化器執行

集合初始化器

public class person

public int age

public override string  tostring()

age:", this.username, this.age);

}

}

var persons = 

new list,

new person };

foreach(

var p in persons)

console.writeline(p.tostring());

編譯器會自動為你做集合插入操作。如果你為hashtable初始化的話就相當於使用了兩個物件初始化器。

lambda表示式

var list = 

new  ;

var result = 

array.findall(list, s => (s.indexof("a") > -1));

foreach (

var v in result)

console.writeline(v);

其實和2.0中的匿名方法差不多,都是用於產生內聯方法,只不過lambda表示式的語法更為簡潔。語法如下:

(引數列表) => 表示式或者語句塊

其中:引數個數:可以有多個引數,乙個引數,或者無引數。

表示式或者語句塊:這部分就是我們平常寫函式的實現部分(函式體)。

前面的示例分別是1個引數的例子,下面結合擴充套件方法來乙個複雜的例子:

public delegate int mydg(int a, int b);

public static class lambdatest

}

console.writeline(1.oper(2, (a, b) => a + b));

console.writeline(2.oper(1, (a, b) => a - b));

查詢句法

var persons = 

new list,

new person ,

new person ,

};

var selectperson = 

from p in persons where p.age >= 20 selectp.username.toupper();

foreach(

var p in selectperson)

console.writeline(p);

查詢句法是使用標準的linq查詢運算子來表達查詢時乙個方便的宣告式簡化寫法。該句法能在**裡表達查詢時增進可讀性和簡潔性,讀起來容易,也容易讓人寫對。visual studio 對查詢句法提供了完整的智慧型感應和編譯時檢查支援。編譯器在底層把查詢句法的表示式翻譯成明確的方法呼叫**,**通過新的擴充套件方法和lambda表示式語言特性來實現。上面的查詢句法等價於下面的**:

var selectperson = persons.where(p=>p.age>=20).select(p=>p.username.toupper());

linq查詢句法可以實現90%以上t-sql的功能(由於t-sql是基於二維表的,所以linq的查詢語法會比t-sql更簡單和靈活),但是由於智慧型感應的原因,select不能放在一開始就輸入。

C 3 0 新特性概覽

自從看了scottgu的幾篇文章後就有想讓c 3.0的一些新特性在我的部落格上也留下歷史地一頁。但是由於環境不允許好久都沒有用上.net 3.0,今天終於忍不住地要動一動鍵盤滿足一下自己的慾望,因為我自己的電腦上安裝了.net 3.0 framework sdk。在這裡我總結一下前輩們的研究成果,也...

C 3 0 新特性概覽

1.visual c 3.0 新特性概覽 在發布visual studio 2005和c 2.0之後,微軟公司又馬不停蹄的展示了人們所期望的c 的下一代版本 c 3.0。儘管c 3.0並沒有標準化,微軟還是在pdc 專業程式設計師會議 發布了乙個預覽版本,因此心急的程式設計師可以看到一些所期望的特性...

C 3 0新特性小結 2

c 3.0中除了自動屬性外,還新增 隱含型別區域性變數 local variable type inference 匿名型別 anonymous types 物件與集合初始化器 object and collection initializers 演示例項 測試陣列 public static vo...