我如何判断 int[] 是否尚未为其分配任何内容

本文关键字:是否 任何内 分配 何判断 判断 int | 更新日期: 2023-09-27 18:32:43

如果我有这个:

int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

。如果尚未分配任何值,我想退出方法,如何测试?是吗:

if (lstAFewInts[0] == null)

。或???

我如何判断 int[] 是否尚未为其分配任何内容

我的建议:提高抽象水平。

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 来指定空元素,并且可以更改现有定义,则可以使用可为空的整数数组 - 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)

返回空值;