Singleton类的数组

时间:2016-04-03 09:27:09

标签: c# arrays class singleton shared

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

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.  

问题是我无法在我的类之间创建和共享“Components”数组的实例。我发现了“单身模式”,但我还是无法正确实现它。我无法初始化我的“单例”类数组。这是代码(不相关的部分被删除)。

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

1 个答案:

答案 0 :(得分:0)

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

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

要在同一个类的多个实例之间共享变量,请使用static关键字,这基本上使其成为所有类中的相同对象(如果您将其更改为一个,则会全部更改)。 /> 所以你可以让你的共享变量类成为一个静态类:

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

无论您访问SharedVariables类的哪个位置都可以访问它们。

但最重要的问题是:你真的需要静态SharedVariables课程吗?我有点怀疑你在这里有设计问题需要考虑。