English 中文(简体)
重提和退出[复制]的问题
原标题:question about ref and out [duplicate]
  • 时间:2008-09-25 18:57:27
  •  标签:
  • c#

<代码>ref和out参数在“NET”之间有何区别? 哪些情况比其他情况更有用? 什么是可使用哪一种法律,而另一个法律则可能失败?

最佳回答

两者大致相同——唯一的区别是,作为<条码>通过的一种变量。 参数不一定需要初步确定,而是通过作为<代码>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)中已经使用某种收益值的数据。

问题回答

为什么C#既得又出面?

采用直线参数的方法的召集人不必在发出呼吁之前指定作为直径的变数;然而,被点人必须在返回前指定为外围参数。

相比之下,反射参数最初由打电话者指定。 因此,用户不必在使用前分配直径。 参照参数既可采用,也可采用一种方法。

因此,out系指不适用,而ref 则在加入或退出。

这些参数与<代码>[out]和[in,out] 相联的界面参数密切对应,即:如果使用该方法不需要预先分配的物体,则电话人不必通过该物体,这既可避免分配费用,又可避免与拆解有关的任何费用(更有可能与COM有关,但网内并不常见)。

<代码>ref和out均允许采用所谓的方法修改参数。 两者的区别在于你发出呼吁之前的

  • <代码>ref系指参数在<>之前具有该功能的价值。 所谓的职能可以随时阅读或改变价值。 参数在上。

  • <代码>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);

下面列出每个备选办法的效果的详细清单:

Before calling the method:

www.un.org/Depts/DGACM/index_spanish.htm 打电话者必须确定参数的价值,然后才能将其应用于所谓的方法。

。 无须使用电传法才能确定论点的价值。 很可能是,你 t。 事实上,任何现值都被弃置。

During the call:

www.un.org/Depts/DGACM/index_spanish.htm 所谓的方法可以在任何时候阅读这一论点。

。 在阅读该参数之前,必须先采用所谓的方法。

Remoted calls:

www.un.org/Depts/DGACM/index_spanish.htm 目前的价值与遥远的呼吁相呼应。 额外履约费用。

。 无人听从遥远的电话。 越快。

从技术上讲,你可以永远使用<代码>ref>代替<编码>>out ,但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

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

希望它现在就清楚了。

  • A ref variable needs to be initialized before passing it in.
  • An out variable needs to be set in your function implementation
  • out parameters can be thought of as additional return variables (not input)
  • ref parameters can be thought of as both input and output variables.

Ref and Out Parameters:

<编码>>out和ref参数用于在相同变量中返还价值,作为方法的论据。 当你的方法需要回归一个以上价值时,这两种参数都非常有用。

你们必须分配价值,在计算仪表体中超出参数,否则,所赢得的电码就会被汇编成册。


Ref Parameter : It has to be initialized before passing to the Method. The ref keyword on a method parameter causes a method to refer to the same variable that was passed as an input parameter for the same method. If you do any changes to the variable, they will be reflected in the variable.

int sampleData = 0; 
sampleMethod(ref sampleData);

<><>Ext>Ref Para amount

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

public static void sampleMethod(ref int sampleData) 
{ 
 sampleData++; 
} 

Out Parameter : It is not necessary to be initialized before passing to Method. The out parameter can be used to return the values in the same variable passed as a parameter of the method. Any changes made to the parameter will be reflected in the variable.

 int sampleData; 
 sampleMethod(out sampleData);

<>>>外围参数:>

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

out:

在C#中,一种方法只能退回一个价值。 如果你想再回一个以上价值的话,你就可以使用这些关键词。 退缩者作为逐项返回。 最简单的答案是,关键词“外出”被用来从这种方法中获得价值。

  • You don t need to initialize the value in the calling function.
  • You must assign the value in the called function, otherwise the compiler will report an error.

ref:

在C#中,当你通过诸如固定、浮动、双重等值时。 作为方法参数的论据,该参数按价值计算。 因此,如果你修改参数价值,则不影响所呼吁方法中的论点。 但是,如果你用“ref”关键词标出参数,就会反映实际变量。

  • You need to initialize the variable before you call the function.
  • It’s not mandatory to assign any value to the ref parameter in the method. If you don’t change the value, what is the need to mark it as “ref”?

参照参数在职能中必须设定,而排除参数在退出职能之前必须具有价值。 超出部分的变量也可在未启动的情况下转至功能。

<代码>out具体规定,参数为产出参数,即该参数在方法明确规定之前无价值。

<代码>ref具体规定,该数值是具有价值的参照,其价值可在方法内改变。

<代码>out参数在使用该方法之前先采用ref参数。 因此,当你刚刚需要获得二级收益价值时,即使用<代码>>>>>>tref。 参数用于获取价值,有可能使这一价值发生变化(通常是主要收益值)。

关键词被用来通过参照值。 (这不排除所传递的价值类型或参考类型。) 关键词中具体规定的产出参数是从某种方法中恢复价值。

守则的一个主要区别是,你必须在方法内确定产出参数的价值。 参照参数的情况并非如此。

详情见。 http://www.blackwasp.co.uk/CSharpMethodParaties.aspx

。 如果C#方法的参数被宣布为out,汇编者将要求该参数在阅读之前和在方法能够返回之前书写。 如果C#使用其参数包括Out()属性的一种方法,则汇编者将为了决定是否报告“未界定的变数”错误,推定变数在使用该方法之前即刻书写。 请注意,由于其他净语文对<代码>Out( i>不赋予同样的含义,因此,用“<代码>>>>>脱参数例行电话可使有关变量不受影响。 如果在无限期分配之前将变数作为<代码>out参数使用,则C#汇编者将产生代码,以确保其在使用之前某个时候予以清除,但如果这种变式休假和再进入范围,则无保证再次予以清除。

反之,很可能是徒劳的,因为它预计会修改现有的物体。 由于它退回了一个新的物体,它预计会是无效的。

除了在将变数排入下方之前不必先入选之外,外变数完全相同。 I m 不是这一智能,我从MSDN图书馆打字。

然而,为了更明确地说明如何使用这些变量,变体的含义是,如果你在你的法典中改变这一变量的提法,就会使你的要求变数发生变化。 在下面的法典中,一旦新古吉人从呼吁中返回,该变量即指新古吉。 如果是拒绝(或撤销)的吨数,则会改变参考线。

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

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

http://www.c-sharpcorner.com/UploadFile/mahesh/out_and_ref112005002102AM/out_and_ref.aspx“rel=” C#>中的散射和反射带有一些好的例子。

概述的基本区别是,<代码>out <>/code>参数在通过时不必先入选,而参照参数确实如此。

差别很大。

<>t>out parafalls在被采用该方法之前不必先由被点名人启动。 因此,任何有<代码>>>>的仪器 参数

  • Cannot read the parameter before assigning a value to it
  • Must assign a value to it before returning

这种方法需要超越其论点,而不管其以前的价值如何。


用户必须先采用ref参数,然后才能将该参数通过。 因此,有<代码>ref的任何方法 参数

  • Can inspect the value before assigning it
  • Can return the original value, untouched

这种方法必须(例如)检查其价值并验证其价值或使之正常化。

out has gotten a new more succint syntax in C#7 https://learn.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7#more-expression-bodied-members and even more exciting is the C#7 tuple enhancements that are a more elegant choice than using ref and out IMHO.





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签