2010-05-29 76 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