函数重载与可选参数
所以我只是在思考函数重载……
重载方法共享相同的名称,但具有唯一的签名。 参数的数量,参数的类型或两者必须不同。 仅根据不同的返回类型不能重载函数。
所以在下面的例子中,为什么重载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");
)三个重载禁止。