传值参数:常规传进去的参数
在C#中,传值参数会在方法体内新建一个(栈)内存地址不同的变量
- 如果是值类型:创建一个新的局部变量,没啥好说的
- 引用类型
- 若只是修改对象的属性(副作用):参数和原变量的内存地址指向的堆地址仍是同一对象
- 若直接赋了一个新的实例给参数:此时二者分别成为两个独立的对象
- ps: 利用
HashCode判断两个对象变量是否指向相同的堆地址(同一个对象)
引用参数:用
ref 修饰,不产生新的对象副本引用参数完全就是 原变量的一个引用,对引用参数的任何修改(改属性)和赋值(改
HashCode)会直接影响原变量显式表明本方法将利用本变量的副作用
输出参数:用
out 修饰 与引用参数类似,都不产生新的对象副本
区别在于输出参数是显式表明要给该参数赋新值,即在方法体内必有明确的赋值操作,且在传入方法时可以不需要拥有初始值(所以直接在输出参数这里声明新变量都行:
out var x) 数组参数:用
params 修饰只能出现在方法参数的最后一个位置,实质上就是扩展参数
Console.Writeline("x1 = {0}, x2 = {1}", x1, x2); // prototype void Writeline([NotNull] string format, [NotNull] params object?[]? arg);
具名参数:在调用方法时,写成”
<paraName>: para”的形式允许调换参数位置
坏处:牺牲了方法接口的灵活性,一旦方法的参数命名发生改变则具名参数也需要更新
PrintInfo(name: "Tim", age: 34); // prototype void PrintInfo(uint age, string name);
可选参数:给参数赋个缺省值,必须是常量
可选参数必须出现在必选参数之后
PrintInfo("Tim"); // Prototype void PrintInfo(string name, uint age = 34);