在我最后一次嘗試每個添加部分時,它會在 data.txt 上添加 3x 資料
我認為我可以保存我的解構式方法,但它不起作用。
資料格式由 3 個字串運算式組成,例如:日期 足球隊 國家
這是我的 DataStrucor 類的一部分
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);
}
}
}
uj5u.com熱心網友回復:
解構式(也稱為 Finalizer)的問題在于,當物件超出范圍并被垃圾收集器收集時會呼叫它。
這意味著與其他一些語言相比,C# 的作業方式有所不同。
目的是清理和釋放任何資源,通常在解構式中這應該是未處理的資源。這意味著您不應該執行“業務邏輯”,例如在解構式中寫入檔案。
也不能保證解構式會被呼叫或何時被呼叫。因為 GC 不一定會在物件超出范圍的那一刻銷毀它們,而是等到方便時才銷毀。
還有其他幾篇關于此的帖子,如果您愿意,您可以更詳細地閱讀,其他人對此的解釋比我好得多!
為什么我的解構式永遠不會運行?
我應該什么時候創建解構式?
那么你應該如何解決這個問題呢?
好吧,閱讀這些帖子,您會發現更好的解決方案是使用 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.
uj5u.com熱心網友回復:
由于應用程式關閉,您的解構式可能根本不會被呼叫。
使用FormClosing事件。
在這里閱讀更多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389788.html
上一篇:WinForm第一次未加載
