如何检查系统::集合::ArrayList是否存在/为空

How do I check if System::Collections::ArrayList exists / is empty

本文关键字:ArrayList 集合 是否 存在 为空 系统 何检查 检查      更新时间:2023-10-16

我正试图用两个简单的访问器/赋值函数访问::Collections::ArrayList的句柄:

/** --------------------------------------------
 * public accessor for RX message queue
 * --------------------------------------------- */
System::Collections::ArrayList^ peak_lib::rx_queue(void)
{
    return this->m_Queue_Mes_RX;
}
/** --------------------------------------------
 * public mutator for RX message queue
 * --------------------------------------------- */
void peak_lib::rx_queue( System::Collections::ArrayList^ inList )
{
if ( inList->Count != 0 ) // <-- error line
{
    this->m_Queue_Mes_RX = inList;
}
}

我的编译器抛出An unhandled exception of type 'System.NullReferenceException' occurred in my.exe,并补充说,当我试图访问->Count属性(请参阅代码中的错误行)时,没有在对象上调用引用(翻译它),因为有人告诉我在这里检查inList变量是否存在。

当我使用C++/CLI Visual Studio 2008时,检查ArrayList是否存在的正确方法(或者至少是更好的方法:D)是什么?

最初,在检查计数之前检查null

if (inList != nullptr)
{
     if(inList->count)
     {}
}

在实际访问其成员之前检查空指针。

if (inList)
{
     if(inList->count)
     {}
}

此外,正如Konrad在评论中所说,System::Collections::ArrayList已经过时,所以请尝试使用向量而不是

属性设置器应该将属性设置为传递的值,或者指示错误。有两种方法可以指示错误:抛出参数异常(常见)或将对象更改为无效状态,该状态将在未来对对象的操作中公开(罕见,例如,用于数据绑定的类)。

可能是将属性设置为null不应该是一个错误,但您的问题暗示您希望禁止这样做。因此,在需要非null列表的地方传递null是Bonehead异常。它应该在发布前进行更正,而不是被调用代码忽略或被调用代码"处理"。

这是这种情况下的检查

if (inList == nullptr) throw gcnew ArgumentNullException(L"value");

另一方面,传递一个空列表似乎一点也不例外。您应该考虑接受一个空列表作为属性值。如果这没有意义,也许您应该在设计类时不使用读写属性,而是使用方法和只读属性等。

其他问题:

  • 考虑Systems::Collections::Generic::List<T>而不是System::Collections::ArrayList
  • 请考虑将列表公开为只读集合