您的位置:首页 > 其它

linq學習筆記1

2013-04-15 21:56 169 查看
學習linq, 必須要掌握的基礎知識

1. 泛型與委託:

  泛型:/article/5901006.html

  委託:delegate是一種類別, 封裝了一些方法,它的內部存儲了方法指針的清單。可以把它當成是一個特殊的class

  使用:

delegate void DelegateA();  //定義一個委託, 相當於定義一個Class
DelegateA  a = new DelegateA(MethodA);  //實例化委託, 相當於實例化一個Class
//MethodA方法的聲明要與委託一致
void MethodA() {...}
//也可以簡化寫法
DelegateA  a =MethodA;


2. 匿名方法:在程式碼的前面使用delegate關鍵字, 這種語法稱為匿名方法

void Repeat10times( Delegate dosomething) {
for (int i =0; i<10;i++) dosomething();
}

void main() {
Repeat10times(delegate {   //匿名方法
console.writeLine("a");
}
}


3. iterator 與 yield: 包含yield關鍵字的方法, 稱為iterator

c#1.0使用foreach 语句可以轻松地迭代集合。在c#1.0中,创建枚举器仍需要做大量的工作。c#2.0添加了yield,讓編譯器自動產生實現了IEnumerator接口的類別, 簡化了我們创建枚举器的工作量.yield在迭代器块中用于向枚举数对象提供值或发出迭代结束信号

yield return 提供了迭代器一个比较重要的功能,即取到一个数据后马上返回该数据,不需要全部数据装入数列完毕,这样有效提高了遍历效率

4. 擴展方法: 必須是 static , public 且必須在 static類中, 且第一個參數前必須加上this關鍵字. 在此不做過多闡釋

5. 一般类型推理

class Demo {
//類型,結構,接口的變量, 不能使用var
var k =0 ;  //錯誤
//參數不能是 var
public void MethodA(var a) {}  //錯誤
//返回值不能是var
public var MethodB() {}  //錯誤
public void MethodC(){
var x; //錯誤, 這裡需要=
var y =null; //錯誤, 無法從null推理出類型
}

}


6.lambda表達式:

C#2.0 可以使用匿名方法, 將delegate當作參數使用。C#3.0新增lambda表達式 可以定義更精準的語法來定義匿名方法。

lambda表達式可以選擇性的延後程式碼的產生,建立一個表達式的樹,可以對此樹的處理, 然後產生真正的程式碼。

當使用特定的程式片段, 就會產生表達式樹

//lambda表達式範例
(int a, int b)=>{return a+b;} //statement body
(int a, int b)=>a+b; //expressionbody
(a, b)=>{return a+b;} //statement body
(a, b)=>a+b //expressionbody
(x)=>sum=+x //expressionbody
x=>sum=+x //expressionbody
()=>sum =+1 //expressionbody


表達式樹是 System.Linq.Expressions.Expression<T>類型的實體, T是此表達式樹所代表的delegate
泛型方法與表達式的區別,泛型方法在編譯期間傳化為IL,表達式是在執行期間轉化為IL。只有具有expression Body 的lambda表達式 才能轉化為表達式樹

表達式樹是表達式在內存中呈現, 需要調用Compile方法傳出一個delegate, 再使用invoke方法來調用此delegate
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: