私がこれを持っている場合:
int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];
...そして、まだ値が割り当てられていないメソッドを終了したいのですが、それをテストするにはどうすればよいですか? それは...ですか:
if (lstAFewInts[0] == null)
...また???
私のアドバイス:抽象化のレベルを上げてください。
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;
}
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です。近いうちにメモリ不足になると思います:)
空の要素を指定するために値 0 に依存できない場合、および既存の定義を変更できる場合は、null 許容 int の配列を使用できます - int?[]
:
int?[] lstAFewInts = new int?[NUMBER_OF_STARS_IN_THE_MILKY_WAY];
これで、すべての値は番号がnull
割り当てられるまでになります - 任意の番号:
bool atLeastOneAssigned = lstAFewInts.Any(i => i.HasValue);
配列はデフォルトの型に初期化されます。int は値型であるため、int のデフォルトである 0 に初期化されていることを意味します。これが誰かによって割り当てられたのか、それとも初期値なのかを知る方法はありません。
if (lstAFewInts.All(i => i == 0))
{
// No value, except possibly 0, has been assigned.
}
代わりに nullable int を使用できます。
int?[] lstAFewInts = new int?[NUMBER_OF_STARS_IN_THE_MILKY_WAY];
それで
lstAFewInts[0].HasValue; // false
もちろん、ループがある場合は、すべてのインデックスをチェックして、割り当てられているかどうかを確認できます。
配列はその型に対して null に初期化されますが、NULL int のようなものはありません! したがって、すべての値が 0 に初期化されると思います。最初の値が 0 かどうかを確認できますが、0 を使用する可能性があるため、これは理想的ではありません。
可能であれば、再考して配列を宣言し(任意のサイズに初期化されるまでNULLになります)、値を追加するときだけ初期化します。次に、次を確認できます。
if (lstAFewInts)
NULL を返します。