我正在尝试使用两个简单的访问器/ 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)方法是什么?
答案 0 :(得分:2)
最初,在检查计数
之前检查nullif (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