CLR via C# 参数 可选参数和参数命名

设计方法的参数时,可为部分或全部分配默认值。然后调用这些方法的代码可以选择不提供部分实参,使用其默认值。此外,调用方法时可通过制定参数名称来传递实参。

调用时省略了一个实参,C#编译器会自动嵌入参数的默认值。

向方法传递实参时,编译器按从左到右的顺序对实参进行求职。

//--

规则和原则

1.可为方法、构造器方法和有参属性(C#索引器)的参数指定默认值。还可以为属于委托定义一部分的参数指定默认值。

2.有默认值的参数必须放在没有默认值的所有参数之后。“数组参数”这种必须放在所有参数(包括有默认值的这些)之后,而且数组本身不能有一个默认值。

3.默认值必须是编译时能确定的常量值。这些参数的类型可以是C#认定的基元类型。还包括枚举类型,以及能设计为null的任何引用类型。值类型的参数可将默认值设为值类型的实例,并让它的所有字段都包含零值。可以用default关键字或者new关键字来表达这个意思。

4.不要重命名参数变量,否则任何调用者以传参数名的方式传递实参,它们的代码也必须修改。

5.如果方法从模块外部调用,更改参数的默认值具有潜在的危险性。

6.如果参数用ref火或out关键字进行了标识,就不能设置默认值。因为没有办法为这些参数传递有意义的默认值。

//--

1.实参可按任意顺序传递,但命名实参只能出现实参列表的尾部。

2.可按名称将实参传递给没有默认值的参数,但所有必须的实参都必须传递(无论按位置还是按名称),编译器才能编译代码。

3.C#不允许省略逗号之间的实参。可以用传递参数名的方式传递实参即可。

4.如果参数要求ref/out,为了以传递参数名的方式传递实参,请使用下面的语法:

//--

在C#中,一旦为参数分配了默认值,编译器就会在内部向该参数应用定制特性System.Runtime.InteropServices.OptionalAttribute。该特性会在最终生成的文件元数据中持久地存储下来。此外,编译器向参数应用System.Runtime.InteropServices.DefaultParamenterValueAttribut特性,并将该属性持久性存储到生成的文件元数据中。然后,会向DefaultParamenterValueAttribut的构造器传递你在源代码中指定的常量值。

之后,一旦编译器发现某个方法调用确实了部分实参,就可以确定省略的是可选的实参,并从元数据中提取默认值,将值自动嵌入调用中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值