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