簡體   English   中英

如何將我的數據保存在 .txt 文件中,析構函數不起作用?

[英]How do I save my data on .txt file, destructor doesn't work?

在我最后一次嘗試每個添加部分時,它會在 data.txt 上添加 3x 數據

我認為我可以保存我的析構函數方法,但它不起作用。

數據格式由 3 個字符串表達式組成,例如:日期 + 足球隊 + 國家

這是我的 DataStructor class 的一部分

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);
        }
     }
}

析構函數(也稱為終結器)的問題在於,當 object 超出 scope 並被垃圾收集器收集時,會調用它。

這意味着與其他一些語言相比,C# 的工作方式不同。

目的是清理和釋放任何資源,通常在析構函數中這應該是未處理的資源。 這意味着您不應該執行“業務邏輯”,例如在析構函數中寫入文件。

也不能保證析構函數將被調用或何時被調用。 因為 GC 不一定會在他們 go 出 scope 的確切時刻銷毀對象,而是等到方便的時候。

如果您願意,還有其他幾篇關於此的帖子,您可以更詳細地閱讀,其他人對此的解釋比我好得多!

為什么我的析構函數從不運行?

我應該什么時候創建析構函數?

那么你應該如何解決這個問題呢?

好吧,閱讀帖子,您會發現更好的解決方案是使用 IDispose 模式。 但這也是為了在您完成 object 后進行清理而設計的。 由於您仍然需要執行業務邏輯,那么恕我直言,這仍然不是正確的地方。

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

然后我們看到在關閉表單/應用程序時我們有幾個選項,因此您可以選擇適合您的 select。

我建議,如果您需要取消表單關閉(例如,如果寫入失敗),請使用Form.Closing 否則使用Form.Closed

由於應用程序關閉,您的析構函數可能根本不會被調用。
使用FormClosing事件。

在這里閱讀更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM