サーチ…


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

その引数がオプション引数の場合は、引数を省略できます。すべてのオプション引数は、独自のデフォルト値を持ちます。値を指定しない場合は、デフォルト値をとります。オプション引数のデフォルト値は、a

  1. 定数式。
  2. enumやstructなどの値型でなければなりません。
  3. フォームのデフォルト(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);

名前付き引数の使用の制限

名前付き引数の指定は、すべての固定引数が指定された後でなければなりません。

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

ここに画像の説明を入力

名前付き引数の指定は、すべての固定引数が指定された後でなければなりません

分散

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

たとえば、既存のインタフェースIEnumerable<T>は共変であると再定義されています。

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

既存のインタフェースIComparerは、反変的なものとして再定義されています。

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

COMを使用する場合のオプションのキーワードref

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

void Increment(ref int x);

呼び出しは次のように書くことができます。

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

動的メンバー検索

新しい擬似型の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

この場合、より冗長なReflectionを回避するために動的な型が使用されます。それはまだフードの下でReflectionを使用していますが、通常はキャッシングのおかげで早くなります。

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

// 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();

動的型は、静的型付きコードでもアプリケーションを持っています。たとえば、Visitorパターンを実装せずに二重ディスパッチが可能になるなどです。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow