通过引用传递StreamReader对象

时间:2014-05-30 13:52:09

标签: c# iostream streamreader

我正在使用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>();
}

1 个答案:

答案 0 :(得分:3)

首先,您在示例中使用StreamReader的方式(无论ref如何)它应该执行您要实现的目标。由于您未在示例中初始化流阅读器(sr),因此错误可能在您未显示的内容中。在任何一种情况下,流阅读器都在内部保留一个Position属性,该属性指示它接下来应该在流中读取的位置。如果不修改此属性,读者只需从中断处继续。

其次,这种行为是可能的,因为流阅读器是引用类型。如果不太深入,这意味着当您将读取器的实例传递给方法时,它会传递方法驻留在内存中的地址(类似于0x0FA7230);这与值类型形成对比,其中实例按值传递(变量的实际值,如4)。因此,当您在流阅读器上调用ReadLine时,它在与外部方法相同的实例上调用该方法(因此它应该按照您的意图工作)。使用ref完全是一个略微不同的概念(不幸的是,它代表引用)。使用ref传递变量(无论它是引用还是值类型)都会传递变量的地址(注意,不是实例的地址),或者实际上是地址引用类型的地址和值类型的值的地址。当您想要在内部方法中初始化变量并在外部方法中使用结果时(这实际上是从方法返回多个值的另一种方式),这非常有用;但除此之外,你很可能不需要使用它。