我有一个类正在创建一个名为制造商的对象列表.我使用XML文件来创建存储在名为ManufacturerList的阵列中的对象.
以下是ManufacturerImport类的代码.这是我创建对象的地方.
private List<Manufacturer> ManufacturerList = new List<Manufacturer>();
public void AddManufacturer(Manufacturer manu)
{
ManufacturerList.Add(manu);
}
public List<Manufacturer> GetManufacturers()
{
return ManufacturerList;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我需要将此列表传递给我的代码的其他部分,因此我有一个GetManufacturers功能.
在我的Main函数中,我使用以下代码:
List<Manufacturer> mList = ManuImport.GetManufacturers();
TextWriter tw = new StreamWriter(@"C:\manu.txt");
foreach (Manufacturer manu in mList)
{
//Output name to txt file.
tw.WriteLine(manu.ManufacturerName);
Console.WriteLine(manu.ManufacturerName);
Console.WriteLine(manu.ShortManufacturerName);
Console.WriteLine(manu.ManufacturerDirectory);
Console.WriteLine(manu.ManuId);
Console.WriteLine("------------------------");
}
//Forgot to include this in example. Has been in code from beginning. sorry for confusion
tw.Close();
Run Code Online (Sandbox Code Playgroud)
我调试了代码,发现列表已成功复制到mList.关于mList列表如何包含我需要的所有对象,我有点困惑但是当我单步执行列表时,我得不到正确的输出.
我的列表有486个对象,但输出只将其中的333个写入txt文件.同样奇怪的是控制台输出不同的制造商到列表中.
任何想法都会很棒.
干杯
您需要将TextWriter对象括在一个using块中.
List<Manufacturer> mList = ManuImport.GetManufacturers();
using(TextWriter tw = new StreamWriter(@"C:\manu.txt"))
{
foreach (Manufacturer manu in mList)
{
//Output name to txt file.
tw.WriteLine(manu.ManufacturerName);
Console.WriteLine(manu.ManufacturerName);
Console.WriteLine(manu.ShortManufacturerName);
Console.WriteLine(manu.ManufacturerDirectory);
Console.WriteLine(manu.ManuId);
Console.WriteLine("------------------------");
}
}
Run Code Online (Sandbox Code Playgroud)
有两个原因:
首先,从根本上讲,TextWriter实现IDisposable,这意味着你应该在完成对象时总是调用Dispose().usingC#和VB.NET中的块是特定于语言的机制,用于确保Dispose调用它.对于所有实现的对象都是如此IDisposable,因此查看代码的其他区域以及您正在使用的其他框架对象可能是个好主意,以确保您遵循此模式.您可能需要特别注意的一些事项是:
其次,对于这种特殊情况,TextWriter该类缓冲了被写入的数据(例如,如果您一次将数据写入一个字符,那么每个字符都没有磁盘IO,因为它以"块"形式存在").因此,必须刷新缓冲区才能将数据写入磁盘.这种情况发生在三种情况下
TextWriter可以通过调用Close()或关闭它们Dispose()Flush()第一个你无法控制,因为它是自动的.后者应该是一种特殊情况,您希望所有缓冲数据立即写入磁盘,但仍希望保持编写器打开.第二种情况 - 最重要的 - 就是你所缺少的.