0

我正在制作一个程序,可以让你掷出五种不同类型的多边“骰子”,当你掷出一个数字时,我希望它把它存储在一个文本文件中。在我的表单顶部有一个菜单条项目,您可以单击它,它会关闭 StreamWriter 和 FileStream 并打开第二个表单,显示滚动的数字以及滚动的骰子(我只知道滚动的数字现在为简单起见),它显示得很好。但是当我关闭 Reader、Stream 和第二个表单并返回到第一个表单时,我尝试重新打开 Writer 和 Stream,它告诉我已经在使用中。

我的第一个表格的代码:

using System;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private Random ran = new Random();
        static FileStream outFile = new FileStream(@"H:\C#\Independant Projects\VirtualDice\History.txt", FileMode.OpenOrCreate, FileAccess.Write);
        StreamWriter writer = new StreamWriter(outFile);

        private int ranNum;

        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            ranNum = ran.Next(1, 21);
            Display();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ranNum = ran.Next(1, 13);
            Display();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            ranNum = ran.Next(1, 5);
            Display();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            ranNum = ran.Next(1, 9);
            Display();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            ranNum = ran.Next(1, 11);
            Display();
        }
        private void Display()
        {
            lblNum.Text = String.Format("{0}", ranNum);
            lblNum.Visible = true;
            writer.WriteLine(ranNum);
        }

        private void historyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            tabControl1.SelectedIndex = 1;
            writer.Close();
            outFile.Close();
            History history = new History();
            history.ShowDialog();
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            FileStream outFile = new FileStream(@"H:\C#\Independant Projects\VirtualDice\History.txt", FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter writer = new StreamWriter(outFile);
            tabControl1.SelectedIndex = 0;
        }
    }
}

我的第二种形式的代码:

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class History : Form
    {
        public History()
        {
            InitializeComponent();
        }

        static private FileStream inFile = new FileStream(@"H:\C#\Independant Projects\VirtualDice\History.txt", FileMode.Open, FileAccess.Read);
        private StreamReader reader = new StreamReader(inFile);

        private void History_Load(object sender, EventArgs e)
        {
            string item;

            item = reader.ReadLine();
            try
            {
                lstHistory.Items.Add(item);
            }
            catch (Exception)
            {
                lstHistory.Font = new Font(lstHistory.Font.Name, 12, lstHistory.Font.Unit);
                lstHistory.Items.Add("You have not rolled any numbers");
            }
        }
    }
}
4

1 回答 1

1

完成后,您需要正确释放非托管资源(在您的情况下为文件)。完成后调用该Dispose()函数stream

if(inFile != null){
    inFile.Dispose();
}

更好的是,将其包装成using()这样:

using(FileStream outFile = new FileStream(@"H:\C#\Independant Projects\VirtualDice\History.txt", FileMode.OpenOrCreate, FileAccess.Write)){
    StreamWriter writer = new StreamWriter(outFile);
    tabControl1.SelectedIndex = 0;
}

usingDispose()将在正确的时间以正确的方式自动调用您(即,它null在调用对象之前检查对象是否是第一个Dispose()以避免“空异常”)。检查此链接以获取有关 using 语句的更多详细信息

但是,如果您在很多地方都有相同的代码,那么将它包装在一个singleton模式中可能是值得的。查看这篇关于如何在 C# 中编写单例模式的 Microsoft 文章

于 2015-10-29T15:57:32.140 回答