Optional parameters and Named arguments语法详解
C#从4.0版之后开始支援optional parameters以及named arguments,这两个语法通常会一起使用。他让我们的源程序变得更简洁并增加可读性。
首先先来介绍什么是Parameters and Arguments。
Parameters and Arguments
Parameters和Arguments是两个很容易搞混的名词,先来定义这两者有什么不同。下面是一段源程序范例:
- void Foo(int x, int y)
- {
- // Do something with x and y
- }
- ...
- int a = 10;
- Foo(a, 20);
parameters是function定义时所使用的变量,arguments是我们调用function时传进去的变量或值 范例中的x和y是parameters,a和20是arguments。
Optional parameters
Optional parameters简单说就是给parameter一个特定的默认值,当用户没有传入此parameter所对应的arguments时,会自动使用默认值。在C#4.0之前没有optional parameters,如果要达到这个功能必须使用overloading function,会造成写一大堆overloading function的情况,并不是很好使用。C#4.0之后使用optional parameters可以免去声明一堆overloading function的困扰。
以下是optional parameters的一个简单范例:
- static void Dump(int x, int y = 20, int z = 30)
- {
- Console.WriteLine("x={0} y={1} z={2}", x, y, z);
- }
- ...
- Dump(1, 2, 3);
- Dump(1, 2);
- Dump(1);
我们设置y和z的默认值为20和30,当我们在调用function时,编译器会根据我们提供的参数去做对应,找出最合适的function。程序执行结果如下:
- x=1 y=2 z=3
- x=1 y=2 z=30
- x=1 y=20 z=30
程序会从parameters list的左边到右边一一去对应参数。如果出现无法对应的情况会丢出exception。
由于optional parameters和arguments的对应是按照声明的顺序,因此当我们调用Dump(1, 2)时会自动把y对应成2,没办法把2对应到z让y使用默认值。要让参数能自由对应需要使用接下来要介绍的named arguments。
parameter的默认值必须是一个常数,因此以下范例是错误的,因为DataTime.Now并不是一个常数。
- Foo(DateTime dt = DateTime.Now)
Optional parameters也被限制必须放在后面,不能放在非optional parameters之前。
- Foo(int x = 0, int y)
Name arguments
Name arguments让我们可以不按照顺序传入参数。他的语法是在argument前加入一个对应parameter的名称。以下是范例:
- static void Dump(int x, int y, int z)
- {
- Console.WriteLine("x={0} y={1} z={2}", x, y, z);
- }
- ...
- Dump(1, 2, 3);
- Dump(x: 1, y: 2, z: 3);
- Dump(z: 3, y: 2, x: 1);
- Dump(1, y: 2, z: 3);
- Dump(1, z: 3, y: 2);
不管argument的顺序是如何,编译器会自动帮我们对应到正确的parameters名称。
x=1 y=2 z=3
x=1 y=2 z=3
x=1 y=2 z=3
x=1 y=2 z=3
x=1 y=2 z=3
Abusing argument evaluation order
- int i = 0;
- Dump(z: ++i, x: ++i, y: ++i);
- x=2 y=3 z=1
上面这行源程序输出的结果可能会和你想的不一样,这是因为传进去的argument还是根据他声明的顺序做计算,而不是patameters的顺序。我们应该要避免写出这种程序。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
