首页 文章

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

提问于
浏览
390

这个问题在这里已有答案:

.NET中的 refout 参数有什么区别?一个人比另一个人更有用的情况是什么?什么是可以使用的代码片段而另一个不能使用?

18 回答

  • 1
    • ref 变量需要在传入之前进行初始化 .

    • 需要在函数实现中设置 out 变量

    • out 参数可以被认为是额外的返回变量(不是输入)

    • ref 参数可以被认为是输入和输出变量 .

  • 0

    他们是略有不同 .

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

    • 在为其赋值之前无法读取参数

    • 必须在返回之前为其指定值

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


    在将被传递给方法之前,必须由被调用者初始化 ref 参数 . 因此,任何具有 ref 参数的方法

    • 可以在分配之前检查该值

    • 可以返回原始值,不受影响

    这用于必须(例如)检查其值并对其进行验证或对其进行标准化的方法 .

  • 9

    它们几乎是一样的 - 唯一的区别是你作为 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 ),这些数据已经使用某些东西的返回值 .

  • 0

    Why does C# have both 'ref' and 'out'?

    取出参数的方法的调用者不需要分配给在调用之前作为out参数传递的变量;但是,被调用者需要在返回之前分配out参数 .

    相比之下,ref参数被认为最初由呼叫者分配 . 因此,被调用者在使用之前不需要分配给ref参数 . Ref参数传入和传出方法 .

    所以, out 表示out,而 ref 表示输入和输出 .

    这些参数与COM接口的 [out][in,out] 参数紧密对应, out 参数的优点是,在被调用方法不需要的情况下,调用者无需传递预先分配的对象 - 这可以避免分配成本,以及可能与编组相关的任何成本(更可能与COM相关,但在.NET中并不罕见) .

  • 478

    refout 都允许被调用的方法修改参数 . 它们之间的区别在于您拨打电话之前发生的事情 .

    • ref 表示该参数有一个值 before 进入该函数 . 被调用的函数可以随时读取和/或更改值 . 参数进入,然后出来

    • out 表示该参数在进入函数之前没有正式值 . 被调用的函数必须初始化它 . 该参数仅出现

    这是我最喜欢看的方式: ref 是通过引用传递变量 . out 是为函数声明辅助 return value . 就像你可以这样写:

    // This is not C#
    public (bool, string) GetWebThing(string name, ref Buffer paramBuffer);
    
    // This is C#
    public bool GetWebThing(string name, ref Buffer paramBuffer, out string actualUrl);
    

    以下是每种备选方案效果的更详细列表:

    在调用方法之前:

    ref :调用者必须在将参数传递给被调用方法之前设置该值 .

    out :调用方法之前,不需要调用方法来设置参数的值 . 最有可能的,你不应该 . 实际上,任何当前值都被丢弃 .

    通话期间:

    ref :被调用的方法可以随时读取参数 .

    out :被调用的方法必须在读取之前初始化参数 .

    远程电话:

    ref :当前值被编组到远程调用 . 额外的性能成本 .

    out :没有任何内容传递给远程调用 . 快点 .

    从技术上讲,您可以使用 ref 代替 out ,但 out 可以让您更准确地了解参数的含义,有时它可以更有效率 .

  • 1

    OUT的示例:变量在进入方法后初始化值 . 稍后,相同的值将返回到main方法 .

    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

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

    Ref:Variable的示例应该在进入方法之前初始化 . 稍后相同的值或修改后的值将返回到main方法 .

    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

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

    希望现在清楚 .

  • 0

    参考和输出参数:

    outref 参数用于返回同一变量中的值,并将其作为方法的参数传递 . 当您的方法需要返回多个值时,这两个参数都非常有用 .

    您必须在calee方法体中为out参数赋值,否则该方法将不会被编译 .


    参数参数:必须在传递给方法之前进行初始化 . 方法参数上的ref关键字使方法引用作为同一方法的输入参数传递的同一变量 . 如果对变量进行任何更改,它们将反映在变量中 . int sampleData = 0;
    sampleMethod(ref sampleData);

    Ex of Ref Parameter

    public static void Main() 
    { 
     int i = 3; // Variable need to be initialized 
     sampleMethod(ref i );  
    }
    
    public static void sampleMethod(ref int sampleData) 
    { 
     sampleData++; 
    }
    

    Out参数:在传递给Method之前无需初始化 . 出局参数可用于返回作为方法参数传递的同一变量中的值 . 对参数所做的任何更改都将反映在变量中 . int sampleData;
    sampleMethod(out sampleData);

    Ex of Out Parameter

    public static void Main() 
    { 
     int i, j; // Variable need not be initialized 
     sampleMethod(out i, out j); 
    } 
    public static int sampleMethod(out int sampleData1, out int sampleData2) 
    { 
     sampleData1 = 10; 
     sampleData2 = 20; 
     return 0; 
    }
    

  • 9

    出:

    在C#中,方法只能返回一个值 . 如果要返回多个值,可以使用out关键字 . out修饰符作为引用返回返回 . 最简单的答案是关键字“out”用于从方法中获取值 .

    • 您无需初始化调用函数中的值 .

    • 您必须在被调用函数中分配值,否则编译器将报告错误 .

    ref:

    在C#中,当您将一个值类型(如int,float,double等)作为参数传递给method参数时,它将按值传递 . 因此,如果修改参数值,则不会影响方法调用中的参数 . 但是如果用“ref”关键字标记参数,它将反映在实际变量中 .

    • 您需要在调用函数之前初始化变量 .

    • 不必为方法中的ref参数赋值 . 如果您不更改该值,需要将其标记为“ref”?

  • 1

    不需要在函数中设置Ref参数,而在退出函数之前必须将out参数绑定到一个值 . 作为输出传递的变量也可以在不初始化的情况下传递给函数 .

  • 4

    out 指定参数是输出参数,即在方法明确设置之前它没有值 .

    ref 指定该值是具有值的引用,并且可以在方法内更改其值 .

  • 15

    out 参数由被调用的方法初始化, ref 参数在调用方法之前被初始化 . 因此,当您只需要获取辅助返回值时,将使用 out 参数, ref 参数用于获取值并可能返回对该值的更改(其次返回主返回值) .

  • 4

    ref关键字用于通过引用传递值 . (这并不排除传递的值是值类型或引用类型) . 使用out关键字指定的输出参数用于从方法返回值 .

    代码中的一个关键区别是您必须在方法中设置输出参数的值 . 这不是ref参数的情况 .

    有关详细信息,请查看http://www.blackwasp.co.uk/CSharpMethodParameters.aspx

  • 0

    out 参数是 ref 参数,添加了特殊的 Out() 属性 . 如果将C#方法的参数声明为 out ,则编译器将要求在读取参数之前和方法返回之前写入参数 . 如果C#调用其参数包含 Out() 属性的方法,则为了决定是否报告"undefined variable"错误,编译器将假定在调用方法之前立即写入变量 . 请注意,由于其他.net语言不会将相同的含义附加到 Out() 属性,因此调用具有 out 参数的例程可能会使有问题的变量不受影响 . 如果变量在明确赋值之前用作 out 参数,则C#编译器将生成代码以确保它在使用之前的某个时刻被清除,但如果这样的变量离开并重新进入范围,则无法保证它将再次被清除 .

  • 0

    ref可能会因为它可能会修改现有对象而阻塞null . out期望null,因为它返回一个新对象 .

  • 6

    out和ref完全相同,除了在将变量发送到深渊之前不必初始化out变量 . 我不那么聪明,我从MSDN库中删除了:) .

    但是,为了更明确地使用它们,修饰符的含义是如果你在代码中更改了该变量的引用,out和ref将导致你的调用变量也改变引用 . 在下面的代码中,ceo变量将在从doStuff调用返回后引用newGuy . 如果不是ref(或out),则不会更改引用 .

    private void newEmployee()
    {
        Person ceo = Person.FindCEO();
        doStuff(ref ceo);
    }
    
    private void doStuff(ref Person employee)
    {
        Person newGuy = new Person();
        employee = newGuy;
    }
    
  • 0

    这个The out and ref Paramerter in C#有一些很好的例子 .

    概述的基本差异是 out 参数在传入时不需要初始化,而ref参数则不需要 .

  • 82

    当在方法声明中声明out parameter时,方法体应在返回之前为out变量赋值 . 因此,被调用方法的责任是在返回之前将值分配给out参数 .

    当在方法中声明ref parameter时,在调用方法时传递的参数应该已赋值 . 因此,在调用方法之前,调用者有责任为ref参数赋值 .

  • 124

    out已经在C#7 https://docs.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7#more-expression-bodied-members中获得了一个新的更多succint语法,更令人兴奋的是C#7元组增强功能比使用ref和out IMHO更优雅 .

相关问题