2011-07-07 81 views
0

我有我的程序的主要组件在主线程中运行。该程序能够将用户的工作保存到文件中,但额外的元信息与用户的工作一起保存。C#引用值类型

例子:

[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

当你说它是“类似的代码” - 它不能* * * *类似,因为你不能声明除参数以外的任何东西作为“ref”。 –

+0

与概念相似。我拥有的这些方法/类中的代码非常庞大,其中很多与这个特定问题没有任何关系。我只是手写这些例子来说明我遇到的问题。 – Ozzah

+1

您在C#中显示的“概念”*在C#中无效,因此您不能拥有“与概念相似”的代码。很难说我们无法看到的代码有什么问题。 –

回答

2

你不能像这样使用ref - 你所显示的代码将不能编译。你会ref修饰符关闭您的实例变量。无论传入AutoSave构造函数的是什么,只要它们被赋值,它们都与实例变量完全无关。

可以使用包装类:

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

,并通过两个Wrapper<bool>引用 - 那么调用者可以做

flag.Value = true; 

而这种改变将在AutoSave可见。尽管如此,我还是很讨厌......如果可以的话,我会尽量避免这种模式。

可以随意更改标志不会引发太多事件,因此您可以捕获AutoSave

+0

我修改了我的AutoSave类,让我可以访问我的主程序中的2个标志。设置'flag1 = autoSave.Flag1 = true'很简单,我只是认为这两个变量指向相同的内存是有意义的,所以我不会这么做。为什么在内存中有2个独立的布尔,并且当我只有一个有2个引用的时候总是需要修改它们。 – Ozzah

+0

@Ozzah:当然 - 用有意义的方式封装这个想法。这听起来像是工作状态的一部分,所以应该和工作一起保存在一些类中 - 就像你的'SavedFile'类一样。 –