c#中的out参数

时间:2013-09-28 13:41:16

标签: c# out

我是C#的新手。我用C#

中的参数尝试了这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class First
{
    public void fun(out int m)
    {
        m *= 10;
        Console.WriteLine("value of m = " + m);
    }
}

class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x = 30;
        f.fun(out x);
    }
}

但我收到一些错误,例如“使用未分配的参数'm'”
必须在控件离开当前方法之前指定out参数“m”。

那么这些错误的含义是什么?当我已经为 x 指定了值时,为什么必须指定' m '。

5 个答案:

答案 0 :(得分:18)

ref表示您在调用方法之前传递对已声明 并初始化 的变量的引用,并且该方法可以修改该变量的值。

out表示您在调用方法之前传递对已声明但 尚未初始化 的变量的引用,并且该方法必须在返回之前初始化或设置它的值。

答案 1 :(得分:4)

你得到并且错误,因为在方法调用之前不必初始化作为out参数的变量发送到方法。以下是100%正确的代码:

class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x;
        f.fun(out x);
    }
}

您好像在这里寻找ref而不是out

class First
{
    public void fun(ref int m)
    {
        m *= 10;
        Console.WriteLine("value of m = " + m);
    }
}

class Program
{
    static void Main(string[] args)
    {
        First f = new First();
        int x = 30;
        f.fun(ref x);
    }
}

答案 2 :(得分:2)

out参数适用于函数想要传递自身值 out 的时间。你想要的是ref,这是函数希望传入的时间,但可以改变它。

有关如何使用两者的示例,请阅读http://www.dotnetperls.com/parameter。它用简单的术语解释,你应该能够很好地理解它。

您应该注意,在您的代码中,您永远不会在函数调用之后访问变量,因此ref实际上并没有执行任何操作。其目的是将更改发送回原始变量。

答案 3 :(得分:2)

从C#7.0开始,引入了一个在传递参数时将变量声明为out参数的能力。

在:

public void PrintCoordinates(Point p)
{
    int x, y; // have to "predeclare"
    p.GetCoordinates(out x, out y);
    WriteLine($"({x}, {y})");
}

C#7.0

public void PrintCoordinates(Point p)
{
    p.GetCoordinates(out int x, out int y);
    WriteLine($"({x}, {y})");
}

您甚至可以使用var关键字:

p.GetCoordinates(out var x, out var y);

注意out参数的范围。例如,在以下代码中,“i”仅在 if-statement 中使用:

public void PrintStars(string s)
{
    if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); }
    else { WriteLine("Cloudy - no stars tonight!"); }
}

可以找到更多信息here。此链接不仅涉及输出参数,还包含 c#7.0

中引入的所有新功能

答案 4 :(得分:1)

public void Ref_Test(ref int x)
{
    var y = x; // ok
    x = 10;
}

// x is treated as an unitialized variable
public void Out_Test(out int x)
{
    var y = x; // not ok (will not compile)
}

public void Out_Test2(out int x)
{
    x = 10;
    var y = x; // ok because x is initialized in the line above
}