【问题标题】:How do I save my data on .txt file, destructor doesn't work?如何将数据保存在 .txt 文件中,析构函数不起作用?
【发布时间】:2022-01-18 07:17:54
【问题描述】:

在我最后一次尝试每个添加部分时,它会在 data.txt 中添加 3 倍数据

我认为我可以保存我的析构方法,但它不起作用。

数据格式由3个字符串表达式组成:日期+足球队+国家

这是我的 DataStructor 类中的一部分

takimlar.Add("1905", "GS", "TR");


internal class Node
        {
            internal T ulke;
            internal T takim;
            internal T tarih;
            internal Node next = null;
            internal Node pre = null;
            internal Node(T tarih, T takim, T ulke)
            { this.tarih = tarih; this.takim = takim; this.ulke = ulke; }
        }
internal IEnumerable<string> GetEnumerator()
        {
            for (Node traveler = first; traveler != null; traveler = traveler.next)
               yield return $"{traveler.tarih},{traveler.takim},{traveler.ulke}";
        }
internal IEnumerable<Node> GetEnumeratorNodeUlke(T ulke)
        {
            for (Node traveler = first; traveler != null; traveler = traveler.next)
                if (traveler.ulke.Equals(ulke))
                    yield return traveler;
        }

如何解决?

using System;
using System.Windows.Forms;
using System.IO;
using System.Linq;
using System.Collections.Generic;

namespace TAKIM_ULKE
{
    internal partial class MainForm : Form
    {
        AdderForm adderForm = new AdderForm();
        static string filePath = @"C:\Users\nevfe\source\repos\TAKIM_ULKE\TAKIM_ULKE\bin\Debug\netcoreapp3.1\data.txt";
        List<string> lines = new List<string>();
        List<string> output = new List<string>();
        
        internal MainForm()
        {
            InitializeComponent();

            lines = File.ReadAllLines(filePath).ToList();
            foreach (string line in lines)
            {
                string[] entries = line.Split(',');
                adderForm.takimlar.Add(entries[0], entries[1], entries[2]);
            }

            foreach (var item in adderForm.takimlar.GetEnumeratorUlke())      //Ülkeleri listele
                ulkeComboBox.Items.Add(item);
        }
        ~MainForm()
        {
            foreach (string item in adderForm.takimlar.GetEnumerator())
                if (!lines.Contains(item))
                    output.Add(item);

            File.WriteAllLines(filePath, output);
        }
     }
}

【问题讨论】:

  • Handel 在表单关闭事件上保存数据,而不是在表单被垃圾收集且未关闭时调用的析构函数

标签: c# winforms


【解决方案1】:

析构函数(也称为终结器)的问题在于,当对象超出范围并被垃圾收集器收集时,它会被调用。

这意味着与其他一些语言相比,C# 的工作方式不同。

目的是清理和释放任何资源,通常在析构函数中这应该是未处理的资源。这意味着您不应该执行“业务逻辑”,例如在析构函数中写入文件。

也不能保证析构函数将被调用或何时被调用。因为 GC 不一定会在对象超出范围的确切时刻销毁对象,而是等到方便时再销毁。

还有其他几篇关于此的帖子,如果您愿意,可以阅读更详细的内容,其他人对此的解释比我好得多!

Why does my destructor never run?

When should I create a destructor?

那么你应该如何解决这个问题?

好吧,阅读帖子,您会发现更好的解决方案是使用 IDispose 模式。但这也确实是为了在您完成对象后进行清理。由于您仍然需要执行业务逻辑,那么恕我直言,这仍然不是正确的地方。

那么您应该查看 Winform 的事件。因此,如果我们在这里查看 Winform 生命周期https://docs.microsoft.com/en-us/dotnet/desktop/winforms/order-of-events-in-windows-forms?view=netframeworkdesktop-4.8

然后我们看到我们在关闭表单/应用程序时有几个选项,因此您可以选择适合您的一个。

我建议,如果您需要取消表单关闭(例如,如果写入失败),请使用Form.Closing。否则使用Form.Closed

【讨论】:

    【解决方案2】:

    由于应用程序关闭,您的析构函数可能根本不会被调用。
    使用FormClosing 事件。

    Read more here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      相关资源
      最近更新 更多