函数重载与可选参数

所以我只是在思考函数重载……

重载方法共享相同的名称,但具有唯一的签名。 参数的数量,参数的类型或两者必须不同。 仅根据不同的返回类型不能重载函数。

所以在下面的例子中,为什么重载setName而不是使用中间名和姓氏值的可选参数?

 class funOverload { public string name; //overloaded functions public void setName(string last) { name = last; } public void setName(string first, string last) { name = first + "" + last; } public void setName(string first, string middle, string last) { name = first + "" + middle + "" + last; } //Entry point static void Main(string[] args) { funOverload obj = new funOverload(); obj.setName("barack"); obj.setName("barack "," obama "); obj.setName("barack ","hussian","obama"); } } 

至少,使用以下内容可以减少需要编写的代码量:

 public void setName(string first, string middle = "", string last = "") { name = first + "" + middle + "" + last; // name = "barack" + "" + ""; } //Entry point static void Main(string[] args) { funOverload obj = new funOverload(); // could optionally set middle and last name values here as well obj.setName("barack"); } 

我理解重载的概念,但我不知道为什么它比使用可选参数更合适(或反之亦然)。

谁有人解释一下?

仅供参考,这是我重载的第一个函数: http : //pastebin.com/ynCuaay1
这个函数允许你调用带有或不带参数列表的MySqlContext.GetReader() …我认为它使得代码比必须一直调用GetReader(sql, args.ToArray())更整洁

我不明白为什么它比使用可选参数更理想

具有默认值的参数具有一些限制,这在某些情况下可能很重要。

您可以为引用类型设置默认参数,而不是null( string参数除外):

 class Foo { public int Id { get; set; } } class Bar { public Bar(Foo parent) { } public Bar() : this(new Foo { Id = 1 }) // this can't be done with default parameters { } } 

具有默认值的参数不能出现在常规参数之前,有时这可能是合适的:

 class Foo { public void Method(int i, string s, bool b) { } public void Method(string s, bool b) { Method(0, s, b); // this can't be done with default parameters } } 

在您的示例中,三个重载与具有可选参数的方法不同。 setName(string last)声明给出的最小数据是姓氏,其中public void setName(string first, string middle = "", string last = "")不允许您省略名字。 如果你想在带有可选参数的方法调用中省略中间名,你必须有setName("barack", last: "obama")

使用可选参数的方法会更好一些:

 public void setName(string last, string first= "", string middle = "") 

但这会破坏名称的自然顺序,并允许您设置中间名而不指定第一个( setName("barack", middle: "hussein"); )三个重载禁止。