我可以使用C#方法的结果(带参数)作为另一个的默认参数吗?

时间:2012-11-15 10:23:59

标签: c# static-methods

我有一个带有方法的静态类:

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 个答案:

答案 0 :(得分:5)

你不能这样做。来自the spec

  

默认值必须是以下类型的表达式之一:

     
      
  • 一个常量表达式;

  •   
  • 新形式ValType()的表达式,其中ValType是值类型,例如枚举或结构;

  •   
  • 表单default(ValType),其中ValType是值类型。

  •   

如果您尝试过CreateFooItem(fooResult = GetFooBar(int foo))示例,则会遇到编译器错误“'fooResult'的默认参数值必须是编译时常量”,这是上述的较短版本。 / p>

答案 1 :(得分:4)

不,您只能使用可表示为常量字面值的值。但是,可以,通常使null成为默认值(如果参数是非可空结构,则切换到Nullable<T>),并手动应用默认值:

public static FooStruct[] GetFooBar(int? foo = null)
{
   int fooVal = foo ?? SomeMethod({some args here});
   // ... use fooVal from now on
}

答案 2 :(得分: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);
    }
    ...
}

答案 3 :(得分:2)

你不能通过指定默认参数值来做到这一点(参见@Rawling的回答),但你可以创建一个调用第一个的零参数重载:

public static FooItem CreateFooItem()
{
    return CreateFooItem(GetFooBar(12321))
}