我有一个带有方法的静态类:
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();
在调用此方法时隐式包含参数。
这可能吗?
答案 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))
}