如何在C#中使用可选参数?

注意:这个问题是在C#还不支持可选参数的时候提出的(即在C#4之前)。</sup&gt。

我们正在构建一个网络API,它是由C#类编程生成的。这个类有方法GetFooBar(int a, int b),API有方法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
}
评论(2)

来自这个网站。

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)并设置一个默认值。我们的目标是将参数标记为可选参数,而不需要使用诸如在参数名称中加入"可选"这样的笨办法。

评论(4)

你可以使用方法重载...

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)

如果你想使用命名的参数,将需要创建一个类型来处理它们,尽管我认为已经有类似的东西用于网络应用。

评论(0)