ref和out解析

Posted yueyongsheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ref和out解析相关的知识,希望对你有一定的参考价值。

1.用途:

在C#中当一个方法需要返回多个值的时候,就需要用到ref和out。

2.Ref使用

        /// <summary>
        /// ref正确例子
        /// </summary>
        /// <returns></returns>
        public IActionResult Sample()
        {
            int x = 1;//初始化
            int y = 1;//初始化
            RefWay(ref x, ref y);
            return Json(x, y);
        }
        /// <summary>
        /// 方法
        /// </summary>
        /// <param name="x">参数X</param>
        /// <param name="y">参数y</param>
        public void RefWay(ref int x, ref int y)
        {
            x = 100;
            y = 100;
        }

输出:x=100,y=100

     /// <summary>
        /// ref错误例子
        /// </summary>
        /// <returns></returns>
        public IActionResult Sample()
        {
            int x;//未初始化
            int y;//未初始化
            RefWay(ref x, ref y);
            return Json(x, y);
        }
        /// <summary>
        /// 方法
        /// </summary>
        /// <param name="x">参数X</param>
        /// <param name="y">参数y</param>
        public void RefWay(ref int x, ref int y)
        {
            x = 100;
            y = 100;
        }

错误信息:(1)使用了局部变量的“x”(2)使用了局部变量的“y”

注意:ref指定的参数在函数调用时候必须初始化,不能为空的引用。

2.Out使用

/// <summary>
        /// out正确例子
        /// </summary>
        /// <returns></returns>
        public IActionResult Sample()
        {
            int x;//未初始化
            int y;//未初始化
            RefWay(out x, out y);
            return Json(x, y);
        }
        /// <summary>
        /// 方法
        /// </summary>
        /// <param name="x">参数X</param>
        /// <param name="y">参数y</param>
        public void RefWay(out int x, out int y)
        {
            x = 100;
            y = 100;
        }

输出:x=100,y=100

 

    /// <summary>
        /// out错误例子
        /// </summary>
        /// <returns></returns>
        public IActionResult Sample()
        {
            int x;//未初始化
            int y = 100;//初始化
            RefWay(out x, out y);
            return Json(x, y);
        }
        /// <summary>
        /// 方法
        /// </summary>
        /// <param name="x">参数X</param>
        /// <param name="y">参数y</param>
        public void RefWay(out int x, out int y)
        {
            x = y;
            y = 100;
        }

错误信息: 使用了局部变量的“y”

注意:out指定的参数在函数调用时候可以不初始化;参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

总结:

1.口诀:ref有进有出,out只出不进。

2.out:举个例子--我们去商店(函数)买东西,我们可以带钱(参数初始化)也可以不带,不管我们带没带钱,我们今天的目的就是去拿东西,

然后欠钱(参数清空),因为和老板是好朋友。因此我们走的时候必须要带东西走(必须在函数内部赋初值)。

2.ref:举个例子--我们去商店(函数)买东西,我们必须要带钱(参数初始化),因为我们和老板不认识, 到商店之后,我们可以买东西也可以不买东西,假如我们买了东西,那么我们就可以带着物品(返回值)离开商店假如我们没有买东西,那么我们就带着钱(返回值)离开商店

以上是关于ref和out解析的主要内容,如果未能解决你的问题,请参考以下文章

C#中ref和out的使用小结

ref 与 out

.NET 中 ref 和 out 参数之间的区别 [重复]

C# 中的 Lambda 和 ref/out

ref和out的区别,值类型和引用类型的使用

C# out ref 用法总结