C#中的具名参数、可选参数及注意问题
具名参数 和 可选参数 是 C# framework 4.0 出来的新特性。
一. 常规方法定义及调用
1 2 3 4 5 6 7 8 9 10 11 |
public void Demo1(string x, int y) { //do something... } public void Main() { //调用 Demo1("similar", 22); } |
调用时,参数顺序(类型)必须与声明一致,且不可省略。
二. 可选参数的声明及调用
可选参数分为两种情况: 1. 部分参数可选;?? 2. 全部参数都是可选
1 2 3 4 5 6 7 8 9 10 11 12 |
//部分可选(x为必选,y为可选) public void Demo2(string x, int y = 5) { //do something... } public void Main() { //调用 Demo2("similar"); // y不传入实参时,y使用默认值5 Demo2("similar", 10); // y传入实参,则使用实参10 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//全部可选(x,y 均为可选参数) public void Demo3(string x = "demo", int y = 5) { //do something... } public void Main() { //调用 Demo3(); // x,y不传入实参时,x,y使用默认值 "demo",5 Demo3("similar"); // y不传入实参时,y使用默认值5 Demo3("similar", 10); // x,y都传入实参 } |
b. 参数声明定义可以无顺序,但调用时必须与声明时的一致。
上面的调用只写的3种,其实还有一种,就是 x 使用默认值,y 传入实参,即 :? Demo3(10);
但这样调用会报错,因为Demo3的第一个参数是 string 类型,错误消息如图:
但是现在我只想传入y, 不想传入 x ,该怎么办呢,那么就要用到 C#的 具名参数。
三. 具名参数
具名参数的使用主要是体现在函数调用的时候。
1 2 3 4 5 6 7 8 9 10 11 |
public void Main() { //调用 Demo3(); // x,y不传入实参时,x,y使用默认值 "demo",5 Demo3("similar"); // y不传入实参时,y使用默认值5 Demo3("similar", 10); // x,y都传入实参 // 具名参数的使用 Demo3(y:10); } |
注: 当使用 具名参数时,调用方法可以不用管参数的声明顺序,即如下调用方式也是可以的:
在调用含有可选参数的方法时,vs中会有智能提示,提示哪些是可以选参数及其默认值,中括号表示可选[]:
四、存在问题
可选参数和具名参数看上去都很美好。个人特别喜欢的是可选参数,给我们提供了一种更为简洁的写重载函数的方法。美丽而高效。
但具名参数存在一个很大的问题。具名参数的参数名会成为接口的一部分,所以在对函数进行升级的时候就无法升级参数名。如果有新的版本中更新了参数名,使用以往版本所写的代码就会失效。
客户端代码使用具名参数意味着:方法中的参数名称也成为了公有接口的一部分。假如修改公有参数的名称将有可能破坏调用者的代码。这意味着:调用者应该尽可能的避免使用具名参数,而作为API的设计者,也应该避免修改公有货受保护方法中参数的名称。
原创文章,文章首发于:Riley Ge (@rileyge) — Steemit
原创文章,转载请注明: 转载自TsonTec:测量解决方案提供者
本文链接地址: C#中的具名参数、可选参数及注意问题
说点什么