1

我正在尝试使用两个简单的访问器/突变器函数访问 ::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 变量是否存在。

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

4

3 回答 3

2

最初,在检查 count 之前检查 null

if (inList != nullptr)
{
     if(inList->count)
     {}
}
于 2013-07-18T10:18:41.250 回答
1

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

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

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

于 2013-07-18T11:03:18.907 回答
1

属性设置器应该将属性设置为传递的值或指示错误。有两种方法可以指示错误:要么抛出参数异常(常见),要么将对象更改为无效状态,该状态会在以后对对象的操作中暴露(很少见,例如,旨在与数据绑定一起使用的类)。

可能将属性设置为 null 不应该是错误,但您的问题暗示您要禁止这样做。因此,在需要非空列表的地方传递 null 是一个Boneheaded Exception。这是应该在发布之前更正的东西,而不是被调用代码忽略或调用代码“处理”的东西。

这是这种情况下的检查:

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

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

其他问题:

  • 考虑Systems::Collections::Generic::List<T>代替System::Collections::ArrayList
  • 考虑将列表公开为只读集合。
于 2013-07-18T12:54:35.713 回答