所以我正在尝试为教育目的编写一个简单的代码,它从文本框中获取一个字符串并将其写入txt文件。每次第二次按下按钮时,都会收到以下错误消息:Error Message
以下是代码:
StreamWriter sw = new StreamWriter("somefile.txt");
private void button1_Click(object sender, EventArgs e)
{
string textBoxStuff = textBox1.Text;
textBox1.Text = "";
using (sw)
{
sw.WriteLine(textBoxStuff);
}
}
答案 0 :(得分:1)
你可能已经在其他地方调用了StreamWriter上的dispose。
您可以尝试此操作(使用尚未处置的新实例):
private void button1_Click(object sender, EventArgs e)
{
string textBoxStuff = textBox1.Text;
textBox1.Text = "";
using (var streamWriter = /*create your StreamWriter instance somehow*/)
{
streamWriter.WriteLine(textBoxStuff);
}
}
根据经验,我不会在使用块中放置任何类字段,而只在本地方法变量上使用它。
如果由于某种原因你需要IDispossable字段并且你需要在所有类生命周期中保持它活着,我使类实现IDispossable并且在dispose方法中我调用该字段的dispsoe方法。
答案 1 :(得分:1)
因为您在第一次按下按钮后明确告诉它关闭sw。
using (sw)
{
sw.WriteLine(textBoxStuff);
}
在using()语句的末尾,处理正在使用的对象。所有的使用陈述都是,它基本上是以下语法糖:
try
{
sw.WriteLine(textBoxStuff);
}
finally
{
sw.Dispose();
}
在这种情况下,你的变量sw保持在范围内并且仍可用于按下第二个按钮,但是当调用Dispose()时,按下第一个按钮已经关闭了文件。如果您真的打算在此表单的生命周期内保持文件处于打开状态,那么您不希望在此处使用using
,您希望在更合适的位置处理该对象。
另一个选项是不要在表单的整个生命周期内保持文件打开,而是每次按下按钮时打开和关闭它。在这种情况下,您可以创建一个本地streamwriter对象并将其放在using语句中。
答案 2 :(得分:0)
在尝试显示已关闭的表单时,我收到了相同的错误消息。
以下是解决问题的方法;
if (myForm.IsDisposed)
myForm = new Form();
myForm.Show();
答案 3 :(得分:-1)
检查文本撰写者是否引用了有效文件:
using (TextWriter writer = File.CreateText("C:\\perl.txt")) // Check the file here
{
writer.WriteLine("First line");
}
或
using (TextWriter writer = File.AppendText(path)) // Check the file here
{
writer.WriteLine("First line");
}