標籤:
-》Linq
1.隱式類型 var a=1;var b="哈哈";在不知道類型的情況下使用,IL會根據賦值類判斷類型,不會影響效率。因為IL產生的中間一樣。var 必須賦值。
2.匿名型別 var entity= new {title="我是匿名型別",fun="我很有用"};
把一個對象的屬性copy到匿名對象中,不用顯示指定屬性的名字,原始的屬性名稱字會被copy到匿名對象中。
監視entity會發現它的類型就是Anonymous Type(匿名型別)
不要試圖在建立匿名對象的方法外面訪問它的屬性
在特定的網站,序列化和還原序列化JSON時有用
3.自動屬性
4.對象初始化器 var obj=new Obj{id=GUID.NewGuid(),title="哈哈"}; var arr=List<int>(){1,2,3,4,5};
5.委託
6.泛型
裝箱:實值型別轉換為object類型; 拆箱:Object轉換為實值型別 裝箱操作會導致效能損耗 泛型能解決這個問題
Hashtable Queue Stack等非泛型容器會裝箱,這些容器只能儲存Object類型的資料
List<T>、Dictionary<TKey,TValue>都是泛型
自訂泛型
public static class SomethingFactory<T>
{
public static T InitInstance(T inObj)
{
if(false)
{
return inObj;
}
return default(T);
}
}
泛型約束:public static class SomethingFactory<T> where T:MyObj 只能傳入MyObj類型或MyObj衍生類別
或這樣寫:where T:MyObj,new()約束傳入的類型必須有一個建構函式
泛型的好處
<1>演算法的重用
想想看:list類型的排序演算法,對所有類型的list集合都是有用的
<2>型別安全
<3>提升效能
沒有類型轉化了,一方面保證型別安全,另一方面保證效能提升
<4>可讀性更好
7.泛型委派
委託基本歸為3類:
<1>Predicate泛型委派
var d1=new Predicate<int>(More);
定義:表示定義一組條件並確定指定對象是否符合這些條件的方法
obj 要按照由此委託表示的方法中定義的條件進行比較的對象
T 要比較的對象的類型
返回結果 如果obj 符合由此委託表示的方法中定義的條件,則為true;否則為false
pubic delegate bool Predicate<in T>(T obj);
缺點定義太死,必須有一個傳回值,必須有一個參數
<2>Action泛型委派
可以有0個到16個輸入參數,輸入參數的類型是不確定,但不能有傳回值
var d3 = new Action(noParamNoReturnAction);
var d4 = new Action<int, string>(twoParamNoReturnAction);
注意:角括弧中int和string為方法的輸入參數
static void noParamNoReturnAction()
{
//do what you want
}
static void twoParamNoReturnAction(int a, string b)
{
//do what you want
}
<3>Func泛型委派
彌補Action泛型委派,不能傳回值的不足,規定要有一個傳回值,傳回值的類型也由使用者確定
var d5=new Func<int,string>(oneParamOneReturnFunc);
注意:string 類型(最後一個泛型型別)是方法的傳回值類型
static string oneParamOneReturnFunc(int a)
{
//do what you want
return string.Empty;
}
8.匿名方法
var arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
//var d1 = new moreOrlessDelgate(More);
//var d1 = new Predicate<int>(More);
var d1 = new Predicate<int>(delegate(int item)
{
//可以訪問當前上下文中的變數
Console.WriteLine(arr.Count);
if (item > 3)
{
return true;
}
return false;
});
Print(arr, d1);
Console.WriteLine("OK");
<1>代碼可讀性更好
<2>可以訪問當前上下文中的變數
9.擴充方法
擴充方法是靜態類中的靜態方法
public static class MyClass
{
public static void ExtString(this String val)
{
Console.WriteLine(val);
}
}
var a="aaa";
a.ExtString();
----aaa----
<1>擴充方法必須在一個非嵌套、非泛型的靜態類中定義
<2>擴充方法必須是一個靜態方法
<3>擴充方法至少要有一個參數
<4>第一個參數必須附加this關鍵字作為首碼
<5>第一個參數不能有其他修飾符(比如ref或者out)
<6>第一個參數不能是指標類型
注意事項
<1>跟前面提到的幾個特性一樣,擴充方法只會增加編譯器的工作,不會影響效能(用繼承的方式為一個類型增加特性反而會影響效能)
<2>如果原來的類中有一個方法,跟你的擴充方法一樣(至少用起來是一樣),那麼你的擴充方法獎不會被調用,編譯器也不會提示你
<3>擴充方法太強大了,會影響架構、模式、可讀性等等等等....
MVC系列隨筆二