C# 4.0 の機能

# オプションのパラメータと名前付き引数

その引数がオプションの引数である場合、呼び出しでその引数を省略できますすべてのオプションの引数には独自のデフォルト値があります値を指定しない場合、デフォルト値を取りますオプションの引数のデフォルト値は

<オール>
  • 一定の表現。
  • 列挙型や構造体などの値型である必要があります。
  • default(valueType) の形式の式でなければなりません
  • パラメータリストの最後に設定する必要があります

    デフォルト値を持つメソッド パラメータ:

    public void ExampleMethod(int required, string optValue = "test", int optNum = 42)
    {
        //...
    }
    
    

    MSDN で述べられているように、名前付き引数、

    パラメーターの名前を関連付けることで、関数に引数を渡すことができます常に認識していないパラメーターの位置を覚えておく必要はありません。呼び出された関数のパラメーター リストでパラメーターの順序を調べる必要はありません。各引数をその名前で。

    名前付き引数:

    // required = 3, optValue = "test", optNum = 4
    ExampleMethod(3, optNum: 4);
    // required = 2, optValue = "foo", optNum = 42
    ExampleMethod(2, optValue: "foo");
    // required = 6, optValue = "bar", optNum = 1
    ExampleMethod(optNum: 1, optValue: "bar", required: 6);
    
    

    名前付き引数の使用に関する制限

    名前付き引数の指定は、すべての固定引数が指定された後に指定する必要があります。

    固定引数の前に名前付き引数を使用すると、次のようなコンパイル時エラーが発生します。

    名前付き引数の指定は、すべての固定引数が指定された後に指定する必要があります

    # 分散

    ジェネリック インターフェイスとデリゲートは、共変としてマークされた型パラメーターを持つことができます または反変 out を使用して そして in キーワードをそれぞれ。これらの宣言は、暗黙的および明示的な型変換、およびコンパイル時と実行時の両方で考慮されます。

    たとえば、既存のインターフェース IEnumerable<T> 共変として再定義されました:

    interface IEnumerable<out T>
    {
        IEnumerator<T> GetEnumerator();
    }
    
    

    既存のインターフェース IComparer は、反変として再定義されました:

    public interface IComparer<in T>
    {
        int Compare(T x, T y);
    }
    
    

    # 動的メンバー検索

    新しい疑似型 dynamic が C# 型システムに導入されました。 System.Object として扱われます 、ただしさらに、メンバー アクセス (メソッド呼び出し、フィールド、プロパティ、またはインデクサー アクセス、またはデリゲート呼び出し) またはそのような型の値に対する演算子の適用は、型チェックなしで許可され、その解決は実行されるまで延期されます。 -時間。これは、ダック タイピングまたはレイト バインディングとして知られています。例:

    // Returns the value of Length property or field of any object
    int GetLength(dynamic obj)
    {
        return obj.Length;
    }
      
    GetLength("Hello, world");        // a string has a Length property,
    GetLength(new int[] { 1, 2, 3 }); // and so does an array,
    GetLength(42);                    // but not an integer - an exception will be thrown
                                      // in GetLength method at run-time
    
    

    この場合、より冗長なリフレクションを回避するために動的タイプが使用されます。内部ではまだリフレクションを使用していますが、キャッシュのおかげで通常は高速です。

    この機能は、主に動的言語との相互運用性を対象としています。

    // Initialize the engine and execute a file
    var runtime = ScriptRuntime.CreateFromConfiguration();
    dynamic globals = runtime.Globals;
    runtime.ExecuteFile("Calc.rb");
    
    // Use Calc type from Ruby
    dynamic calc = globals.Calc.@new();
    calc.valueA = 1337;
    calc.valueB = 666;
    dynamic answer = calc.Calculate();
    
    

    動的型は、ほとんど静的に型付けされたコードにも適用できます。たとえば、ビジター パターンを実装せずに二重ディスパッチを可能にします。

    # COM 使用時のオプションの ref キーワード

    COM インターフェイスによって提供されるメソッドを呼び出す場合、メソッドの呼び出し元の ref キーワードはオプションになりました。署名付きの COM メソッドを指定

    void Increment(ref int x);
    
    

    呼び出しは次のいずれかで記述できるようになりました

    Increment(0); // no need for "ref" or a place holder variable any more