C# Parameters和Arguments解读
C#从4.0版之后开始支援optional parameters以及named arguments,这两个语法通常会一起使用。他让我们的程式码变得更简洁并增加可读性。首先先来介绍什么是Parameters and Arguments。
Parameters 和 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的名称。以下是范例:
view plaincopy to clipboardprint?
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的顺序。我们应该要避免写出这种程式码。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
