C#で自分用のクラスライブラリを作るとき、最中にもエラー対処パターンで悩みます。COM開発で使えるデザインパターンはおそらくHRESULTパターン、例外パターン、Nullableパターン(適当に名付けました)なのですが、一長一短です。
- HRESULTパターン
- 例外パターン
- Nullableパターン
- C++でもC#でもここ数年で本格導入されつつあるパターンだと思います。C++なら
std::optional
(C++20)やstd::expected
(C++23予定?)、C#ならNullable<T>
やT?
を使います。従来はポインタでしか表現できなかったnullptr
ornull
を標準ライブラリの機能で値型にも提供するパターンです。メモリや速度のコストは少々増えますが、C++なら三項演算子や今後導入されるモナド、C#ならパターンマッチングと極めて相性が良いです。ただし、C#ではnullptr
が素通りしてしまう$"{...}"
のような場合がしばしばあってバグの原因となりやすい印象があります。また、現状のC#ではC++のstd::expected
のようなメモリ消費の考慮された標準機能がないので具体的なエラーを把握しにくくなります。
- C++でもC#でもここ数年で本格導入されつつあるパターンだと思います。C++なら
WILのように複数のパターンを網羅してしまう(WILはHRESULT、例外、フェイルファスト)のもありだと思いますが、最適化でコードが消えない気がするC#ではすべてを準備するのはよろしくない気がします(最適化されていたらすみません)。ひとまずNullableパターンで落ち着こうと思いますが、まだまだ悩みながらになりそうです。