Optional Parameters虽然不是新的概念,在C++和Basic等语言中是一个老特性了,在C# 4.0中终于将其也加入了进来,通过Optional Parameters,可以减少重载函数的数量,加快开发效率。
使用方式:
使用上就跟C++一样,只需用等号为函数的参数加上默认值即可,例如,对于如下函数:
public void M(int x, int y = 5, int z = 7);
我们可以通过如下几种方式调用:
- M(1, 2, 3); // ordinary call of M
- M(1, 2); // omitting z – equivalent to M(1, 2, 7)
- M(1); // omitting both y and z – equivalent to M(1, 5, 7)
在C# 3.0的时候,需要写三个函数才能达到同样的效果。
另外,通过引入后,调用函数是参数的使用限制更加小了,如下几种方式也是合法的:
- M(1, z: 3); // passing z by name
- M(x: 1, z: 3); // passing both x and z by name
- M(z: 3, x: 1); // reversing the order of arguments
方式1的调用在C++中是不允许的,这点使得调用限制更少了,还是比较有意义的。方式3则有点出乎我意料之外,不过个人感觉这种颠覆编程习惯的调用方式意义不大。
使用时的限制
- Optional Parameters要放在必要性参数的后面,也就是说Optional Parameters后面不得有必要性参数的存在。
这个限制和C++中一样,应该是为了方便编写编译器而制定,对我们的影响也不大 - 参数的默认值是编译期绑定的,因此不能传入运行期时才能确认的内容,只能传入编译期就确定的值类型。
这个限制使得Optional Parameters效果大打折扣,毕竟大多数时候的想传入的默认参数是对象或一些运行期才能决定的值,其实这点限制应该是完全可以取消掉的,不知M$是出于什么目的加上的。
当然,C# 4.0中推出Optional Parameters特性的主要目的是减少com调用时的复杂性,但由于其潜力并没有完全发挥出来,不能运行期绑定默认参数大大限制了其作用范围,这个特性来得并没有想象中的那么激动人心。