【问题标题】:C# Streamwriter enabling by button通过按钮启用 C# Streamwriter
【发布时间】:2020-05-03 17:23:13
【问题描述】:

我想创建一个应用程序,我可以在其中创建文件,通过单击按钮向其中写入内容,然后通过单击另一个按钮关闭此文件。问题是,当我在一个按钮中声明 Streamwrtier 对象时,我无法从第二个按钮中调用文件关闭方法,因为我遇到了这样的错误:当前上下文中不存在名称“文件”。当我在按钮方法之外启动 Streamwriter 时,问题消失,但是在我单击按钮之前正在创建文件。你知道我该如何克服这个问题吗?

    public void button1_Click(object sender, EventArgs e)
    {
        button1.Visible = false;
        button2.Visible = true;
        StreamWriter file = new StreamWriter("test.txt");
        file.WriteLine(value.ToString());

    }
    private void button2_Click(object sender, EventArgs e)
    {
        button1.Visible = true;
        button2.Visible = false;
        file.Close();
    }

【问题讨论】:

  • 出现的问题是button2_Click方法中的变量file不是"in scope"

标签: c# button streamwriter


【解决方案1】:

这是基本修复:

private StreamWriter file = null;
public void button1_Click(object sender, EventArgs e)
{
    button1.Visible = false;
    button2.Visible = true;
    if (file == null)
        file = new StreamWriter("test.txt");
    file.WriteLine(value.ToString());
}
private void button2_Click(object sender, EventArgs e)
{
    button1.Visible = true;
    button2.Visible = false;
    if (file is object) 
        file.Close();
}

但实际上,在大多数情况下保持文件处于打开状态是一种糟糕的做法。您通常需要更像这样的东西,它一次性处理打开和关闭必要的流,并且只在最短的必要时间内保持文件打开:

public void button1_Click(object sender, EventArgs e)
{
    File.AppendAllText("test.txt", value.ToString());
}

而且由于我们总是立即关闭文件,因此根本不需要第二个按钮。

【讨论】:

  • if (file is object) 是一个有趣的检查,你能解释一下如何检查流是否打开/需要关闭吗?
  • @RonBeyer 这只是一个更好的“现代”替代传统的幼稚!= null 测试。我是从微软 C# 语言团队的Jared Parsons 那里得到的。真的,这应该通过IDisposable 或我的第二个 sn-p 来处理,但是小步。
  • 不知为何比file?.Close()好?
  • 那也可以。我没有 ?. 运算符扩展的确切方式,但我相信 Jared 更喜欢 is object 因为诸如(但不限于)!= 运算符重载等问题。
  • 欣赏解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
相关资源
最近更新 更多