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切换到),并手动应用默认值: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 回答