11

我是 C# 新手。我已经在 C# 中使用 out 参数尝试过这个

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'”
必须在控制离开当前方法之前分配输出参数'm'。

那么这些错误的含义是什么以及为什么当我已经为x赋值时必须分配“ m ” 。

4

5 回答 5

21

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

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

于 2013-09-28T13:48:04.757 回答
5

您收到错误是因为作为参数发送到方法的变量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);
    }
}
于 2013-09-28T13:47:04.630 回答
2

out参数用于函数想要自身传递值时。你想要的是ref,这是函数期望它被传入但可以更改它的时候。

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

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

于 2013-09-28T13:46:40.737 回答
2

从 C# 7.0 开始,引入了在变量作为输出参数传递时声明变量的能力。

前:

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!"); }
}

更多信息可以在这里找到。此链接不仅是关于out 参数,而且是关于c# 7.0中引入的所有新特性

于 2016-08-27T15:04:04.647 回答
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
}
于 2013-09-28T14:21:18.240 回答