以两种方法引用StreamReader

时间:2011-03-23 12:01:45

标签: c# streamreader

对OO来说很新,所以请善待。

我创建了一个方法,当单击button1时,打开文件对话框并将内容读入流读取器sr;

public void button1_Click(object sender, EventArgs e)
    {
        if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            label1.Text = openFileDialog1.FileName;

            StreamReader sr = new StreamReader(label1.Text);
            String strNumVertices = sr.ReadLine();
            label2.Text = strNumVertices;
        }
    }

其他代码在Form1_Paint方法中运行。

public void Form1_Paint(object sender, PaintEventArgs e)

        perspectiveMatrix = new Gmatrix("perspective");
        translationMatrix = new Gmatrix("translation");
        scalingMatrix = new Gmatrix("scaling");

        perspectiveMatrix.initAsPerspectiveMatrix(300);

        scalingMatrix.initAsScalingMatrix(10, 10, 10);

        translationMatrix.initAsTranslationMatrix(150, 50, 1200);

       String strNumVertices = sr.ReadLine();
        label1.Text = strNumVertices;

我的问题是,如何从Form1_paint方法中的button1_click方法引用流阅读器sr?

5 个答案:

答案 0 :(得分:4)

建议 - 不要尝试。

如果这样做,您就有可能在整个地方打开文件/流。

我建议你在每种方法中打开一个新的蒸汽读取器(或将其抽象为自己的方法)。

注意:

您应该在using语句中打开流的开头,以确保妥善处置:

using(StreamReader sr = new StreamReader(label1.Text))
{
   String strNumVertices = sr.ReadLine();
   label2.Text = strNumVertices;
}

答案 1 :(得分:1)

实际上,在每次绘画运行期间从流中读取应该不是最好的主意。也许你想读取一次值,将它存储在表单的成员变量中,并在paint方法中访问?

答案 2 :(得分:1)

除非您希望文件在按钮单击和被调用的paint方法之间发生更改,否则无论如何都不应该再次从文件中读取文件。

与将结果存储在字段中并在绘制方法中进行检索相比,读取文件在性能方面非常昂贵。或者反之亦然,取决于首先执行的操作。

答案 3 :(得分:0)

为什么不直接存储您从文件中读取的数据并重新使用它而不是再次读取文件?我假设这些方法属于同一个类(和对象的相同实例),但如果不是这样的话,有办法解决这个问题。

private string StrNumVertices { get; set; }


public void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        label1.Text = openFileDialog1.FileName;

        StreamReader sr = new StreamReader(label1.Text);
        this.StrNumVertices = sr.ReadLine();
        label2.Text = this.StrNumVertices;
    }
}

public void Form1_Paint(object sender, PaintEventArgs e)

    perspectiveMatrix = new Gmatrix("perspective");
    translationMatrix = new Gmatrix("translation");
    scalingMatrix = new Gmatrix("scaling");

    perspectiveMatrix.initAsPerspectiveMatrix(300);

    scalingMatrix.initAsScalingMatrix(10, 10, 10);

    translationMatrix.initAsTranslationMatrix(150, 50, 1200);

    label1.Text = this.StrNumVertices;

    ...
}

如果它不是对象的同一实例,那么我会考虑使用Singleton配置对象(或缓存)并在那里存储数据。当然,这取决于数据的范围和生命周期 - 它是否适用于整个应用程序或仅适用于此实例?当然,最好的方法是使它成为像上面这样的实例属性,我认为这样可行,但是如果你要重新创建对象,你将不得不使用不同的技术。

如果您确实想要再次读取文件(因为数据来自不同的行),您需要重新使用该流,或者再一次读取所有数据 - 如果可能的话 - - 然后遍历你在内部阅读的项目。

答案 4 :(得分:0)

使其成为表单类的字段。这会将范围从方法更改为整个表单。上一篇文章的警告仍然有效。

StreamReader sr;
public void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        label1.Text = openFileDialog1.FileName;

        sr = new StreamReader(label1.Text);
        String strNumVertices = sr.ReadLine();
        label2.Text = strNumVertices;
    }
}

public void Form1_Paint(object sender, PaintEventArgs e)

    perspectiveMatrix = new Gmatrix("perspective");
    translationMatrix = new Gmatrix("translation");
    scalingMatrix = new Gmatrix("scaling");

    perspectiveMatrix.initAsPerspectiveMatrix(300);

    scalingMatrix.initAsScalingMatrix(10, 10, 10);

    translationMatrix.initAsTranslationMatrix(150, 50, 1200);

    if (sr != null) {
       String strNumVertices = sr.ReadLine();
       label1.Text = strNumVertices;
    }