3

メソッドを持つ静的クラスがあります:

public static class FooUtilities
{
   public static FooStruct[] GetFooBar(int foo)
   {
      var fooStruct = new FooStruct[];
      // Connect to SOAP API, collect data to put in fooStruct
      ...
      return fooStruct;
   }
}

ここで、GetFooBar(int foo) の結果を、このメソッドの結果を使用して新しい fooItem アイテムを作成する別のメソッドへの引数として使用したいと考えています。

public static FooItem CreateFooItem(fooResult = GetFooBar(int foo))
{
   var fooItem = new FooItem(fooResult[0].value, fooResult[1].value,fooResult[2].value);
   ...
   return fooItem;
}

私が今やっている方法は、これを書くことです:

public static FooItem CreateFooItem(FooStruct[] fooResult)
{
   var fooItem = new FooItem(fooResult[0].value, fooResult[1].value,fooResult[2].value);
   ...
   return fooItem;
}

これは機能しますが、次のようにメソッドを呼び出す必要があります。

FooItem myItem = FooUtilities.CreateFooItem(FooUtilities.GetFooBar(12321));

私が望むのは、次のように電話できることです:

FooItem myItem = FooUtilities.CreateFooItem();

そして、このメソッドが呼び出されたときに引数を暗黙的に含めます。

これは可能ですか?

4

4 に答える 4

5

あなたはこれを行うことはできません。スペックから:

デフォルト値は、次のタイプの式のいずれかである必要があります。

  • 定数式;

  • new ValType()形式の式。ここで、ValTypeは、列挙型や構造体などの値型です。

  • default(ValType)形式の式。ここで、ValTypeは値型です。

このCreateFooItem(fooResult = GetFooBar(int foo))例を試してみると、上記の短いバージョンである「'fooResult'のデフォルトのパラメーター値はコンパイル時定数でなければなりません」というコンパイラエラーが発生します。

于 2012-11-15T10:26:25.070 に答える
4

いいえ、定数リテラル値として表すことができる値のみを使用できます。ただし、通常はデフォルト値を作成(パラメータが null 非許容の構造体の場合は にnull切り替えます)、デフォルトを手動で適用できます。Nullable<T>

public static FooStruct[] GetFooBar(int? foo = null)
{
   int fooVal = foo ?? SomeMethod({some args here});
   // ... use fooVal from now on
}
于 2012-11-15T10:27:37.493 に答える
2

いいえ、デフォルトのパラメーター値はコンパイル時の定数である必要があります。しかし、これを行うことができます:

public static FooItem CreateFooItem(FooStruct[] fooResult = null)
{
    if(fooResult==null)
    { 
        fooResult = FooUtilities.GetFooBar(12321);
    }
    ...
}

が毎回同じデフォルト値を生成する場合GetFooBar、オプションで、そのデフォルト値を「保存」できます。これにより、ユースケースによってはパフォーマンスが向上する場合があります。

private FooStruct[] defaultValue = null;
public static FooItem CreateFooItem(FooStruct[] fooResult = null)
{
    if(fooResult==null)
    { 
        fooResult = defaultValue ?? defaultValue = FooUtilities.GetFooBar(12321);
    }
    ...
}
于 2012-11-15T10:28:11.727 に答える
2

デフォルトのパラメーター値を指定してそれを行うことはできませんが (@Rawling の回答を参照)、最初のパラメーターを呼び出すゼロパラメーターのオーバーロードを作成できます。

public static FooItem CreateFooItem()
{
    return CreateFooItem(GetFooBar(12321))
}
于 2012-11-15T10:28:58.790 に答える