C#-out和ref 参数修饰符

参数修饰符:

  1. 无参数修饰符:如果一个参数没有任何参数修饰符修饰,那么认为它是值传递,意味着方法内部收到的是实参数据的副本
  2. out:输出参数由方法内部进行赋值,(引用传递),如果方法内部没有给被out修饰的输出参数赋值,就会出现编译报错。out最大的用途就是只调用一次方法便会产生多个返回值。(C#7.0中实现一次方法返回多个返回值,可以使用元组)
  3. 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);
        }        

操作截图:

 

posted @ 2022-02-11 18:13  没有童话的鱼  阅读(230)  评论(0编辑  收藏  举报