C#-out和ref 参数修饰符
参数修饰符:
- 无参数修饰符:如果一个参数没有任何参数修饰符修饰,那么认为它是值传递,意味着方法内部收到的是实参数据的副本
- out:输出参数由方法内部进行赋值,(引用传递),如果方法内部没有给被out修饰的输出参数赋值,就会出现编译报错。out最大的用途就是只调用一次方法便会产生多个返回值。(C#7.0中实现一次方法返回多个返回值,可以使用元组)
- ref:调用者赋初始值,(引用传递),在方法内部可以对参数进行操作,也可以不对它进行操作,但前提是ref修饰的参数是有初始值的。
out 和 ref 区别:
- out修饰的参数必须在方法内部进行操作,而ref随意
- out传参时,如果参数时局部变量,可以不用对其赋值,因为在其方法内部一定存在赋值操作
- ref修饰的变量,其实参必须有初始值,因为方法中不一定对其有赋值操作。
代码验证如下:
static void Main(string[] args) { // 1.out 操作 string str_out; doOut(out str_out); Console.WriteLine($"执行doOut后的str值为:{str_out}"); Console.WriteLine("----------------"); // 2.ref操作 string str_ref = "ref修饰的参数一定要提前赋值,否则会报错"; doRef(ref str_ref); Console.WriteLine("----------------"); // 3.无参数修饰符 string str = "无参数修饰符"; Console.WriteLine($"执行无参数修饰符操作之前:{str}"); doWrite(str); Console.WriteLine($"执行无参数修饰符操作之后:{str}"); Console.WriteLine("----------------"); } /// <summary> /// out操作 /// </summary> /// <param name="s"></param> public static void doOut(out string s) { // out 修饰的参数,在方法内部必须进行赋值相关的操作,否则会报错 s = "out修饰的参数需要在方法内部进行了操作,且原始数据也存在改动"; Console.WriteLine(s); } /// <summary> /// ref操作 /// </summary> /// <param name="s"></param> public static void doRef(ref string s) { // ref 修饰的参数,在方法内部可以不对它进行相关的操作,但参数一定要提前赋值 Console.WriteLine(s); } /// <summary> /// 无参数修饰符操作 /// </summary> /// <param name="s"></param> public static void doWrite(string s) { // 无参数修饰符,传入的实参相当于原始数据的一个副本,本质是值传递,并不会对实参本身的数据产生影响 s = "没有任何参数修饰符"; Console.WriteLine(s); }
操作截图: