-》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集合都是有用的less
<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)
{ui
//能夠訪問當前上下文中的變量
Console.WriteLine(arr.Count);
if (item > 3)
{
return true;
}
return false;
});
Print(arr, d1);
Console.WriteLine("OK");
<1>代碼可讀性更好this
<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>擴展方法太強大了,會影響架構、模式、可讀性等等等等....