C# Language
C#4.0の機能
サーチ…
オプションのパラメータと名前付き引数
その引数がオプション引数の場合は、引数を省略できます。すべてのオプション引数は、独自のデフォルト値を持ちます。値を指定しない場合は、デフォルト値をとります。オプション引数のデフォルト値は、a
- 定数式。
- enumやstructなどの値型でなければなりません。
- フォームのデフォルト(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);
}
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パターンを実装せずに二重ディスパッチが可能になるなどです。