| 50行目: | 50行目: | ||
以下の例では、例外クラスを作成している。<br> | 以下の例では、例外クラスを作成している。<br> | ||
<br> | <br> | ||
例外クラスは、<code>System.Exception</code>クラスを継承する。<br> | |||
4つのコンストラクタは、与えられた引数を基底クラス(System. | 4つのコンストラクタは、与えられた引数を基底クラス(<code>System.Exception</code>クラス)のコンストラクタに渡す。<br> | ||
<br> | <br> | ||
3番目のコンストラクタは、例外メッセージと共に、例外の原因となる別の例外への参照を<code>innerException</code>に設定して、<br> | |||
例外クラスのインスタンスを初期化するためのものである。<br> | 例外クラスのインスタンスを初期化するためのものである。<br> | ||
<br> | <br> | ||
<code>SerializableAttribute</code>属性と4番目のコンストラクタにより、例外クラスは、ソフトウェアのドメイン境界を越えることができる。<br> | |||
<code>SerializableAttribute</code>属性がある全てのクラスは、フォーマッタを使用してシリアル化が可能になる。<br> | |||
特に、例外クラスに<code>SerializableAttribute</code>属性がある場合、例外がソフトウェアのドメイン境界を超える時、必要に応じて自動的にシリアル化を行う。<br> | |||
<br> | <br> | ||
シリアル化されて、別のソフトウェアのドメインからスローされた例外オブジェクトを正しく受け取るためには、<br> | シリアル化されて、別のソフトウェアのドメインからスローされた例外オブジェクトを正しく受け取るためには、<br> | ||
| 65行目: | 65行目: | ||
<br> | <br> | ||
4番目のコンストラクタは、フォーマッタが呼び出すために存在するため、設計者が明示的に呼び出すことはない。<br> | 4番目のコンストラクタは、フォーマッタが呼び出すために存在するため、設計者が明示的に呼び出すことはない。<br> | ||
また、呼び出されることを避けるため、<code>protected</code>修飾子を付加する。(フォーマッタは、アクセス修飾子に関係なく呼び出すことができる)<br> | |||
<br> | |||
逆シリアル化コンストラクタが<code>public</code>修飾子の場合、任意のコードから不正なデータを渡して例外クラスのインスタンスを生成できる。<br> | |||
また、例外クラスを継承禁止にする(<code>sealed</code>修飾子を付加する)場合は、逆シリアル化コンストラクタに<code>private</code>修飾子を付加することもできる。<br> | |||
<syntaxhighlight lang="c#"> | <syntaxhighlight lang="c#"> | ||
using System; | using System; | ||