Luk*_*ina 24 c# coding-style overloading optional-parameters
由于C#添加了可选参数,因此使用可选参数或方法重载被认为是更好的做法,或者是否存在您希望使用其中一个的特定情况.即具有许多参数的函数更适合w /可选参数?
Chu*_*way 20
可选参数很好,但应该在有意义的时候使用.可选参数通常会使方法的意图变得混乱 - 如果有另一种选择,我会倾向于替代方案.
可选参数和命名参数的部分需求是因为COM允许可选参数和名称参数:
MSDN
一些API,尤其是COM接口,例如Office自动化API,是专门针对命名和可选参数编写的.到目前为止,从C#调用这些API非常痛苦,有时需要显式传递多达30个参数,其中大多数具有合理的默认值并且可以省略.
来自forums.asp.net的SomeNewKid简明扼要地说:
http://forums.asp.net/t/386604.aspx/1
...重载方法通常优于可选参数.为什么?保持每个方法的目的明确.也就是说,每种方法都应该做好一件事.一旦引入可选参数,就会稀释该方法的清洁度,并引入可能最好远离方法的分支逻辑.当您开始使用继承时,这种目的明确性变得更加重要.如果覆盖具有一个或多个可选参数的方法,则它们将变得更难以使用.所以,我建议除了快速和脏类之外的其他任何东西,你可以使用重载优先于可选参数.
请记住,可选参数是语法糖:
反射器C#:
public class Class1
{
// Methods
public Class1()
{
this.Method1("3", "23");
}
public void Method1(string one, [Optional, DefaultParameterValue("23")] string two)
{
}
}
Run Code Online (Sandbox Code Playgroud)
IL:
.class public auto ansi beforefieldinit Class1
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: nop
L_0007: nop
L_0008: ldarg.0
L_0009: ldstr "3"
L_000e: ldstr "23"
L_0013: call instance void WebApplication1.Class1::Method1(string, string)
L_0018: nop
L_0019: nop
L_001a: ret
}
.method public hidebysig instance void Method1(string one, [opt] string two) cil managed
{
.param [2] = string('23')
.maxstack 8
L_0000: nop
L_0001: ret
}
}
Run Code Online (Sandbox Code Playgroud)
Ror*_*eod 11
Visual Studio和FxCop中的代码分析建议您不要在公共API中使用可选参数(规则CA1026:不应使用默认参数).给出的理由是并非所有.NET语言都支持它们.
我认为避免它们的一个更好的理由是,如果在API的2.0版本中添加更多重载,它们可能会引入运行时或编译时问题.Phil Haack在这里解释道.
我将采用Phil的结论:可选参数旨在支持COM互操作; 如果你不使用COM,请不要管它们.
hem*_*emp 10
我不确定这是否有规范的答案 - 它是主观的,逐案的.但是,在我看来,可选参数创建了更明确的API,因此,我通常更喜欢它们而不是方法重载.
具体来说,在使用Intellisense时,我更喜欢看到这个:

在此:



如果我没有指定,我可能需要猜测(或查找文档)param1和param2的值.