列出之前所有位置的覆盖数据

时间:2016-05-02 19:35:02

标签: c#

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

2 个答案:

答案 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类和清晰代码中没有静态工作!