メソッドにオプションのパラメーターを配置するにはどうすればよいですか?
質問
メソッドでオプションのパラメーターを宣言することは可能ですか?
たとえば、デルファイでは、次のようなことができます:
procedure Test(p1:integer;p2:integer;p3:integer = 2;p4:integer = 4)
その関数を呼び出すとき、4つのパラメーターまたは2つのパラメーターで呼び出すことができます:
Test(2,3); //p3 = 2,p4 = 4.
Test(2,3,4,5); //p3 = 4,p4 = 5;
C#ではどのように可能ですか?
解決
これはC#1〜3では不可能だと思います。しかし、良いニュースは、非常に要求の多い機能であるためです(確かに、見たくない人もいます)。 C#4に追加することにしました。
C#4の構文は次のとおりです。
public static void SayHello(string s = "Hello World!")
{
Console.WriteLine(s);
}
使用法:
SayHello(); // Prints "Hello World!"
SayHello("Hello."); // Prints "Hello."
SayHello(s: "Hello."); // Prints "Hello."
(最後の例では名前付き引数を使用しますが、これは実際には必要ありませんが、オプションのパラメーターが複数ある場合に役立ちます。)
他のヒント
C#4.0 。オプションのパラメーターをサポートするか、標準のオーバーロードメカニズムを使用します。
void Test(int p1, int p2, int p3, int p4)
{ }
void Test(int p1, int p2)
{
Test(p1, p2, 2, 4);
}
C#4.0でも可能ですが、リリースされるまで、メソッドのオーバーロードバージョンを作成することで回避できます。
public void MyMethod( int a, int b, int c )
{
...
}
public void MyMethod( int a, int b)
{
MyMethod(a, b, 4);
}
変数の引数を使用できます
paramsキーワードを使用します。
void paramsExample(params int[] argsRest)
{
if(argsRest.Length == 2) then...
else if(argsRest.Length == 4) then...
else error...
}
using System;
using System.Runtime.InteropServices;
public static void SayHello([Optional][DefaultParameterValue("Hello Universe!")] string s)
{
Console.WriteLine(s);
}
完了! :)
まだできません。 C#4.0の機能。
回避策としてparamsを使用できますが、一部の言語がデフォルトのパラメーターを処理する方法ではなく、連続してしか使用できません。
このようなオーバーロードを使用します
Test(int p1, int p2)
Test(int p1, int p2, int p3)
このようなプライベートメソッドを呼び出せます
Test(int[] ps)
次にデータを処理します。
これを処理する別の方法は、オーバーロード/オプションのパラメーターを使用せず、代わりにメソッドに名前を付けることです-悪いトレードオフのように見えるかもしれませんが、コードはおそらく読みやすくなります。
所属していません StackOverflow