我能为C#函数的参数或可选参数设置默认值吗?

100

我可以在C#中设置默认参数吗?

在C语言中:

void fun(int i = 1)
{
    printf("%d", i);
}

我们能否给C#中的参数设置默认值?如果可以的话,是否可以避免重载函数?

向现有函数添加一个可选参数总是一种不好的实践。如果你正在处理一个需要引用该类具有函数的项目,并且我们将一个参数更改为可选值,则可能会抛出运行时异常,指出找不到该方法。

这是因为我们认为,如果添加额外的可选值,则在许多地方使用该函数时不需要进行代码更改。

function Add(int a, int b);
这将会以这种方式被调用:
Add(10, 10);

但是如果我们添加一个可选参数,像这样:

function Add(int a, int b, int c = 0);

那么编译器就期望

Add(10, 10, 0);

实际上我们是这样调用的 Add(10, 10),但函数在该类中不可用,会导致运行时异常。

这通常发生在将新参数添加到被许多地方调用的函数时,并不确定每次都会发生。但我建议您重载该函数。

对于具有可选参数的方法,我们始终需要进行重载。此外,如果您正在处理具有多个可选参数的函数,则最好使用参数名称传递值。

function Add(int a, int b, int c = 0);

最好使用以下方式调用此函数。

Add(10, 20, c:30);

1
@Vyas,现在C# 4.0是可以的。 - kbvishnu
可能是如何在C#中使用可选参数?的重复问题。 - nawfal
@nawfal很久以前就问过这个问题,当我使用可选参数时遇到了一些问题。因此,我更新了问题。 - kbvishnu
1
@VeeKayBee没错,但你在那个编辑中有一些问题吗?如果你想表达这个观点,为什么不在相关的帖子中回答呢(甚至可能是这个)? - nawfal
@nawfal 谢谢您的建议。我会将其更新为答案。 - kbvishnu
@VeeKayBee,没错。由于这个问题现在并没有什么不同,我认为它仍然是重复的。 - nawfal
6个回答

92

这正是你在C#中所做的方法,但该功能最初是在.NET 4.0中添加的。


5
可以在.NET 3.5中使用它。 - Marek Kwiendacz
Visual Studio 2010+带有msbuild多目标功能(https://msdn.microsoft.com/en-us/library/vstudio/ee395432(v=vs.100).aspx)。它可以使用`.NET 4.0`的目标包将您的可选参数构建成一堆重载方法。 - dbardakov
内联方法(Func、Action、delegate)怎么样? - EricG

56

是的。请参见命名和可选参数。注意默认值需要是一个常量,所以这是可以的:

public string Foo(string myParam = "default value") // constant, OK
{
}

但这不是。

public void Bar(string myParam = Foo()) // not a constant, not OK
{
}

27

仅在C# 4.0及以上版本中才能实现。

然而,如果你使用早于4.0版本的C#,可以通过使用重载方法来解决这个问题:

public void Func( int i, int j )
{
    Console.WriteLine (String.Format ("i = {0}, j = {1}", i, j));
}

public void Func( int i )
{
    Func (i, 4);
}

public void Func ()
{
    Func (5);
}

(或者,你当然可以升级到C# 4.0)。


6

是的,但您需要使用.NET 3.5和C# 4.0才能获得此功能。

这个MSDN页面提供了更多信息。


1
此功能可从C# 4.0开始使用,它是在Visual Studio 2010中引入的。您可以在.NET 3.5项目中使用它,因此无需将旧项目升级到.NET 4.0。
您只需要使用Visual Studio 2010,但请记住,它应编译为默认语言版本(在项目属性->生成->高级设置中设置)。 此MSDN页面提供有关VS 2010中可选参数的更多信息。

0

这是C# 4.0的一个特性,但在该版本之前,如果不使用函数重载是不可能实现的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接