デフォルト パラメータの回避策はありますか? C++では、私は使用します
int foo(int k, bool check = false)
退屈な回避策は、関数をオーバーロードすることです。もっと簡単?(変数を追加して関数の呼び出しをチェックするだけでは方法がありません!!)
ありがとう、サン
デフォルト パラメータの回避策はありますか? C++では、私は使用します
int foo(int k, bool check = false)
退屈な回避策は、関数をオーバーロードすることです。もっと簡単?(変数を追加して関数の呼び出しをチェックするだけでは方法がありません!!)
ありがとう、サン
C# (4.0 より前) は、既定のパラメーターをサポートしていませんでした。C# 4.0 でも、既定のパラメーターは C++ とは少し異なります。これらはメタデータに格納され、既定のパラメーターを使用してアセンブリを参照すると、コードにコンパイルされます。そのため、デフォルト値が将来変更された場合、コードは引き続き OLD デフォルト値を渡し、悪影響を与える可能性があります。そのため、1 つのパラメーターと 2 つのパラメーターを持つオーバーロードされた関数を使用し、既定値を渡す複数のパラメーターを持つ関数を呼び出します。このようなアプローチでは、副作用が最小限に抑えられます。
C#4 でも同じことができます。したがって、これは許可されます:
int foo(int k, bool check = false){
...
}
C#4 では名前付き引数を使用することもできるため、このメソッドをさまざまな方法で呼び出すことができます。
foo(10, true);
foo(10);
foo(k: 10, check: true);
foo(check: true, k: 10);
名前付き引数は、オプションのパラメーターがいくつかあり、そのうちの 1 つだけを指定したい場合や、呼び出し側での読みやすさを向上させる場合に便利です。
C# 4.0 では、デフォルトおよび名前付きパラメーターがサポートされるようになりました。
.Net 2.0 フレームワークをターゲットにしている場合でも、アセンブリが MSBuild 4.0 (VS2010) でビルドされている場合は、アセンブリでオプションのパラメーターを使用できます。
構文はあなたが言ったとおりです:
int foo(int k, bool check = false)
{
}
To elaborate on Denis Mazourick's answer about using default optional parameters in C# 4.0 and how the default values get compiled into the consuming class, try this.
Create a class library with the following code and build it:
public class ClassWithDefaultParameters {
public string Msg { get; set; }
public ClassWithDefaultParameters(string msg = "Hello World") {
Msg = msg;
}
}
public class ClassWithConstructorOverloads {
public string Msg { get; set; }
public ClassWithConstructorOverloads(string msg) {
Msg = msg;
}
public ClassWithConstructorOverloads() : this("Hello World") {}
}
Now create a console application and reference the dll you just built (not the project, but the actual dll). Place this in your code and build the console application.
static void Main() {
var cwdp = new ClassWithDefaultParameters();
var cwco = new ClassWithConstructorOverloads();
Console.WriteLine(cwdp.Msg);
Console.WriteLine(cwco.Msg);
}
When you run the application, the output will be as you expected:
Hello World Hello World
Now open up the class library, and change both "Hello World" in "Hello Europe". Recompile the library and copy the dll to the output folder of the console application. Do not rebuild the console application.
When you run the console application again, the output will be:
Hello World Hello Europe
Probably not what you expected! It's not until you rebuild the console application that both lines will print Hello Europe
.
I didn't know this and I think I won't use the default parameters because of this. What's worse is that Microsoft doesn't mention this on the MSDN page.
簡単な方法はありませんparam
。機能を使用できますが、リスクも伴います。
string.Format()
次のように使用できる場所の例を見てください。
stringA.Format("{0} is {1}", str1, str2)
そうすれば、任意の数のパラメーターを渡すことができますが、それをどのように消費するかは非常に難しく、エラーが発生しやすい可能性があります