单例数组 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 吗?我有点怀疑你在这里有一个设计问题要考虑。
正如标题所说,我需要实现一个单例数组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 吗?我有点怀疑你在这里有一个设计问题要考虑。