1

私がこれを持っている場合:

int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

...そして、まだ値が割り当てられていないメソッドを終了したいのですが、それをテストするにはどうすればよいですか? それは...ですか:

if (lstAFewInts[0] == null)

...また???

4

7 に答える 7

8

私のアドバイス:抽象化のレベルを上げてください。

class LazyArray<T>
{
    private T[] array;
    private int size;
    public LazyArray(int size) { this.size = size; }
    public bool IsInitialized { get { return this.array != null; } }
    public T this[int x] 
    { 
        get 
        { 
            return this.array == null ? default(T) : this.array[x];
        }
        set
        {
            if (this.array == null) this.array = new T[size];
            this.array[x] = value;
        }
    }
}

これで完了です。任意のサイズの配列があり、それがまだ使用されているかどうかがわかります。

void M()
{
    var myArray = new LazyArray<int>(whatever);
    while(whatever)
    {
        if (whatever) myArray[whatever] = whatever;
    }
    if (myArray.IsInitialized) 
        whatever;
}
于 2012-04-27T19:45:43.537 に答える
7
default(T)  // i.e., default(int)

あなたの場合、特定のタイプのデフォルト値を提供しますint。ただし、int値の型であるため、デフォルト値の 0 と割り当てられた値の 0 を区別する方法はありません。

これを可能な限り最善の方法で行っていると確信していますか? のようなDictionary<something, int>ものは、何かが割り当てられているかどうかをよりよく知ることができます。割り当てられていない場合、キーは存在しないからです。もちろん、これは使用する一意のキーがあることを前提としていますが、定数の名前から判断すると、星の名前が使用するのに適したキーである可能性があります。

また...

int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

私たちの銀河系の星の数は、約1000億個と推定されています。それはあなたが割り当てている約400GBです。近いうちにメモリ不足になると思います:)

于 2012-04-27T18:59:45.667 に答える
3

空の要素を指定するために値 0 に依存できない場合、および既存の定義を変更できる場合は、null 許容 int の配列を使用できます - int?[]:

int?[] lstAFewInts = new int?[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

これで、すべての値は番号がnull割り当てられるまでになります - 任意の番号:

bool atLeastOneAssigned = lstAFewInts.Any(i => i.HasValue);
于 2012-04-27T19:03:42.950 に答える
1

配列はデフォルトの型に初期化されます。int は値型であるため、int のデフォルトである 0 に初期化されていることを意味します。これが誰かによって割り当てられたのか、それとも初期値なのかを知る方法はありません。

于 2012-04-27T19:00:13.237 に答える
1
if (lstAFewInts.All(i => i == 0))
{
    // No value, except possibly 0, has been assigned.  
}
于 2012-04-27T19:02:06.447 に答える
0

代わりに nullable int を使用できます。

int?[] lstAFewInts = new int?[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

それで

lstAFewInts[0].HasValue; // false

もちろん、ループがある場合は、すべてのインデックスをチェックして、割り当てられているかどうかを確認できます。

于 2012-04-27T19:04:45.930 に答える
0

配列はその型に対して null に初期化されますが、NULL int のようなものはありません! したがって、すべての値が 0 に初期化されると思います。最初の値が 0 かどうかを確認できますが、0 を使用する可能性があるため、これは理想的ではありません。

可能であれば、再考して配列を宣言し(任意のサイズに初期化されるまでNULLになります)、値を追加するときだけ初期化します。次に、次を確認できます。

if (lstAFewInts)

NULL を返します。

于 2012-04-27T19:13:49.497 に答える