1

::Collections::ArrayList へのハンドルに 2 つの単純なアクセサー/ミューテーター関数でアクセスしようとしています。

/** --------------------------------------------
 * 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) 、参照がオブジェクトで呼び出されなかったことをスローして追加します(または、これらの行に沿った何か、洗練されたものから翻訳する必要があります:/ )。ここで inList 変数が存在するかどうかを確認します。->Count

ArrayListC++/CLI Visual Studio 2008 を使用しているときに が存在するかどうかを確認する正しい (または少なくとも:D) 方法は何ですか?

4

3 に答える 3

2

最初に、カウントをチェックする前に null をチェックします

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

実際にそのメンバーにアクセスする前に、null ポインターを確認してください。

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

また、コメントで Konrad が述べているように、System::Collections::ArrayListは廃止されているため、代わりにvectorを使用してみてください

于 2013-07-18T11:03:18.907 に答える
1

プロパティ セッターは、プロパティを渡された値に設定するか、エラーを示す必要があります。エラーを示す方法は 2 つあります。引数の例外をスローするか (一般的)、オブジェクトを無効な状態に変更して、オブジェクトの将来の操作で公開されるようにします (データ バインディングで使用することを意図したクラスなどはまれです)。

プロパティを null に設定してもエラーにはならない可能性がありますが、あなたの質問はそれを許可しないことを意味します。そのため、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 に答える