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

おそらくやりたいことは、(暗黙的ではなく) 明示的なバッキング フィールドを使用して、ゲッターとセッターにロジックを追加できるようにすることです。このようなもの:

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 メソッドに応答して配列を初期化することができます。クイック "autofill" プロパティ ("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 に答える
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.csharpindepth.com/Articles/General/Singleton.aspx

于 2013-05-14T19:49:16.970 に答える