如何将我的数据保存在 .txt 文件中,析构函数不起作用?
How do I save my data on .txt file, destructor doesn't work?
在我最后一次尝试添加部分时,它在 data.txt
上添加了 3 倍的数据
我认为我可以在我的析构函数方法上进行保存,但它不起作用。
数据格式由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);
}
}
}
析构函数(也称为终结器)的问题在于当对象超出范围并被垃圾收集器收集时调用它。
这意味着 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
然后我们看到关闭表单/应用程序时有多个选项,因此您可以select选择适合您的那个。
我建议,如果需要取消关闭表单(比如写入失败),那么使用Form.Closing
。否则使用 Form.Closed
.
由于应用程序关闭,您的析构函数可能根本不会被调用。
使用 FormClosing
事件。
在我最后一次尝试添加部分时,它在 data.txt
上添加了 3 倍的数据我认为我可以在我的析构函数方法上进行保存,但它不起作用。
数据格式由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);
}
}
}
析构函数(也称为终结器)的问题在于当对象超出范围并被垃圾收集器收集时调用它。
这意味着 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
然后我们看到关闭表单/应用程序时有多个选项,因此您可以select选择适合您的那个。
我建议,如果需要取消关闭表单(比如写入失败),那么使用Form.Closing
。否则使用 Form.Closed
.
由于应用程序关闭,您的析构函数可能根本不会被调用。
使用 FormClosing
事件。