如何获取或终止特定类的所有实例?

3
如何获取某个类的所有实例或杀死某个类的所有实例?
例如,我有一个名为MyClass的类,我将其实例化三次,分别为m1m2m3
有没有一种方法可以获取或杀死所有这些实例?
更进一步的说明:当我有一个“设置表单”类时,用户点击设置按钮时,应用程序会从该类创建实例。当他再次点击同一个按钮时,它会创建新实例。我希望它只显示第一个实例,而不是创建新实例。

你说的“kill”是什么意思?一般情况下这个概念并不存在。这些实例是什么? - John Saunders
你试图解决什么问题? - ChrisF
好的,我会进一步澄清: 当我有一个“设置表单”类时。当用户点击设置按钮时,应用程序会从该类创建实例。当他再次点击相同的按钮时,它会创建新的实例。我希望它只显示第一个实例,而不是创建新的实例。 - EgyEast
我认为你不想“杀死”现有实例 - 你似乎想要重复使用它。实现这一点最简单的方法是在你的表单中将设置类的引用作为私有变量。 - David_001
3个回答

4

我不知道有没有这样的方法,但是你可以在构建对象时将实例保存在某种集合中,以便以后可以访问所有实例:

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
    }
}

好的,这很棒,但还有另一个问题: 当用户从控制框中打开和关闭设置表单(disposed)时,它不会返回 null。同时,应用程序也无法再次打开它,因为它不是 null。 - EgyEast
你能否发布一些关于如何关闭它的代码?(针对原问题) - s_hewitt
谢谢,经过您的代码修改,问题已经解决。 修改后的代码如下: public void LoadFrmSettings() { if (Sett != null) { if (Sett.Visible == true) { Sett.Activate(); return; } } Sett = new FrmSett(); Sett.Show(); } - EgyEast

1

对于您的表单示例,您可以将表单作为主程序中的变量保留。这样,您只有一个设置表单的实例。

private SettingsForm settingsForm = null;

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

但是当用户在单击按钮时从控件框中释放它时,它会显示错误“无法访问已释放的对象”。 - EgyEast

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讨论的那样,这是不可能的。请见谅。


@John Sauders:我认为他问如何“杀死”一个类,是因为该类以某种方式持久存在。将其设置为null将标记该类进行垃圾回收。在问题的上下文中,这怎么会是“不必要”的呢?(这意味着对象正在被持久化) - Martin Eve
2
@Martin:在.NET中,将其设置为null并不会处理任何资源。特别是因为下一次迭代将会给m赋一个新值。 - John Saunders
2
@Martin:在.NET中,您仍然不需要将对象设置为null,至少不是为了释放资源。这不是VB6。 - John Saunders
@John:很抱歉,声称永远不需要设置为null是错误的。请参见:http://weblogs.asp.net/pwilson/archive/2004/02/20/77422.aspx(由高度尊敬的.NET开发人员Paul Wilson编写--http://paul.wilsondotnet.com/--在Google上“.NET set to null”的顶部结果。)如果一个对象超出范围,那么它将被GC自动清除。如果您想手动强制执行此操作,例如因为对象持续时间很长,则将对象设置为null是强制GC的完全有效的解决方案。 - Martin Eve
@John - 这最后一条评论就是我想表达的观点。不过,由于问题已经更新,而且我本来要提交的答案也被接受了,所以我只好删除了我的答案。 - ChrisF
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接