C#3.0新機能

6923 ワード

ASPを勉強しています.NET MVCの前に、C#3.0がもたらす新しい文法特性を理解する必要があります.これは特に重要です.MVCプロジェクトでは、C#3.0の新しい特性を利用して開発効率を大幅に向上させると同時に、MVCプロジェクトではC#3.0の新しい特性の姿があちこちに見られるからです.

C#3.0新機能

  • 自動属性
  • 暗黙型var
  • オブジェクトイニシエータとコレクションイニシエータ
  • 匿名クラス
  • 拡張方法
  • Lambda式
  • 自動プロパティ


    この概念は簡単で、私たちを簡略化しました.NETでは、プライベートメンバー+属性のプログラミング方法を手書きで作成します.次の方法で属性を宣言するだけで、コンパイラは必要なメンバー変数を自動的に生成します.
    基本的な使い方:
     public class User
         {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
            public Address Address { get; set; }
         }

    C#3.0の前に、私たちはこのようにして属性を実現しました.
     private int id;
            public int Id
            {
                get
                {
                    return id;
                }
                set
                {
                    id = value;
                }
            }

    暗黙的推定タイプ


    この名前はよく知られていないかもしれませんが、varというキーワードはすべて使用されているはずです.C#でvarを使用してオブジェクトを宣言すると、コンパイラは自動的にその付与文に基づいてこのローカル変数のタイプを推定します.値を割り当てると、この変数のタイプも決定され、変更できません.またvarキーワードは匿名クラスの宣言にも使用されます.
    適用の場合:varの主な用途はLINQクエリの結果を表すことです.この結果は、ObjectQuery<>またはIQueryable<>タイプのオブジェクトであるか、単純なエンティティタイプのオブジェクトである可能性があります.この場合varを使用してこのオブジェクトを宣言すると、多くのコードの書く時間を節約できます.
    var customer = new Customer();

    オブジェクトイニシエータ
    はい.NET2.0でオブジェクトを構築する方法の1つは、リロードされたコンストラクション関数を提供することです.2つは、デフォルトのコンストラクション関数でオブジェクトを生成し、その属性を付与することです.はい.NET3.5/C#3.0では、オブジェクトの初期化をより良い方法で行うことができます.それはオブジェクトイニシエータを使用することです.この特性も匿名クラスの基礎であるため,匿名クラスの前に紹介する.
    基本的な使い方:
      User user = new User { Id = 1, Name = "Zouqj", Age = 26 };

    匿名クラス
    前文の初期化器の紹介があれば、匿名クラスは簡単です.匿名クラスまたは不確定タイプの配列を初期化するには、new{object initializer}またはnew[]{object,...}を使用します.匿名クラスのオブジェクトはvarキーワード宣言を使用する必要があります.サンプルコード:
    var p = new { Id = 1, Name = " Zouqj ", Age = 26 };

    適用する場合:
    select new{object initializer}を直接使用する構文は、LINQクエリの結果を匿名クラスに返すことです.
    Lambda式
    Lambda式の本質は匿名関数であり、Lambda式は数学のλ演算するに基づいて名付けられ、その中のlambda抽象(lambda abstraction)に直接対応し、匿名関数であり、関数名のない関数である.「Lambda式」は、式と文を含む匿名関数であり、委任または式ツリータイプの作成に使用できます.Lambda式の演算子=>は、「goes to」と読みます.=>演算子は、付与演算子(=)と同じ優先度Lambdaの基本形式を有します:(input parameters)=>expressionは、Lambdaに入力パラメータがある場合にのみカッコがオプションです.かっこは必須です.2つ以上の入力パラメータは、カッコに囲まれたカンマで区切られます.(x,y)=>x==yの場合、コンパイラは入力タイプを推定しにくいか、推定できない場合があります.このような場合は、(int x,string s)=>s.Length>xの入力パラメータをカッコで0個指定できます:()=>SomeMethod()最も一般的なシーン:IenumableインタフェースとIqueryableインタフェースのWhere<>(c=>c.Id>3)
    次のルールは、Lambda式の変数範囲に適用されます.取得された変数は、参照変数の依頼が範囲外になるまでゴミとして回収されません.Lambda式に導入された変数は外部メソッドでは見られない.Lambda式では、閉じたメソッドからrefまたはoutパラメータを直接キャプチャできません.Lambda式の戻り文は、閉じたメソッドの戻りをもたらしません.Lambda式には、匿名関数本体の外部または内部にターゲットを置くgoto文、break文、continue文は含まれません.
    例:
      delegate int AddDel(int a,int b); //      
                #region lambda
    
                AddDel fun = delegate(int a, int b) { return a + b; }; //    
                //Console.WriteLine(fun(1, 3));
                //lambda              ,       lambda        
                AddDel funLambda = ( a,  b) => a + b;
                List<string> strs = new List<string>() {     "1","2","3"
                                    };
    
                var temp = strs.FindAll(s => int.Parse(s) > 1);
                foreach (var item in temp)
                {
                    Console.WriteLine(item);
                }
                //Console.WriteLine(funLambda(1,3));
    
                #endregion

    static void Main(string[] args)
            {        
                List<int> nums = new List<int>() { 1,2,3,4,6,9,12};
                //
                List<int> evenNums = nums.FindAll(new Program().GetEvenNum);
                foreach (var item in evenNums)
                {
                    Console.WriteLine(item);
                }

                Console.WriteLine(" lambda ");

                List<int> evenNumLamdas = nums.FindAll(n => n % 2 == 0);
                foreach (var item in evenNumLamdas)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
                //nums.FindAll(
            }

            public bool GetEvenNum(int num)
            {
                if (num % 2 == 0)
                {
                    return true;
                }
                return false;
    }