C#:C#中是否有类似于“Optional”关键字的东西?

4
在C#中是否有类似于VB.net的Optional关键字来标记参数为可选的方式?

3
重载方法和设置/处理默认值是否有问题? - Simon Wilson
Simon所描述的内容在Noldorin的回答中完整呈现。 - Kevin Anderson
8个回答

14

C# 4.0 中会有这个功能。

目前你可以通过重载方法、设置默认值并调用其他方法,或将其设置为可空来实现。

public void DoSomething(int a)
{
   int defaultValue = 1;
   DoSomething(a, defaultValue);
}

public void DoSomething(int a, int b)
{
    // Do something
}
或者
public void DoSomething(int a, int? b)
{
   // Check for b.HasValue and do what you need to do
}

13

在C# 3.0之前,恐怕这是不可能的,至少就其本身而言是如此。 (请参见后面的部分。)

随着C# 4.0的出现,您可以执行以下操作:

void FooMethod(int foo, string bar = "foobar")
{
    Console.WriteLine("{0}, "{1}", foo, bar);
}

任何给定默认值的参数都是必然的可选参数
它可以以下列方式调用:
FooBar(123"); // Outputs: "123, foobar"
FooBar(123, "hello"); // Outputs: "123, hello"
FooBar(123, bar: "hello"); // Outputs: "123, hello"

在早期版本的C#中,您可以通过运算符重载来实现相同的效果。

void FooMethod(int foo)
{
    FooMethod(foo, "foobar");
}

void FooMethod(int foo, string bar)
{
    Console.WriteLine("{0}, {1}", foo, bar);
}

注意
这里很重要的一点是不要混淆哪些缺少对可选参数支持。.NET框架(CLR/CIL语言)已经支持了一段时间(可能一直都有),而VB.NET语言也在使用它。然而,只有在C# 4.0中,C#才特别地使用了这个特性。


你在第一个FooBar(123")缺少了一个引号。 - Kenny Mann
此外,你可以拥有没有函数体的重载构造函数。void FooMethod(Int32 foo) : this(foo, "foobar") { } void FooMethod(Int32 foo, String bar) { /* 在这里设置字段、属性等 */ } - Zack
Zack:我们在谈论方法。这种链接方式只适用于构造函数。 - Noldorin

6
在.NET 4.0版本中可以实现这个功能,而之前的版本则不支持此功能。

6
我想按下踩的按钮,因为这是技术上不正确的。据我所知,所有版本的.NET都支持可选参数,因为CLR/CIL语言支持它们,VB.NET对可选参数的支持就是证据。只有在创建C# 4.0之后,它们才能在C#语言中使用。以前在CIL/VB.NET中编写带有可选参数的方法也没有任何障碍。 - Noldorin

1

你尝试过使用 params 修改符吗?

public void Foo( int i, double d, param string[] values )
{
    foreach( String s in values )
        Bar(s);
}

private Bar( String s )
{
    //do something
}

对于这个定义,以下所有调用都是合法的:

Foo( 1, 3.14 )
Foo( 2, 1.6128 )
Foo( 3, 3.14, "This", "is", "a", "test" );

1

很遗憾,直到C# 4.0才有这个功能。David Hayden在他的博客文章这里中详细介绍了它的工作原理。


1

我相信这将在C# 4.0中实现。请参见this源代码。

现在你能做的最好的事情就是努力而出色地模拟它。:)


0
不,你必须创建多个带有不同参数的对象(函数、过程)。或者更干净地创建一个对象类型作为参数传递,并在函数中具有执行该类型可选逻辑的逻辑。

0

是的,到那时你就只能使用重载了。


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