我有我的程序的主要组件在主线程中运行。该程序能够将用户的工作保存到文件中,但额外的元信息与用户的工作一起保存。C#引用值类型
例子:
[Serializable]
public Class UserWork
{
// Lots of things in here. Lots of work user has done, etc...
}
在节目中,我存储有两件事情像设置等假设这些都是bool flag1
和bool 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
。相反,问题在于这很麻烦。这意味着我必须记得每做一次任何标志都会更新。另外,当我可以在内存中只有一个副本并在几个地方引用它时,始终用相同的数据更新多个变量是没有意义的。
当你说它是“类似的代码” - 它不能* * * *类似,因为你不能声明除参数以外的任何东西作为“ref”。 –
与概念相似。我拥有的这些方法/类中的代码非常庞大,其中很多与这个特定问题没有任何关系。我只是手写这些例子来说明我遇到的问题。 – Ozzah
您在C#中显示的“概念”*在C#中无效,因此您不能拥有“与概念相似”的代码。很难说我们无法看到的代码有什么问题。 –