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