C#引用一个值类型

时间:2011-07-07 05:23:06

标签: c# reference-type

我的程序的主要组件在主线程中运行。该程序能够将用户的工作保存到文件中,但是随着用户的工作,会保存额外的元信息。

示例:

[Serializable]
public Class UserWork
{
  // Lots of things in here. Lots of work user has done, etc...
}

在程序中,我存储了一些诸如设置之类的东西。我们假设它们是bool flag1bool flag2。我有这样的结构:

[Serializable]
public class SavedFile
{
  UserWork userWork;
  bool flag1;
  bool flag2;
}

当我保存时:

saveData(new SavedFile(userWork, flag1, flag2));

加载时:

SavedFile savedFile = SavedFile.Load(path);
UserWork userWork = savedFile.userWork;
bool flag1 = savedFile.flag1;
bool flag2 = savedFile.flag2;

所以基本上,flag1和flag2需要与工作一起保存,但它们不一定属于工作。它们实际上表示用户在保存时的工作流程。

现在,我已经构建了一个AutoSave功能,可以监控用户进行任何修改时触发的事件。 UserWork类触发事件,因此这很容易。我遇到的问题是我不确定如何在AutoSave线程中发送和存储对标志的引用。

我有:

public class AutoSave // (This code runs in a separate thread)
{
  bool flag1;
  bool flag2;

  UserWork userWork;

  public AutoSave(UserWork userWork, ref bool flag1, ref bool flag2)
  {
    this.flag1 = flag1;
    this.flag2 = flag2;

    this.userWork = userWork;

    userWork.workUpdated += new WorkUpdatedHandler(save);
  }

  void save(object sender, WorkUpdateArgs e)
  {
    saveDate(new SavedFile(userWork, flag1, flag2));
  }
}

当我运行我的代码(不是上面的代码,但代码类似)时,无论主线程中的值是什么,标志都始终为false

编辑以澄清:问题不在于我无法使用其他解决方法。例如,我可以在AutoSave类中公开两个标志,并同时更新主标志和自动保存标志。即flag1 = autoSave.Flag1 = true。相反,问题是这很麻烦。这意味着我必须记住,每次任何标志都会更新。另外,当我只在内存中有一个副本并在几个地方引用它时,用相同的数据更新几个变量是没有意义的。

1 个答案:

答案 0 :(得分:2)

你不能像那样使用ref - 你所展示的代码将无法编译。你 从你的实例变量中取出ref修饰符。传递给AutoSave构造函数的任何内容在被分配后完全独立于实例变量。

可以使用包装类:

public class Wrapper<T>
{
    public T Value { get; set; }
}

并传入两个Wrapper<bool>引用 - 然后调用者可以执行

flag.Value = true;

该更改将在AutoSave中显示。虽然这很糟糕......如果可以,我会尽量避免这种模式。

无论是什么改变标志也不会引发事件,所以你可以在AutoSave中捕获那个