什么是ref参数和返回值之间的区别(方法)

时间:2016-09-22 16:34:48

标签: c#

我一直在研究方法,我偶然发现了“ref”方法。然而,这两个代码似乎都完成了同样的事情:

class Program
{
    static void Main(string[] args)
    {
        int number;

        number = 5; 
        Console.WriteLine("Before method number= {0}", number);

        AddThree (ref number);

        Console.WriteLine("After method number={0}", number);
        Console.ReadLine();

    }

    private static void AddThree(ref int  lol) //carbon copy....so  int number= 5  here
    {
        lol  = 3; 
        Console.WriteLine("inside method number={0}", lol);


    }


}
}
class Program
{

    static void Main(string[] args)
    {

       int number;
       int print; 


        number = 5;
        Console.WriteLine("Before method number= {0}", number);

        print =AddThree(number);

        Console.WriteLine("After method number={0}", print);
        Console.ReadLine();

    }

    private static int AddThree(int lol) //carbon copy....so  int number= 5  here
    {
        lol  = 3; 
        Console.WriteLine("inside method number={0}", lol);
        return lol;


    }


}

}

-

ref参数是否有超过返回值的优势?我个人并没有看到一个巨大的差异..

1 个答案:

答案 0 :(得分:6)

  

ref参数是否有超过返回值的优势?我个人并没有看到巨大的差异。

通常是ref用于已经返回其他东西的地方 - 例如对于int.TryParse(使用out,但相似)。 C#仅支持返回单个值,因此如果您想要一个方法的两个输出,您可以选择:

  • out参数
  • ref参数
  • 返回复合值(可能在C#7中更常见ValueTuple

但还有其他差异 - 重要的是,在更改原始变量方面,ref参数的更改在中立即可见。当你有两个ref参数别名相同的变量时,这是最简单的证明:

using System;

class Test
{
    static void Main()
    {
        int x = 0;
        RefTwo(ref x, ref x);
    }

    static void RefTwo(ref int a, ref int b)
    {
        Console.WriteLine(a); // 0
        b = 5;
        Console.WriteLine(a); // 5!
    }
}

哦,有点古怪,如果你想要一个部分方法来回归"一个值,你基本上需要一个ref参数,因为部分方法必须是void

我通常会避免使用ref参数,除非有明显的好处。在我看来,它们使交互变得更加复杂。