NET CLR via C#读书笔记 - 第九章 参数

1 可选参数和命名参数

1.1 代码示例

  可选参数就是函数包含默认值得形参,命名参数是指调用方法的时候通过指定参数名称来传递实参,代码示例如下:

public sealed class Demo{
	//定义含有默认参数值的函数 其中x,s就是可选参数
	public void dpFunc(int x = 0,string s = "hello world"){} 
	
	public void UsedpFunc(){
		dpFunc(); //参数使用函数定义时的默认值 x = 0, string = "hello world"
		dpFunc(1);//等效于 dpFunc(1,"hello world")
		dpFunc(s:"show time",x:2); //命名参数,可以不按参数声明顺序传递实参。
	}
}

1.2 可选参数以及命名参数的规则和原则

  定义实参的规则和原则:

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

  ② 有默认值的参数必须放在没有默认值的所有参数之后(重中之重)。但也有例外:参数数组这种参数必须放在所有参数(包括默认值得这些)之后,而且数组本身不能有一个默认值。

  ③ 默认值必须是编译时能确定的常量值,可以使用default关键字或者new关键字来表达这个意思。

  ④ 千万不要随意重命名参数变量或修改参数的声明顺序。

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

  ⑥ 如果参数使用ref或者out关键字进行标识,就不能设置默认值。因为没有办法为这些参数传递有意义的参数值,类似指针。可以通过传参数名传递实参的方式传递ref/out修饰的参数,代码如下:

//方法的声明
private static void M(ref int x){...}
//方法的调用
int a = 5;
M(x:ref a);

  ⑦ 实参可按照任意顺序传递,但命名实参必须且只能出现在实参列表尾部,代码如下:

dpFunc(2,s:"show time");
// dpFunc(s:"show time",2); 错误的使用方式

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

  ⑨ C#不允许省略逗号之间的实参。

2 以引用方式传参

  C#中,默认以传值的形式传参,引用类型的传值传递的是指向对象的指针的地址(地址就是一个值类型,可以理解为c语言中指针的指针),通过值传递的方式传递引用类型,在方法内部不能改变对象实例的指向,只能对对象实例本身的内部属性进行修改,值类型传递的是值类型的一个实例副本。C#中使用ref和out关键字来显示指定以引用方式传参。
  ref : 必须在传参之前初始化实参
  out: 传参前不需要初始化实参
  对于值类型使用ref/out,就和以传值方式传递引用类型一样,可以改变实参的值。
  对于引用类型使用ref/out,允许方法内部修改实参对象,改变实参指向等等。

3 可变数量的参数

  代码形式如下:

void ParamsFunc(params object[] ob){}
void UseParamsFunc(){
	ParamsFunc(new object(),"Hello",5); //使用方式
}

  使用params修饰。

  以上内容为对《NET CLR via C#(第四版)》第九章内容的阅读笔记,只记录其中核心部分内容,书中对以上主题还进行了详细的代码演示说明,对于参数和返回值设计规范和常量性也进行了相关说明,如需要详细阅读请自行查阅本书第八章内容,感谢您的阅读。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值