如果我有这个:
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。
你确定你会以最好的方式去做吗?像 aDictionary<something, int>
这样的东西会让你更好地了解是否已经分配了某些东西,因为如果没有分配,则密钥将不存在。这当然假设您有唯一的键可以使用,但从常量的名称来看,星号的名称可能是一个很好的键。
还...
int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];
我们银河系中的恒星数量估计约为 1000 亿颗。这大约是您分配的 400GB。我看到你在不久的将来内存不足:)
如果您不能依赖值 0 来指定空元素,并且可以更改现有定义,则可以使用可为空的整数数组 - 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.
}
您可以改用可为空的 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;