1

好的,我已经超出了我的舒适区,正在为新概念而苦苦挣扎,但我希望我能把自己说清楚。
据我了解,全局变量非常糟糕C#(并且通常很危险),但我真的不想参与这场辩论。经过一些研究,我相信这Singletons会有所帮助。如果我在下面描述的情况有误,请随时在此处提供替代方案。

我想做的是创建一个array包含数字数据的动态多维。该矩阵的大小会有所不同,并且必须在运行时创建(我通过 GUI 从日志设备中提取数据)。
我看到的解决方案是创建一个class具有变量的变量,我可以get并且set具有动态大小。

public class mySingleton
{
    public static int dataSize { get; set; }
    public double[] dataSet = new double[dataSize] { get; set; }               
}

有这种效果的东西,但显然这是错误的并且不起作用。我一直在尝试研究如何在运行时初始化数组但无法弄清楚,但我也觉得我不知道要搜索哪些术语。有什么帮助吗?

4

4 回答 4

3

您可能想要做的是使用显式(而不是隐式)支持字段,以便您可以向 getter 和 setter 添加逻辑。像这样的东西:

public class mySingleton
{
    private static int _dataSize;    // you might want to set this to some sensible default
    public static int DataSize 
    { 
        get { return _dataSize; }
        set 
        { 
            _dataSize = value;
            _dataSet = null;        // changing the size will implicitly clear the array - but you could write code to resize if you really wanted to
        }
    }
    private static double[] _dataSet;
    public static double[] DataSet 
    { 
        get 
        {
            if (_dataSet == null) 
            {
                _dataSet = new double[_dataSize];
            }
            return _dataSet;
        }
        // you can include a setter if you want to let the consumer set the dataset directly - in which case it should update the _dataSize field.
    }               
}
于 2013-05-14T19:45:02.887 回答
2

您可能希望初始化数组以响应 dataSize 属性上的 set 方法。您将无法使用快速“自动填充”属性(“get;set;”),但这样一来,您就可以在用户设置数据大小后立即初始化数据集。

所以是这样的:

public class mySingleton
{
    private static int _dataSize;
    public static int dataSize { 
        get {return _dataSize;} 
        set {
            _dataSize = value;
            dataSet = new double[value];
        } 
    }
    public double[] dataSet { get; private set; }               
}

一般来说,要设置类的静态属性,可以使用静态构造函数(http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx)或控制流程以您可以在其他人需要使用静态成员之前设置静态成员的方式访问类/数据。

于 2013-05-14T19:46:01.567 回答
1

您可以轻松创建动态大小的数组:

double[] array = new double[size];

size可以是任意类型的表达式int。所以你的代码看起来像这样:

class ArrayHolder { public static double[] Value; } //global state

//set the global state somewhere else in your code:
var size = DetermineSize();
double[] array = new double[size];
ArrayHolder.Value = array; //publish globally

初始化数组后,它可以在整个程序中使用。数组是引用类型,因此这里没有不必要的数据复制。

旁注:为什么你更喜欢单例而不是静态变量?通常它们具有相同的优点和缺点(IOW 没有有意义的差异)。在我的示例中,我只使用了一个静态变量。

于 2013-05-14T20:01:59.203 回答
0

我不确定单例是否最适合您的方法,但无论如何,这里有一个单例实现:

public class MatrixSingleton
{
    private static readonly MatrixSingleton instance = new MatrixSingleton();

    static MatrixSingleton() 
    {
    }

    private MatrixSingleton()
    {
        this.Data = new List<Tuple<double, double>>();
    }

    public static MatrixSingleton Instance
    {
        get { return instance; }

    }

    public List<Tuple<double, double>> Data;

}

以及它的使用

MatrixSingleton matrixSingleton = MatrixSingleton.Instance;
matrixSingleton.Data.Add(new Tuple<double, double>(1.1, 2.2));

有关单例模式的更多信息,这些链接可能会有所帮助:

http://braindrivendevelopment.com/2013/05/04/simplify-singleton-pattern/

http://www.cshapindepth.com/Articles/General/Singleton.aspx

于 2013-05-14T19:49:16.970 回答