[c#美味] c#4.0中的命名参数
2010-05-28 00:59
260 查看
什么是命名参数?
命名参数(Named Arguments)就是说在调用函数时可以通过指定参数名称的方式来调用参数。它最大的好处就是方便调用参数时按调用者的需要来排列顺序,而不必死守函数声明时的顺序,同时结合默认参数值的特性,可以选择使用默认参数还是不使用默认参数。
以前的时候,调用OldFun这个函数时就必须按照param1,param2,param3的顺利来调用。
不能把param2放在第一个调用。也不能只给param2赋值,而不给其它参数赋值。。
执行后结果如图:
注意:命名参数的调用方式是: 参数名:参数值
而且命名参数必须放在普通参数值的后面,即不能用下面的方式调用:
执行后如图:
先看一个例子:
如上述代码,它的执行结果如下:
P1
P2
P3
a:1,b:2,c:3
可以看出,参数的执行顺序是p1→p2→p3.
那么使用命名参数后呢?
执行结果如下:
P3
P2
P1
a:1,b:3,c:2
顺序变成了:p3→p2→p1
为什么是这样呢?
那是因为编译器会先调用使用命名参数的参数,然后再执行剩余的参数。
如下所示:
如上代码,假如我现在把param2改为了paramNew2,那么调用者那里也必须修改才行,不然就会报错。
要改成这样:
所以,如果我们是调用一个第三方或者Public的函数,最好不要用命名参数来调用,避免出现一旦被调用者修改了名称(比如拼写错误),那么我们的代码也编译不过的问题。
http://bartdesmet.net/blogs/bart/archive/2008/11/01/c-4-0-feature-focus-part-2-named-parameters.aspx
命名参数(Named Arguments)就是说在调用函数时可以通过指定参数名称的方式来调用参数。它最大的好处就是方便调用参数时按调用者的需要来排列顺序,而不必死守函数声明时的顺序,同时结合默认参数值的特性,可以选择使用默认参数还是不使用默认参数。
Before 4.0
如下面示例:static void Main(string[] args) { OldFun("greenerycn", "cnblogs", "com"); } static void OldFun( string param1, string param2 , string param3) { var content = string.Format("http://{0}.{1}.{2}", param1, param2, param3); Console.WriteLine(content); }
以前的时候,调用OldFun这个函数时就必须按照param1,param2,param3的顺利来调用。
不能把param2放在第一个调用。也不能只给param2赋值,而不给其它参数赋值。。
After 4.0
我们可以这样调用:static void Main(string[] args) { OldFun( "com", param3:"greenerycn", param2:"cnblogs"); }
执行后结果如图:
注意:命名参数的调用方式是: 参数名:参数值
而且命名参数必须放在普通参数值的后面,即不能用下面的方式调用:
结合默认参数
这个才是命名参数最大的用途,看下面的代码,调用多简单!static void Main(string[] args) { OldFun(param2:"cnblogs"); } static void OldFun( string param1="www", string param2="greenerycn" , string param3="com") { var content = string.Format("http://{0}.{1}.{2}", param1, param2, param3); Console.WriteLine(content); }
执行后如图:
参数的调用顺序
在命名参数出现前,函数的参数是从左到右依次调用。那么有了命名参数后,函数的调用顺序是否被改了呢?先看一个例子:
static void Main(string[] args) { TestFun(P1(), P2(), P3()); } static int P1() { Console.WriteLine("P1"); return 1; } static int P2() { Console.WriteLine("P2"); return 2; } static int P3() { Console.WriteLine("P3"); return 3; } static void TestFun(int a, int b, int c) { Console.WriteLine(string.Format("a:{0},b:{1},c:{2}", a, b, c)); }
如上述代码,它的执行结果如下:
P1
P2
P3
a:1,b:2,c:3
可以看出,参数的执行顺序是p1→p2→p3.
那么使用命名参数后呢?
static void Main(string[] args) { TestFun(P1(),b:P3(), c: P2()); }
执行结果如下:
P3
P2
P1
a:1,b:3,c:2
顺序变成了:p3→p2→p1
为什么是这样呢?
那是因为编译器会先调用使用命名参数的参数,然后再执行剩余的参数。
不好之处
有好的地方,也有不好的地方。引入命名参数后出现的一个新问题就是是如果参数名称修改后,调用者那里也必须修改名称。如下所示:
static void Main(string[] args) { OldFun(param2: "cnblogs"); } static void OldFun( string param1="www", string paramNew2="greenerycn" , string param3="com") { var content = string.Format("http://{0}.{1}.{2}", param1, paramNew2, param3); Console.WriteLine(content); }
如上代码,假如我现在把param2改为了paramNew2,那么调用者那里也必须修改才行,不然就会报错。
要改成这样:
static void Main(string[] args) { OldFun(paramNew2: "cnblogs"); }
所以,如果我们是调用一个第三方或者Public的函数,最好不要用命名参数来调用,避免出现一旦被调用者修改了名称(比如拼写错误),那么我们的代码也编译不过的问题。
参考资料
C# 4.0 FEATURE FOCUS - PART 2 - NAMED PARAMETERShttp://bartdesmet.net/blogs/bart/archive/2008/11/01/c-4-0-feature-focus-part-2-named-parameters.aspx
相关文章推荐
- [c#美味] c#4中默认参数和命名参数后的函数重载
- [c#美味] c#4.0中的默认参数
- asp.net C#命名参数SqlParameter详解
- C# 4.0 新特性dynamic、可选参数、命名参数等
- c# 可选参数、命名参数
- C#命名参数的使用
- C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数
- c# 可选参数与命名实参
- C#4.0新特性:可选参数,命名参数,Dynamic
- C#4.0 命名参数可选参数
- C# 4.0命名参数和可选参数
- c#中的可选参数和命名参数的使用
- c#【1】 串口编程:类名和命名空间是什么?有几个重要参数、并简述?
- C#学习基础--可选参数、命名参数
- C#默认参数和命名参数
- C# 4.0 新特性dynamic、可选参数、命名参数等
- 命名参数(C#)
- c# 方法参数(传值,传引用,ref,out,params,可选参数,命名参数)
- C# out、ref、params、可变参数、命名参数详解
- C# 可选参数 命名参数