我正在使用VS 2013中的C#创建一个小文件解析控制台应用程序。我正在使用StreamReader
读取文件,并通过解析行来从文件中的数据创建对象。
我调用一个方法CreateHeader()
来创建一个Header对象并传递StreamReader
对象来读取这些特定的行,创建一个Header对象,并将该对象返回给调用方法。我通过引用传递StreamReader
对象,因为我希望在调用方法中更新StreamReader
以获取CreateHeader()
方法停止的文件中的下一行。但是,当对象返回到调用方法时,StreamReader
对象未更新,并且在调用CreateHeader()
方法时它仍与文件位于同一行。
如何将StreamReader
对象传递给另一个函数并在调用函数中更新StreamReader
?以下是一些示例代码:
static Header CreateHeader(ref StreamReader sr)
{
Header hd = new Header();
string formTitle = string.Empty;
string[] words;
string _line = string.Empty;;
for(int x = 0; x < 5; x++)
{
_line = sr.ReadLine();
Console.WriteLine(_line);
}
}
static void ParseLines()
{
Header _hd = CreateHeader(ref sr);
_line = sr.ReadLine();
prodList = new List<InventoryActivityProducts>();
}
答案 0 :(得分:3)
首先,您在示例中使用StreamReader
的方式(无论ref
如何)它应该执行您要实现的目标。由于您未在示例中初始化流阅读器(sr
),因此错误可能在您未显示的内容中。在任何一种情况下,流阅读器都在内部保留一个Position
属性,该属性指示它接下来应该在流中读取的位置。如果不修改此属性,读者只需从中断处继续。
其次,这种行为是可能的,因为流阅读器是引用类型。如果不太深入,这意味着当您将读取器的实例传递给方法时,它会传递方法驻留在内存中的地址(类似于0x0FA7230
);这与值类型形成对比,其中实例按值传递(变量的实际值,如4
)。因此,当您在流阅读器上调用ReadLine
时,它在与外部方法相同的实例上调用该方法(因此它应该按照您的意图工作)。使用ref
完全是一个略微不同的概念(不幸的是,它代表引用)。使用ref
传递变量(无论它是引用还是值类型)都会传递变量的地址(注意,不是实例的地址),或者实际上是地址引用类型的地址和值类型的值的地址。当您想要在内部方法中初始化变量并在外部方法中使用结果时(这实际上是从方法返回多个值的另一种方式),这非常有用;但除此之外,你很可能不需要使用它。