MVC系列隨筆二

-》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>擴展方法太強大了,會影響架構、模式、可讀性等等等等....

相關文章
相關標籤/搜索