2011-07-07 84 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'類一樣。 –