C#是否支持inout参数?

C#是否支持inout参数?,c#,function,parameters,out,C#,Function,Parameters,Out,在C#中,我使用StreamReader读取文件,每行读取一行。我还将当前行的编号保存在int中,以便报告可能的错误消息 阅读每一行都需要进行一些测试(例如,以#开头的行是注释,需要跳过),因此我计划将整个阅读过程放在一个函数中,该函数将一直阅读,直到遇到有用的行,然后返回该行。如果遇到EOF,它只会返回null 当我将这个函数定义为string read(StreamReader sr,out int lineNumber)时,我认为我很聪明,但现在发现C#无法在该函数中执行类似lineNum

在C#中,我使用
StreamReader
读取文件,每行读取一行。我还将当前行的编号保存在
int
中,以便报告可能的错误消息

阅读每一行都需要进行一些测试(例如,以
#
开头的行是注释,需要跳过),因此我计划将整个阅读过程放在一个函数中,该函数将一直阅读,直到遇到有用的行,然后返回该行。如果遇到
EOF
,它只会返回
null

当我将这个函数定义为
string read(StreamReader sr,out int lineNumber)
时,我认为我很聪明,但现在发现C#无法在该函数中执行类似
lineNumber++
的操作。它假设变量尚未赋值,可能是因为它无法知道在调用函数之前是否已赋值


所以,问题很简单:我如何指定这个变量是一个
inout
参数(我想这就是这个术语;我听说在其他编程语言的上下文中提到过它)?一开始这可能吗我绝对不会让
lineNumber
成为我的类的成员,因此这不是一个选项。

在这种情况下,您需要
ref
参数,而不是
out
。使用
out
关键字,赋值/实例化值的责任在于调用被调用的方法;使用
ref
时,它位于所调用的方法之外


另请参见:

使用ref关键字而不是out。这将强制调用方在调用之前初始化参数

必须首先初始化传递给ref参数的参数。 将其与out参数进行比较,其参数不必为 在传递给out参数之前显式初始化

裁判是你需要的

MSDN

方法参数上的ref method parameter关键字会导致方法错误 引用传递到方法中的同一变量。任何 对方法中的参数所做的更改将反映在 控件传回调用方法时的变量


正如大家所说,您只需使用
ref

我将建议一种替代方法,让您知道

您可以编写一个返回
IEnumerable
的方法,其中
Line
是一个非常简单的类,它只封装了一行文本和一个行号:

public class Line
{
    public string Text;
    public int    Number;
}
然后,您读取行的方法可能如下所示:

public IEnumerable<Line> ReadLines(StreamReader sr)
{
    int number = 0;

    while (true)
    {
        string line = sr.ReadLine();

        if (line == null)
            break;

        ++number;

        if (wantLine(line)) // Some predicate which decides if you want to keep the line.
            yield return new Line{Text = line, Number = number};
    }
}

这需要编写更多的工作,但我认为它可以生成更清晰的代码,而且它还有一个优点,即行号计数器完全隐藏在
ReadLines()中。(它不是类的成员,因为它是类中的一个字段;它只是方法中的一个局部变量。)

定义它为ref更多这里您要寻找的是ref参数:c中的
inout
的等价物是
ref
<代码>输出
也是一个方便的方法。这就是你要找的吗?太棒了!这就是我要找的。非常感谢。:)
public void Test()
{
    StreamReader sr = new StreamReader("Whatever");

    foreach (var line in ReadLines(sr))
    {
        if (line.Text == "SomeSpecialValue")
            doSomethingWith(line.Text, line.Number);
    }
}