注意:这个问题是在C#还不支持可选参数的时候提出的(即在C#4之前)。</sup>。
我们正在构建一个网络API,它是由C#类编程生成的。这个类有方法GetFooBar(int a, int b),API有方法GetFooBar,接受查询参数如&a=foo &b=bar。
GetFooBar(int a, int b)
GetFooBar
&a=foo &b=bar
该类需要支持可选参数,而C#语言不支持。最好的方法是什么?
在C#中,我通常会使用该方法的多种形式。
void GetFooBar(int a) { int defaultBValue; GetFooBar(a, defaultBValue); } void GetFooBar(int a, int b) { // whatever here }
更新:上面提到的是我用C#2.0做默认值的方式。 我现在所做的项目使用的是C# 4.0,它现在直接支持可选参数。 下面是我刚刚在自己的代码中使用的一个例子。
public EDIDocument ApplyEDIEnvelop(EDIVanInfo sender, EDIVanInfo receiver, EDIDocumentInfo info, EDIDocumentType type = new EDIDocumentType(EDIDocTypes.X12_814), bool Production = false) { // My code is here }
来自这个网站。
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C#确实允许使用[Optional]属性(来自VB,虽然在C#中没有功能)。所以你可以有一个这样的方法。
using System.Runtime.InteropServices; public void Foo(int a, int b, [Optional] int c) { ... }
在我们的API封装器中,我们检测可选参数(ParameterInfo p.IsOptional)并设置一个默认值。我们的目标是将参数标记为可选参数,而不需要使用诸如在参数名称中加入"可选"这样的笨办法。
你可以使用方法重载...
GetFooBar() GetFooBar(int a) GetFooBar(int a, int b)
这取决于方法的签名,我给出的例子中缺少只有"int b"的方法,因为它的签名与"int a"方法相同。
你可以使用Nullable类型...
GetFooBar(int? a, int? b)
然后你可以使用a.HasValue检查,看看是否已经设置了一个参数。
另一个选择是使用'params'参数。
GetFooBar(params object[] args)
如果你想使用命名的参数,将需要创建一个类型来处理它们,尽管我认为已经有类似的东西用于网络应用。
在C#中,我通常会使用该方法的多种形式。
更新:上面提到的是我用C#2.0做默认值的方式。 我现在所做的项目使用的是C# 4.0,它现在直接支持可选参数。 下面是我刚刚在自己的代码中使用的一个例子。
来自这个网站。
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C#确实允许使用[Optional]属性(来自VB,虽然在C#中没有功能)。所以你可以有一个这样的方法。
在我们的API封装器中,我们检测可选参数(ParameterInfo p.IsOptional)并设置一个默认值。我们的目标是将参数标记为可选参数,而不需要使用诸如在参数名称中加入"可选"这样的笨办法。
你可以使用方法重载...
这取决于方法的签名,我给出的例子中缺少只有"int b"的方法,因为它的签名与"int a"方法相同。
你可以使用Nullable类型...
然后你可以使用a.HasValue检查,看看是否已经设置了一个参数。
另一个选择是使用'params'参数。
如果你想使用命名的参数,将需要创建一个类型来处理它们,尽管我认为已经有类似的东西用于网络应用。