CLR via C#:参数

命名参数:在调用函数时可以为指定参数名设置参数值。如fun(string str)函数在调用时可以使用fun(str:“参数值”)的形式进行调用。具有以下特性:
1.在重命名参数名时也要将对应命名参数重命名一下。
2.命名参数必须出现在实参列表的最后。
3.使用ref或者out修饰参数时,命名参数必须以变量的形式进行传递参数。如:

Int32 num = 5
M(x:ref num)

可选参数:在设计函数时可以为部分或者全部的参数指定默认值。具有以下特性:
1.可以为函数,构造函数,有参属性,委托的参数指定默认值。
2.有默认值的参数必须放在没有默认值的参数的后面,可变参数的前面。
3.默认值必须是编译时能确定的常量值。
4.调用函数时如果没有为可选参数传递值时就会使用默认值。
5.使用ref或者out修饰的参数由于没有合适的默认值,所以不能设置成可选参数。
6.编译器使用OptionalAttribute和DefaultParameterValueAttribute定制特性来设置可选参数并在元数据中持久性的存储起来;然后将默认值传递给DefaultParameterValueAttribute的构造函数用来存储起来;最后在调用函数需要用到可选参数默认值时就会从元数据中提取出来并嵌入到调用中。

隐式类型局部变量:使用var来修饰局部变量,并通过表达式来推算出局部变量的类型。具有以下特性:
1.var可以用于foreach,for,using语句,但是var不可以用于参数类型以及类型中的字段类型。
2.表达式不能为null,否则不知道推算成什么类型。

传递引用参数:CLR默认向函数参数传值,但是也允许使用out或者ref关键字来向函数参数传递引用。具有以下特性:
1.out和ref生成的元数据是一样的,主要是编译器根据关键字的不同做不同的检查。
2.out和ref能够用做函数重载区分标志,但是不能定义仅在ref和out上有差别的重载方法。
3.使用out传递对象给函数参数时具有以下特性:
1>.函数参数必须使用out关键字修饰;传递对象也必须使用out关键字修饰。
2>.传递对象和函数参数的类型必须一样,且不能经过隐式或者显示的转换达成一样。
3>.传递对象可以不用在函数外先初始化。
4>.函数内部不能读取函数参数值,且必须在函数返回前写入函数参数值。
4.使用ref传递对象给函数参数时具有以下特性:
1>.函数参数必须使用ref关键字修饰;传递对象也必须使用ref关键字修饰。
2>.传递对象和函数参数的类型必须一样,且不能经过隐式或者显示的转换达成一样。
3>.传递对象必须在函数外先初始化。
4>.函数内部不仅可以读取函数参数值,也可以在函数返回前写入函数参数值。

传递可变参数:使用params关键字来修饰函数参数。具有以下特性:
1.params关键字的作用是对函数参数应用ParamArrayAttribute定制特性,告知编译器函数参数数量是可变的,类型就是函数参数指定的类型。
2.params修饰的函数参数必须是一维数组且必须位于函数参数列表的最后一个。
3.编译器在查找函数时会优先查找非可变参数函数,找不到时才会去找可变参数函数。
4.由于params必须修饰一维数组,而该数组不仅在堆上进行空间分配,而且也会造成垃圾回收,从而对性能造成影响。所以一般建议重载几个常见的非可变参数版本,对十分罕见的参数传递才使用可变版本,从而一定程度上提高程序性能。

参数和返回类型设计规范:如下所示:
1.声明函数的参数类型时,尽量使用弱类型,宁愿要接口也不要基类。目的就是为了让参数类型适和更广泛的情形。
2.声明函数的返回类型时,尽量使用强类型,如果必须要用弱类型时也需要使用最强的弱类型。目的是让返回类型适合更广泛的情形。

常量性:CLR没有提供对常量对象以及常量实参的支持。因为如果支持的话,每次写入进行验证时就十分麻烦且低效;同时派生类也要为不可变的,从而给开发人员带来大量的麻烦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值