.NET中ref和out参数的区别是什么?在什么情况下,一个会比另一个更有用?一个可以使用而另一个不能使用的代码片段是什么?


当前回答

它们几乎是一样的-唯一的区别是,作为out形参传递的变量不需要初始化,但作为ref形参传递的变量必须设置为某个值。

int x;
Foo(out x); // OK

int y;
Foo(ref y); // Error: y should be initialized before calling the method

Ref形参用于可能被修改的数据,out形参用于已经使用返回值的函数(例如int.TryParse)的额外输出数据。

其他回答

它们有微妙的不同。

out形参在传递给方法之前不需要由被调用方初始化。因此,任何带有out参数的方法

在为参数赋值之前无法读取该参数 必须在返回之前给它赋值吗

这用于需要覆盖其参数的方法,而不管其先前的值如何。


ref形参在传递给方法之前必须由被调用方初始化。因此,任何带有ref参数的方法

在赋值之前可以检查值吗 可以返回原值,不受影响吗

这用于必须检查其值并对其进行验证或规范化的方法。

OUT的例子:变量在进入方法后得到初始化的值。稍后将相同的值返回给主方法。

namespace outreftry
{
    class outref
    {
        static void Main(string[] args)
        {
            yyy a = new yyy(); ;

            // u can try giving int i=100 but is useless as that value is not passed into
            // the method. Only variable goes into the method and gets changed its
            // value and comes out. 
            int i; 

            a.abc(out i);

            System.Console.WriteLine(i);
        }
    }
    class yyy
    {

        public void abc(out int i)
        {

            i = 10;

        }

    }
}

输出: 10

===============================================

例如:变量应该在进入方法之前初始化。稍后相同的值或修改后的值将返回给主方法。

namespace outreftry
{
    class outref
    {
        static void Main(string[] args)
        {
            yyy a = new yyy(); ;

            int i = 0;

            a.abc(ref i);

            System.Console.WriteLine(i);
        }
    }
    class yyy
    {

        public void abc(ref int i)
        {
            System.Console.WriteLine(i);
            i = 10;

        }

    }
}

输出: 0 10

=================================

希望现在晴了。

Out和ref是完全相同的,除了Out变量在发送到深渊之前不需要初始化。我没有那么聪明,我从MSDN库抄袭了:)。

然而,更明确地说,修饰符的含义是,如果您在代码中更改了该变量的引用,out和ref将导致调用变量也更改引用。在下面的代码中,一旦newGuy从doStuff调用中返回,ceo变量将是它的引用。如果不是为了ref(或out),引用就不会被改变。

private void newEmployee()
{
    Person ceo = Person.FindCEO();
    doStuff(ref ceo);
}

private void doStuff(ref Person employee)
{
    Person newGuy = new Person();
    employee = newGuy;
}

Out参数由调用的方法初始化,ref参数在调用方法之前初始化。因此,当您只需要获得第二个返回值时,使用out参数,ref参数用于获取一个值并可能返回对该值的更改(次于主返回值)。

它们几乎是一样的-唯一的区别是,作为out形参传递的变量不需要初始化,但作为ref形参传递的变量必须设置为某个值。

int x;
Foo(out x); // OK

int y;
Foo(ref y); // Error: y should be initialized before calling the method

Ref形参用于可能被修改的数据,out形参用于已经使用返回值的函数(例如int.TryParse)的额外输出数据。