C# out、ref关键字的用法和区别

本文深入解析C#中的out与ref关键字的区别与应用。out适用于获取函数内部值,无需初始化;ref则强调变量的双向传递,需预先赋值。两者均为引用传递,影响原始值。

说说自己对out、ref的认识,面试问到的几率很高哟。


out:

    class Program
    {
        /*
         * out、ref都是引用传递,传递后使用都会改变原有的值
         * out是只出不进。ref是有进有出,
         * 
         * out用法,一般用于需要返回多个参数时,如在需要返回分页的数据时 同时返回总条数或者TryParse()会用到
         * ref用法,一般用于在改变一个参数时,把他的改变反应到变量中 如在递归中
         * 
         */
      #region Out
        static void Main(string[] args)
        {
            Program p = new Program();

            //out传递参数时不用赋值(如果赋值也会被清空)
            string out_s;
            p.out_func(out out_s);
            Console.WriteLine(out_s);


            Console.ReadLine();//暂停窗口
        }

        /// <summary>
        /// out传入后需要赋值才能返回
        /// </summary>
        /// <param name="i"></param>
        public void out_func(out string s)
        {
            s = "out参数已赋值,返回。";
        }
      #endregion
    }
输出:









ref:

 class Program
    {
      #region ref
        static void Main(string[] args)
        {
            Program p = new Program();
          
            //ref传递时如果未初始化赋值 则会报错 :使用了未赋值的局部变量“ref_s”	
            string ref_s = "已初始化。";
            p.ref_func(ref ref_s);
            Console.WriteLine("返回的ref参数:" + ref_s);


            Console.ReadLine();//暂停窗口
        }

        /// <summary>
        /// ref传入前需要赋值,传入后可不做操作返回原值
        /// </summary>
        /// <param name="s"></param>
        public void ref_func(ref string s)
        {
            Console.WriteLine("传入的ref参数:" + s);
            s += "已赋值返回。";
        }
       
      #endregion
    }
输出:





总结:

  •  out、ref都是引用传递 (传递后改变传递的值会影响原来的值)
  •   out不需要初始化 需要在传入的方法内部完成初始化赋值     ref必须初始化赋值
  •   out用于获取函数内部的值                       ref可同时改变函数内和函数外的值


### C# 中 `out` `ref` 关键字的使用场景及区别C# 中,`out` `ref` 是用于按引用传递参数的关键字,它们允许方法直接修改调用者的变量。然而,这两个关键字在使用规则适用场景上存在显著的区别。 #### 1. 基本概念 - **`ref` 关键字** 表示通过引用传递参数,方法内对参数的修改会直接影响调用者的变量[^1]。调用前必须初始化:传入的变量需在传递前赋值[^3]。方法内部可以读取或修改参数的值(非强制修改)[^4]。 - **`out` 关键字** 也用于按引用传递参数,但它与 `ref` 的几个重要区别在于:调用方法时,`out` 参数不需要初始化[^4]。这是因为 `out` 参数的目的是允许方法输出多个值,而调用者可能对这些值一无所知。方法内部必须为 `out` 参数赋值,否则编译器会报错。 #### 2. 使用场景 - **`ref` 的使用场景** 当需要修改一个变量并希望这些修改在方法外部也可见时,使用 `ref`[^4]。例如,如果你有一个方法需要交换两个变量的值,那么使用 `ref` 是最合适的。此外,`ref` 适用于传递较大的对象或结构体,避免复制带来的性能开销[^5]。 - **`out` 的使用场景** 当需要从方法返回多个值时,使用 `out`[^4]。因为 C# 的方法只能返回一个值,所以如果需要返回多个值,`out` 参数就非常有用。 #### 3. 示例代码 以下是一些具体的代码示例,展示如何使用 `ref` `out`: ```csharp // 使用 ref 的示例 void ModifyValue(ref int x) { x += 10; // 直接修改调用者的变量 } int num = 5; ModifyValue(ref num); // 调用时必须用 ref 关键字 Console.WriteLine(num); // 输出 15 // 使用 out 的示例 void GetCoordinates(out int x, out int y) { x = 10; // 必须为 out 参数赋值 y = 20; } int a, b; GetCoordinates(out a, out b); // 调用时必须用 out 关键字 Console.WriteLine($"x: {a}, y: {b}"); // 输出 x: 10, y: 20 ``` #### 4. 主要区别总结 | 特性 | `ref` | `out` | |---------------------|------------------------------------|------------------------------------| | **是否需要初始化** | 调用前必须初始化 | 调用前不需要初始化 | | **方法内部是否赋值** | 不强制要求赋值 | 必须赋值 | | **主要用途** | 修改已存在的变量 | 返回多个值 | ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值