我有我的程序的主要組件在主線程中運行。該程序能夠將用戶的工作保存到文件中,但額外的元信息與用戶的工作一起保存。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#中無效,因此您不能擁有「與概念相似」的代碼。很難說我們無法看到的代碼有什麼問題。 –