单例数组 class

Array of Singleton class

正如标题所说,我需要实现一个单例数组class。 我的项目想法是构建一个用 Microsoft Visual C# 编写的简单 PLC-Ladder IDE。
因为我不是专家代码编写者,所以我将大部分代码写在一个文件中。它工作正常,但不容易阅读和更新。所以我把它分成五个不同的 classes.

MainClass.cs - Main program  
CustomMethods.cs - All my methods  
CustomEventHandlers.cs - All my event handlers  
Components.cs - This class holds information (name, type, input, output, etc) and I need a 2-D array of this, because I'm using it as a "screen buffer" for the project.  
SharedVariables.cs - All my variables are declared here. My components class is initialized as a 2-D array in here too.  

问题是我无法在 class 之间创建和共享 "Components" 数组的实例。我找到了 "Singleton pattern",但我仍然无法正确实施它。我无法初始化 "singleton" class 数组。这是代码(不相关的部分被删除)。

//Custom method.cs
namespace AVR_PLC
{
    class CustomMethods
    {
        CustomEventHandlers extHandlers;
        SharedVariables Variables;

        public void setup()
        {
            extHandlers = new CustomEventHandlers();
            Variables = new SharedVariables();

                for (int i = 0; i < Variables.maxX; i++)
                    for (int j = 0; j < Variables.maxY; j++)
                        Variables.pBuffer[i, j] = new Components;
        }  
---------------------------------------------  
//SharedVariables.cs
namespace AVR_PLC
{
    class SharedVariables
    {
        public int maxX = 10;
        public int maxY = 100;
        public Components[,] pBuffer = Components[10, 100];    //Panel buffer

    }
}  
---------------------------------------------  
//Components.cs
namespace AVR_PLC
{
    public class Components
    {
        //***** Singleton pattern implementation ***********
        //Private static object.
        private static volatile Components instance;
        private static readonly object mutex = new Object();

        //Private constructor to prevent object creation.
        private Components() 
        {

        }

        //Public property to access outside of the class to create an object.
        public static Components Instance
        {
            get
            {
                if (instance == null)
                    lock (mutex)
                        if (instance == null)
                            instance = new Components();
                return instance;
            }
        }
        //************************************************
        private string _name = "Default name";

        public string Name
        {
            get { return this._name; }
            set { this._name = value; }
        }
        public void reset()
        {
            _name = "Default name";
        }
    }
}  

单例是 class 只有一个实例(就个人而言,在使用 C# 时我更喜欢静态 classes 而不是单例)。

要访问单例 class,您可以使用 Components.Instance 属性。但是,在你的情况下,你实际上并不想要一个单身人士。
如果您想要一个 Component 对象数组,您宁愿为数组中的每个新对象创建一个新对象,否则该数组就有点没用了(如果它在其中的对象完全相同......)。

要在同一 class 的多个实例之间共享一个变量,您可以使用 static 关键字,这基本上使它在所有 classes 中成为相同的对象(如果您更改它一方面,它在所有方面都发生了变化。
所以你可以让你的共享变量 class 成为静态的 class:

public static class SharedVariables
{
    public static int maxX = 10;
    public static int maxY = 100;
    public static Components[,] pBuffer = Components[10, 100];
}

无论您访问 SharedVariables class,都可以访问它们。

但最大的问题是:您真的需要静态 SharedVariables class 吗?我有点怀疑你在这里有一个设计问题要考虑。