哪一个更好?乍一看,可选参数似乎更好(代码更少,XML文档更少,等等),但为什么大多数MSDN库类使用重载而不是可选参数?

当您 Select 使用可选参数(或重载)时,有什么特殊事项需要注意吗?

推荐答案

在C#4.0中,"可选参数"与"命名参数"结合使用的一个很好的用例是,它为我们提供了一种优雅的方法重载替代方案,在方法重载中,您可以根据参数的数量来重载方法.

例如,假设您希望像foo()foo(1)foo(1,2)foo(1,2, "hello")这样调用/使用方法foo.通过方法重载,您可以实现如下解决方案,

///Base foo method
public void DoFoo(int a, long b, string c)
{
   //Do something
}  

/// Foo with 2 params only
public void DoFoo(int a, long b)
{
    /// ....
    DoFoo(a, b, "Hello");
}

public void DoFoo(int a)
{
    ///....
    DoFoo(a, 23, "Hello");
}

.....

使用C#4.0中的可选参数,您可以实现如下用例,

public void DoFoo(int a = 10, long b = 23, string c = "Hello")

然后你可以使用这样的方法——注意命名参数的使用-

DoFoo(c:"Hello There, John Doe")

此调用将参数a的值取为10,将参数b取为23. 此调用的另一个变体-请注意,您不需要按照参数值在方法签名中出现的顺序设置参数值,命名的参数使参数值显式显示.

DoFoo(c:"hello again", a:100) 

使用命名参数的另一个好处是,它大大增强了可选参数方法的可读性,从而提高了代码维护.

请注意,一个方法在方法重载中定义3个或多个方法时会变得非常冗余.我发现这是将可选参数与命名参数结合使用的一个很好的用例.

.net相关问答推荐

StackExchange.Redis和NRedisStack包有什么不同?

使用CLR将数据从Excel导入SQL Server时出错

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

string.Format 如何处理空值?

编译时禁用 Dll 文化文件夹

如何判断 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

value 的默认参数必须是编译时间常数?

Unity 2.0:如何使用 Resolve 和 ResolverOverride?

我可以从我的应用程序中抛出哪些内置 .NET 异常?

如何以编程方式判断类型是 struct 还是类?

为什么循环引用被认为是有害的?

是什么让 Enum.HasFlag 这么慢?

如何在 C# 中将 HTML 转换为文本?

隐式与显式接口实现

自定义属性的构造函数何时运行?

如何确定字符串是 C# 中的有效 IPv4 还是 IPv6 地址?

SqlBulkCopy 的推荐批量大小是多少?

为什么要使用 C# 类 System.Random 而不是 System.Security.Cryptography.RandomNumberGenerator?

obj 文件夹是为了什么而生成的?