如何检查System :: Collections :: ArrayList是否存在/为空

时间:2013-07-18 09:44:48

标签: c++ visual-studio-2008 c++-cli

我正在尝试使用两个简单的访问器/ mutator函数访问:: 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并添加引用未在对象上调用(或类似的东西,我必须将它从polish:/ 转换)当我尝试访问->Count属性(查看代码中的错误行),因为有人告诉我here检查inList变量是否存在。

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

3 个答案:

答案 0 :(得分:2)

最初,在检查计数

之前检查null
if (inList != nullptr)
{
     if(inList->count)
     {}
}

答案 1 :(得分:1)

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

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

此外,正如Konrad在评论中所述, System :: Collections :: ArrayList 已过时,请尝试使用 vector 而不是

答案 2 :(得分:1)

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

将属性设置为null可能不是错误,但您的问题意味着您想要禁止它。因此,在期望非空列表的位置传递null是Boneheaded Exception。它应该在发布之前得到纠正,不会被被调用的代码忽略或被调用代码“处理”。

在这种情况下,这是检查

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

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

其他问题:

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