2010-05-29 74 views
3

如何獲得某個類的所有實例或者殺死某個類的所有實例?如何獲取或殺死某些類的所有實例?

例如,我有一個類MyClass,它們三次作爲m1,m2m3

有沒有辦法獲得或殺死所有這些實例?

更多解釋:當我有一個「設置表單」類。當用戶點擊設置按鈕時,應用程序會從這個類中創建實例。當他再次點擊相同的按鈕時,它會創建新的實例。我希望它只是不顯示1實例製作新的實例

+0

你是什麼意思,「殺」?總體而言,這個概念並不存在。這些情況是什麼? – 2010-05-29 14:41:27

+0

你想解決什麼問題? – ChrisF 2010-05-29 14:43:01

+0

好吧,我會澄清更多: 當我有一個「設置表」類。當用戶點擊設置按鈕時,應用程序會從這個類中創建實例。當他再次點擊相同的按鈕時,它會創建新的實例。我希望它僅顯示第一個實例,而不是創建新實例。 – EgyEast 2010-05-29 14:49:13

回答

3

這並不是說我知道,但你可以在某種集合構造對象的時候,所以你以後可以訪問所有實例保存實例:

public class MyClass { 
    public static List<MyClass> instances = new List<MyClass>(); 
    public MyClass() { 
     instances.Add(this); 
    } 
} 

編輯:

保存設置類作爲形式的領域,並單擊按鈕時,檢查該字段爲空;如果是這樣,實例

public class Form1 : Form { 
    private SettingsClass settings; 

    ... 
    ... 

    private void btnSettings_Click(object sender, EventArgs e) { 
     if (settings == null) { 
      settings = new SettingsClass(); 
     } else { 
      // do nothing, already exists 
     } 

     // use settings object 
    } 
} 
+0

好吧,但還是有另一個問題: 當用戶從控制箱打開和關閉設置表單(處置)時,它不返回空值。並且在同一時間,應用程序不會再打開它,因爲它不爲空。 – EgyEast 2010-05-29 15:00:40

+0

發佈一些關於你如何關閉它的代碼? (原來的問題) – 2010-05-29 15:04:02

+0

謝謝你,修改你的代碼後,問題已經解決了。 修改後的代碼是 public void LoadFrmSettings() if(Sett!= null){if(Sett.Visible == true){Sett.Activate();返回; }} Sett = new FrmSett(); SETT。顯示(); } – EgyEast 2010-05-29 15:15:01

0

當你實例化它們,把它們放在一個更高範圍的泛型列表:

List<MyClass> myObjects = new List<NyClass>(); 

然後,當你做一個函數內的對象:

m1 = new MyClass(); 
m2 = new MyClass(); 
m3 = new MyClass(); 

myObjects.add(m1); 
myObjects.add(m2); 
myObjects.add(m3); 

然後,在稍後階段:

foreach(MyClass m in myObjects) 
{ 
    m.do_whatever_you_want(); 
    m = null; // SEE EDIT BELOW 
} 

--------編輯----------- 正如John Saunders在下面的評論中所討論的那樣,這是不可能的。我很抱歉。

+1

-1:設置爲null是不必要的 – 2010-05-29 14:45:56

+0

@John Sauders:我認爲他問了如何「殺死」一個班級,因爲班級以某種方式持續下去。設置爲null將標記垃圾收集類。考慮到問題的背景,這是如何「不必要」的? (這意味着對象被持久化) – 2010-05-29 14:50:01

+2

@Martin:在.NET中,設置爲null不會處理任何資源。這是特別真實的,因爲下一次迭代將爲m指定一個新值。 – 2010-05-29 14:58:44

1

對於您的表單示例,您可以將表單作爲變量保存在主程序中。這樣你只有一個設置表單的實例。

private SettingsForm settingsForm = null; 

SettingsButton_Click() 
{ 
    if(settingsForm == null) 
    { 
     settingsForm = new SettingsForm(); 
    } 
    settingsForm.Show(); 
} 
+0

,但是當用戶單擊按鈕時,它從控制箱中丟棄時,會顯示錯誤「無法訪問已放置的對象」。 – EgyEast 2010-05-29 15:03:48