C#:如何在类之间共享类的实例?

C#:如何在类之间共享类的实例?,c#,winforms,class,C#,Winforms,Class,在我的windows窗体应用程序中有多个窗体实例,我在加载主窗体时实例化了这些实例(包括主窗体本身的一个实例)。我希望它们在类之间共享,以便我可以在任何位置使用它们。我还需要通过这些实例使用每个类的成员 请注意,我很困惑这是如何工作的。我不知道应该如何声明表单的实例,但我只需要每个表单的一个实例,这样我就可以使用.Hide()方法并使用每个表单/类的成员 我已尝试将实例作为属性,但不确定如何继续。我不确定这是否正确 // get and set for form instances

在我的windows窗体应用程序中有多个窗体实例,我在加载主窗体时实例化了这些实例(包括主窗体本身的一个实例)。我希望它们在类之间共享,以便我可以在任何位置使用它们。我还需要通过这些实例使用每个类的成员

请注意,我很困惑这是如何工作的。我不知道应该如何声明表单的实例,但我只需要每个表单的一个实例,这样我就可以使用.Hide()方法并使用每个表单/类的成员

我已尝试将实例作为属性,但不确定如何继续。我不确定这是否正确

    // get and set for form instances
    public Menu menu { get; set; }
    public RandomFacts randomFacts { get; set; }
    public QuizMenu qm { get; set; }
    public AskHowManyQuestions ahmq { get; set; }

    // in the main form load method
    menu = new Menu();
    randomFacts = new RandomFacts();
    qm = new QuizMenu();
    ahmq = new AskHowManyQuestions();
这些代码都在同一个“主”表单中

我希望您能帮助我在全球范围内访问这些实例,并帮助我解决这个问题。谢谢你阅读我的问题

简单的例子:

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{

    public static void Main()
    {   

        var NewClassInstance = Singleton.GetSingleton().NewClassInstance;
        Singleton.GetSingleton().NewClassInstance.Method();
        var OtherClassInstance = Singleton.GetSingleton().OtherClassInstance;
        var Proparty  = OtherClassInstance.Name;
    }
}



public class Singleton
{
    public NewClass NewClassInstance {get; private set;}
    public OtherClass OtherClassInstance {get; private set;}


    private static readonly NewClass _newClass = new NewClass();
    private static readonly OtherClass _otherClass = new OtherClass();
    private static readonly Singleton _singleton = new Singleton();
    private Singleton()
    {
        NewClassInstance = _newClass;
        OtherClassInstance = _otherClass;
        // Prevent outside instantiation
    }

    public static Singleton GetSingleton()
    {
        return _singleton;
    }
}

public class NewClass
{
    public NewClass()
    {
    }

    public void Method()
    {
    }
}


public class OtherClass
{
    public string Name {get; set;}

    public OtherClass()
    {
    }
}
您可以通过以下方式访问此intance:

Singleton.GetSingleton();

给您留下一个其他示例

只需将它们分配给表单上的属性即可

// in the main form load method

// Class which holds all of the state shared by these forms
sharedState = new SharedState();

menu = new Menu() { SharedState = sharedState };
randomFacts = new RandomFacts() { SharedState = sharedState };
ahmq = new AskHowManyQuestions() { SharedState = sharedState };
qm = new QuizMenu() { SharedState = sharedState };
显然,表单需要声明
SharedState
属性:

public SharedState SharedState { get; set; }
我只想要一个实例

将声明移动到它们自己的类中,并实现Singleton模式。因为您处理的是表单,所以可以根据需要实例化它们,并在它们关闭时通过订阅FormClosed事件将它们设置回null

用法示例:

MyForms.menu.Show();
代码:


那么,我是不是只对我的案例中的每个表单执行此操作?感谢您的解释。这样,您可以只对每个类执行一次实例,并且在任何时候都可以访问它,而无需在您的事业中创建新的实例。您可以为您想要共享的任何类执行此操作。谢谢。在我的例子中,我是否将每个公共表单构造函数都更改为私有表单构造函数?只需在InitializeComponent()调用下面设置属性,对每个类重复此过程?对不起,我只是糊涂了@AmadeuAntunes@AmadeuAntunes是的,但它也将每个表单限制为一个实例。如果有一天您想实例化同一表单的两个副本(无论出于何种原因),事情会变得很糟糕。在这个例子中,yesCheck说:应该注意的是,使用单例的模式不鼓励在构造函数中使用显式依赖注入。只同意w/@theMayer,但要注意这两件事并不是相互排斥的-在这种情况下,你仍然应该使用单例实例,您不应该让依赖代码控制其依赖项的生存期。这是合成根的作业。有一点值得注意,可能是重复的,如果除了接受共享状态的构造函数外,没有为窗体保留无参数构造函数,则窗体的可视化设计器可能无法工作。@ScottChamberlain fair point-编辑为使用属性,哪个更容易grok@ScottChamberlain我也很害怕,但奇怪的是,我从来没有遇到过任何问题。我用一个私有构造函数制作表单,用一个参数化构造函数制作表单,设计师一次也没有抱怨过。我怀疑它实际上并没有实例化它们,它只是解析
InitComponents
方法。@Vilx-我可能一直在考虑自定义控件而不是表单。我相信,如果你正在制作一个自定义控件,当你试图在窗体的设计器中添加它时,它会搞砸的。@ScottChamberlain-既然你提到了它。。。也许是我做了自定义控件,它工作了?那是很久以前的事了,我真的不记得了。。。不管怎么说,我想寓意是——它可能会失败,你自己看看它在你的情况下是否有效。
class MyForms
{

    private static Menu _menu = null;
    public static Menu menu {
        get {
            if (_menu == null || _menu.IsDisposed)
            {
                _menu = new Menu();
                _menu.FormClosed += (sender, e) => { _menu = null; };
            }
            return _menu;
        }
    }

    private static RandomFacts _randomFacts = null;
    public static Menu randomFacts
    {
        get
        {
            if (_randomFacts == null || _randomFacts.IsDisposed)
            {
                _randomFacts = new RandomFacts();
                _randomFacts.FormClosed += (sender, e) => { _randomFacts = null; };
            }
            return _menu;
        }
    }

    private static QuizMenu _qm = null;
    public static QuizMenu qm
    {
        get
        {
            if (_qm == null || _qm.IsDisposed)
            {
                _qm = new QuizMenu();
                _qm.FormClosed += (sender, e) => { _qm = null; };
            }
            return _qm;
        }
    }

    private static AskHowManyQuestions _ahmq = null;
    public static AskHowManyQuestions ahmq
    {
        get
        {
            if (_ahmq == null || _ahmq.IsDisposed)
            {
                _ahmq = new AskHowManyQuestions();
                _ahmq.FormClosed += (sender, e) => { _ahmq = null; };
            }
            return _ahmq;
        }
    }

}