【问题标题】:How to get or Kill all instances from certain class?如何获取或杀死某个类的所有实例?
【发布时间】:2010-05-29 14:38:07
【问题描述】:

如何获取某个类的所有实例或杀死某个类的所有实例?

例如,我有一个 MyClass 类,我将其实例化为 m1、m2 和 m3 三次。

有没有办法获取或杀死所有这些实例?

更多说明:当我有一个“设置表单”类时。当用户单击设置按钮时,应用程序从此类创建实例。当他再次单击同一个按钮时,它会创建新实例。我希望它只显示第一个实例而不是创建新实例

【问题讨论】:

  • 你是什么意思,“杀”?一般来说,这个概念是不存在的。这些实例是什么?
  • 你想解决什么问题?
  • 好的,我会澄清更多:当我有一个“设置表单”类时。当用户单击设置按钮时,应用程序从此类创建实例。当他再次单击同一个按钮时,它会创建新实例。我希望它只显示第一个实例而不是创建新实例。
  • 我不认为你想“杀死”现有的实例——你似乎想重用它。实现这一点的最简单方法是将设置类的引用设为表单中的私有变量。

标签: c#


【解决方案1】:

我不知道,但是您可以在某种集合上构造对象时保存实例,以便以后访问所有实例:

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

【讨论】:

  • 好吧,这很好,但还有另一个问题:当用户从控制框(已处置)打开和关闭设置表单时,它不会返回 null。同时应用程序不会再次打开它,因为它不为空。
  • 发布一些关于如何关闭它的代码? (对原始问题)
  • 谢谢,修改代码后问题已经解决。修改后的代码为 public void LoadFrmSettings() { if (Sett != null) { if (Sett.Visible == true) { Sett.Activate();返回; } } Sett = new FrmSett(); Sett.Show(); }
【解决方案2】:

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

private SettingsForm settingsForm = null;

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

【讨论】:

  • 但是当用户点击按钮时从控制框中释放它时,它会显示错误“无法访问已释放的对象。”
【解决方案3】:

当您实例化它们时,将它们放入更高范围的通用列表中:

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
}

--------编辑----------- 正如在下面的 cmets 中与 John Saunders 所讨论的,这是不可能的。我很抱歉。

【讨论】:

  • @John Sauders:我假设他问如何“杀死”一个类,因为该类以某种方式持续存在。设置为 null 将标记该类进行垃圾收集。鉴于问题的上下文,这如何“不必要”? (这意味着对象正在被持久化)
  • @Martin:在 .NET 中,设置为 null 不会释放任何资源。尤其如此,因为下一次迭代将为 m 分配一个新值。
  • @John:我很抱歉;我对 foreach 的引用性质感到困惑。似乎 (stackoverflow.com/questions/1538301/…) foreach 语句是按引用的(因此设置 null 会影响对象)但也是只读的,所以这是不可能的。
  • @Martin:你仍然不需要在 .NET 中设置为 null,至少不是为了释放资源。这不是 VB6。
  • @John:我很抱歉,但是声明从不需要设置为 null 是错误的。请参阅:weblogs.asp.net/pwilson/archive/2004/02/20/77422.aspx(由备受尊敬的 .NET 开发人员 Paul Wilson 编写——paul.wilsondotnet.com——Google 上“.NET 设置为 null”的最高结果。)如果一个对象超出范围,那么是的,它GC会自动清理。如果您想手动强制执行此操作,例如因为对象会持续很长时间,那么将对象设置为 null 是强制 GC 的完美有效解决方案。
猜你喜欢
  • 1970-01-01
  • 2013-05-17
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2014-10-01
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多