Parameter

Tags
传值参数:常规传进去的参数
在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);