C#可选参数或方法重载?

由于C#添加了可选参数,因此使用可选参数或方法重载被认为是更好的做法,或者是否存在您希望使用其中一个的特定情况。 即具有许多参数的函数更适合w /可选参数?

Visual Studio和FxCop中的代码分析建议您不要在公共API中使用可选参数(规则CA1026:不应使用默认参数 )。 给出的理由是并非所有.NET语言都支持它们。

我认为避免它们的一个更好的理由是,如果在API的2.0版本中添加更多重载,它们可能会引入运行时或编译时问题。 Phil Haack在这里解释道 。

我将采用Phil的结论:可选参数旨在支持COM互操作; 如果你不使用COM,请不要管它们。

我不确定这是否有规范的答案 – 这是主观的,逐案的。 但是,在我看来,可选参数创建了更明确的API,因此,我通常更喜欢它们而不是方法重载。

具体来说,在使用Intellisense时,我更喜欢看到这个:

带有默认值的可选参数

在此:

超载1

超载2

超载3

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

可选参数旨在促进COM对象交互,因为COM对象使用大量可选参数。 因此,如果您正在进行P / Invoke或COM对象,则首选可选参数。 否则,方法重载是正确的方法,因为它可以节省大量的混淆。

我没有重载或命名可选参数,而是非常喜欢对象初始化器。 您在类中所需要的只是无参数构造函数,以及要在初始化时设置的任何内容的公共属性。

假设类Bar具有公共字符串属性“Name”和“Pet”,则可以构造一个这样的新对象。

 var foo = new Bar { Name = "Fred", Pet = "Dino" }; 

优点是您不需要为要初始化的每个值组合单独重载。

可选参数需要一个默认值(我只假设),因此在某些情况下可能很难提供一个。 为什么? 好吧,有些类需要运行时信息来初始化,编译器可能无法使用它们。

当涉及到原始类型时,答案可能与如果可以假设默认值,或者如果缺少参数可能表示该方法的不同行为有关。