我正在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>();
}
首先,StreamReader
示例中使用的方式(无论使用哪种方式ref
)都应该完成您要实现的目标。由于您没有sr
在示例中初始化流阅读器(),因此错误可能出在您未显示的内容上。在这两种情况下,流读取器都在Position
内部保留一个属性,该属性指示应在流中下一个读取的位置。在不修改此属性的情况下,阅读器将仅从中断处继续。
其次,此行为是可能的,因为流读取器是引用类型。不必太过深入,这意味着当您将读取器的实例传递给方法时,它将传递该方法在内存中所处的地址(类似0x0FA7230
);这与值类型相反,在值类型中,实例通过值(变量的实际值,如4
)传递。因此,当您调用ReadLine
流阅读器时,它将在与外部方法相同的实例上调用该方法(因此,为什么它应该按预期工作)。使用ref
是一个完全不同的概念(不幸的是,它仅供参考)。使用传递变量ref
(无论它是引用还是值类型)都将传递变量的地址(注意,不是实例的地址),或者实际上是引用类型的地址的地址和值类型的值的地址。当您要在内部方法中初始化变量并在外部方法中使用结果时(这实际上是从方法返回多个值的另一种方式),这很有用;但除此之外,您极有可能不需要使用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句