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