ToolMy问题当我想在列表中添加新项目时,此项目会覆盖所有其他项目。
public static List<Tool_OP> list = new List<Tool_OP>();
BinaryReader fs = new BinaryReader(File.Open(FileName, FileMode.Open));
do
{
Tool_OP item = new Tool_OP();
if (!item.ReadRecord(fs)) break;
list.Add(item);
} while (true);
fs.Close();
这是我的记录课的一部分。我的记录是正确的,当我debbug。我不知道为什么我的列表每次添加覆盖所有项目与我的实际项目。我有一个ReadString方法来从我的二进制文件中获取字符串。
class Tool_OP
{
public static string comment;
public static long op_idn;
public static string ReadString(int max, BinaryReader fs)
{
byte[] Buf = new byte[max];
string NewStr = "";
Buf = fs.ReadBytes(max);
for (int ii = 0; ii < max; ii++)
{
if (Buf[ii] == 0) return NewStr;
NewStr = NewStr + Convert.ToChar(Buf[ii]);
}
return NewStr;
}
public Boolean ReadRecord(BinaryReader fs)
{
comment = ReadString(120, fs);
op_idn = fs.ReadInt32();
}
}
答案 0 :(得分:1)
由于您说问题是所有记录都有相同的数据(在您的评论中),问题在于您正在修改对象的同一实例,然后在列表中添加对该对象的另一个引用。
我建议进行一些更改以使代码更清晰:
public static List<Tool_OP> list = new List<Tool_OP>();
BinaryReader fs = new BinaryReader(File.Open(FileName, FileMode.Open));
bool isValidReadRecord = true;
while(isValidReadRecord)
{
Tool_OP item = new Tool_OP();
isValidReadRecord = item.ReadRecord(fs);
if(isValidReadRecord)
{
list.Add(item);
}
};
fs.Close();
这里的关键变化是我们没有看起来像开放式循环的东西。你有一个明确的条件来结束循环。与我最初看到的相比,Tool_OP item
每次都被实例化。 Tool_OP item = new Tool_OP();
如果此时每条记录都有相同的数据,那么您需要查看Tool_OP
如何存储数据。如果信息存储在static
字段或属性中,那么他们将拥有来自item.ReadRecord()
的最新数据。
事实上,通过编辑,它变得非常清晰!删除static
关键字:
class Tool_OP
{
public string comment;
public long op_idn;
}
static
关键字表示您的班级在整个运行时间中都有该字段的一个定义。它们实际上是全球价值观。如果您真的打算在所有类的实例之间共享数据,请仅使用static
。
答案 1 :(得分:0)
非常感谢所有人......
现在它在Tool_OP类和清晰代码中没有静态工作!