当前位置:  开发笔记 > 编程语言 > 正文

.NET中ref和out参数之间的区别

如何解决《.NET中ref和out参数之间的区别》经验,为你挑选了7个好方法。

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



1> Khoth..:

它们几乎是一样的 - 唯一的区别是你作为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参数,然后返回调用者,这与ref相反,ref必须在调用被调用者之前由调用者设置.
@Mike您的更正错误.这是正确的"使用**out**参数的方法必须将其设置为某种东西." 接收`out`参数的方法必须初始化它.接收`ref`参数的方法可以做到它想要的.它肯定会忽略它.我正在回滚它.
当然,主要区别在于ref是进出的,而out只能用于返回数据.考虑void works(ref int z){Debug.WriteLine(z); }和void notWorks(out int z){Debug.WriteLine(z); 或者我错过了一些技巧,以便在初始化之前获得out param的值?我注意到调试器可以做到这一点.

2> Derek Park..:

为什么C#同时具有'ref'和'out'?

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

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

所以,out意味着,而ref不是进出.

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


"相比之下,ref参数被认为是被调用者最初分配的",当然你的意思是"调用者".我试着编辑你的答案,但它不会让我保存这么小的改变.

3> Euro Micelli..:

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

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

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

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

// 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你可以更准确地说明论证的意义,有时它可以更有效率.



4> 小智..:

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

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

参考示例:应该在进入方法之前初始化变量.稍后相同的值或修改后的值将返回到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

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

希望现在清楚.



5> Brian R. Bon..:

一个ref变量需要通过它在之前被初始化.

一个out变量需要在你的功能实现需要设置

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

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



6> Krishna Thot..:

参考和输出参数:

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

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


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

int sampleData = 0; 
sampleMethod(ref sampleData);

参考参数的例外

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之前不需要初始化.该out参数可用于返回作为方法参数传递的同一变量中的值.对参数所做的任何更改都将反映在变量中.

 int sampleData; 
 sampleMethod(out sampleData);

Out参数

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; 
} 



7> Nazmul Hasan..:

出:

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

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

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

参考:

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

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

在方法中为ref参数赋值不是必须的.如果您不更改值,需要将其标记为"ref"?

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有