簡體   English   中英

C#:如何在類之間共享類的實例?

[英]C#: How do I share an instance of a class between classes?

我在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()
    {
    }
}

你可以訪問這個內容

Singleton.GetSingleton();

讓我們留下另一個例子https://dotnetfiddle.net/C1PB05

只需將它們分配給表單上的屬性即可

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

我只想要一個實例

將您的聲明移動到它們自己的Class並實現Singleton Pattern。 由於您正在處理Forms,您可以按需實例化它們,並在訂閱FormClosed事件時將它們設置為null。

用法示例:

MyForms.menu.Show();

碼:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM