C# 如何判断int[]是否还未分配任何内容?

C# 如何判断int[]是否还未分配任何内容?,c#,arrays,null,arraylist,C#,Arrays,Null,Arraylist,如果我有这个: int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY]; …我想退出一个方法,如果它还没有赋值给它,我该如何测试它?是: if (lstAFewInts[0] == null) …还是 default(T) // i.e., default(int) 将为给定类型(在您的情况下为int)提供默认值。但是,由于int是一种值类型,因此无法区分默认值0和指定值0 你确定你会用最好的方法来解决这个问题吗?字典之

如果我有这个:

int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];
…我想退出一个方法,如果它还没有赋值给它,我该如何测试它?是:

if (lstAFewInts[0] == null)
…还是

default(T)  // i.e., default(int)
将为给定类型(在您的情况下为int)提供默认值。但是,由于int是一种值类型,因此无法区分默认值0和指定值0

你确定你会用最好的方法来解决这个问题吗?字典之类的东西会让你更好地了解某个东西是否被分配了,因为如果没有,键就不存在了。当然,这假设您有唯一的键可以使用,但是从常量的名称来看,星号的名称可能是一个很好的键

还有

int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];
我们银河系中的恒星数量估计约为1000亿颗。这大约是您分配的400GB。我看到您在不久的将来内存不足:

将为给定类型(在您的情况下为int)提供默认值。但是,由于int是一种值类型,因此无法区分默认值0和指定值0

你确定你会用最好的方法来解决这个问题吗?字典之类的东西会让你更好地了解某个东西是否被分配了,因为如果没有,键就不存在了。当然,这假设您有唯一的键可以使用,但是从常量的名称来看,星号的名称可能是一个很好的键

还有

int[] lstAFewInts = new int[NUMBER_OF_STARS_IN_THE_MILKY_WAY];

我们银河系中的恒星数量估计约为1000亿颗。这大约是您分配的400GB。我看到您在不久的将来内存不足:

数组已初始化为其默认类型。由于int是一种值类型,这意味着它被初始化为int的默认值,即0。无法知道这是由某人指定的还是其初始值。

数组被初始化为其默认类型。由于int是一种值类型,这意味着它被初始化为int的默认值,即0。无法知道这是由某人分配的还是它的初始值。

如果不能依靠值0来指定空元素,并且如果可以更改现有定义,则可以使用可为null的整数数组-int?[]:

if (lstAFewInts.All(i => i == 0))
{
    // No value, except possibly 0, has been assigned.  
}
现在,所有值都将为空,直到分配了一个数字-任意数字:

bool atLeastOneAssigned = lstAFewInts.Any(i => i.HasValue);

如果不能依赖值0来指定空元素,并且如果可以更改现有定义,则可以使用可为null的整数数组-int?[]:

现在,所有值都将为空,直到分配了一个数字-任意数字:

bool atLeastOneAssigned = lstAFewInts.Any(i => i.HasValue);

您可以使用可为null的int

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


当然,如果你有一个循环,你可以检查每个索引,看看它是否被分配到了。你可以用一个可为空的int来代替

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


当然,如果你有一个循环,你可以检查每个索引,看看它是否被分配到。

数组的类型将被初始化为null,但是没有null int!我想所有的值都会初始化为0。您可以检查第一个值是否为0,但这并不理想,因为您可能希望使用0

如果可能的话,我会重新考虑它,并声明数组在初始化为任何大小之前它都是空的,只有在向它添加值时才会初始化。然后您可以检查:

if (lstAFewInts)

返回NULL

数组的类型将被初始化为null,但不存在null int!我想所有的值都会初始化为0。您可以检查第一个值是否为0,但这并不理想,因为您可能希望使用0

如果可能的话,我会重新考虑它,并声明数组在初始化为任何大小之前它都是空的,只有在向它添加值时才会初始化。然后您可以检查:

if (lstAFewInts)
返回NULL

我的建议是:提高抽象层次

完成了:您有一个任意大小的数组,您知道它是否已被使用:

void M()
{
    var myArray = new LazyArray<int>(whatever);
    while(whatever)
    {
        if (whatever) myArray[whatever] = whatever;
    }
    if (myArray.IsInitialized) 
        whatever;
}
我的建议是:提高抽象层次

完成了:您有一个任意大小的数组,您知道它是否已被使用:

void M()
{
    var myArray = new LazyArray<int>(whatever);
    while(whatever)
    {
        if (whatever) myArray[whatever] = whatever;
    }
    if (myArray.IsInitialized) 
        whatever;
}

int不是可为Null的类型,因此默认值为0。对于可以检查的字符串,0的lengthChecking对我不起作用,因为这是元素的有效值。是否需要每个元素或每个数组的初始化检查?int不是可为Null的类型,因此默认值为0。对于字符串,您可以使用进行检查。lengthChecking 0对我不起作用,因为这是元素的有效值。是否需要每个元素或每个数组的初始化检查?这不符合规定的要求。它会检查所有的值是否都是0,而不是一个特定的值。我认为这是特别需要的。“[H]我该如何测试[…]它还没有被赋予任何值。”@Chris Farmer:谢谢,我觉得它看起来有点“不对劲”。好吧,它的措辞可能有点混乱,但这一行不同意

与您一起:lstAFewInts[0]。在我看来,OP想要检查数组中的元素是否已经分配。好吧,公平地说,如果我们必须依赖隐含的需求,显然我们是这样做的,我不能说这是错误的。我删除了否决票。这不符合规定的要求。它会检查所有的值是否都是0,而不是一个特定的值。我认为这是特别需要的。“[H]我该如何测试[…]它还没有被分配任何值。”@Chris Farmer:谢谢,我觉得它看起来有点“不对劲”。好吧,它的措辞可能有点混乱,但这行代码与您不一致:lstAFewInts[0]。在我看来,OP想要检查数组中的元素是否已经分配。好吧,公平地说,如果我们必须依赖隐含的需求,显然我们是这样做的,我不能说这是错误的。我删除了下一票。或者,您可以为应用程序创建一些默认值,并使用该值初始化数组。例:int。MaxValue@Tigran:对您确信永远不会正常出现的值使用特殊的幻数是恼人bug的由来已久的根源。这就是为什么我们有Nullable,它允许我们指定一个显式无效的值-null。@AvnerShahar-Kashtan:好吧,如果你确定的话,那应该不会有问题。这是一个经常使用的确定的松散定义,它是bug的来源:你是对的,int?在这种情况下更好,假设没有更好的高层方法可以采用。是的,好吧,斜体不能表达我想要的讽刺程度nullable类型的引入为值引入了另一种可能的状态。如果我有关于我操作的te系统的合理数量的信息,我肯定会更喜欢非空方法。最后,空值只是另一个可能的值,不会以任何方式帮助您避免邪恶/错误的代码。或者您可以为应用程序创建一些默认值,并使用该值初始化数组。例:int。MaxValue@Tigran:对您确信永远不会正常出现的值使用特殊的幻数是恼人bug的由来已久的根源。这就是为什么我们有Nullable,它允许我们指定一个显式无效的值-null。@AvnerShahar-Kashtan:好吧,如果你确定的话,那应该不会有问题。这是一个经常使用的确定的松散定义,它是bug的来源:你是对的,int?在这种情况下更好,假设没有更好的高层方法可以采用。是的,好吧,斜体不能表达我想要的讽刺程度nullable类型的引入为值引入了另一种可能的状态。如果我有关于我操作的te系统的合理数量的信息,我肯定会更喜欢非空方法。最后,null只是另一个可能的值,它不会以任何方式帮助您避免邪恶/错误的代码。