注/免責事項:数回検索した後、この投稿に最も近いのは、SO(メソッドチェーンと仕上げの問題)に関する投稿です。これは私の質問に似ていますが、実際には答えられませんが、とにかく、これが重複した質問ではないことを願っています。
私がしていること:
一連のメソッド呼び出しのために、既存のロギングフレームワークのファサードとして流暢なインターフェイスを作成しました。そのため、構文は次のようになります。
Logger.Debug().Message("Debug message!").WriteToLog();
Logger.Error().Message("An exception occured").Exception(ex).WriteToLog();
あるメソッド呼び出しから次のオブジェクトに内部オブジェクトを渡して、最後の呼び出しが行われたときに(WriteToLogメソッド)。メッセージはどこかのログファイルに書き込まれます。
においがするビット
検証するために(アプリケーションがデバッグモードでビルドされている場合のみ)、チェーンが終了するまでメソッド呼び出しから返されたオブジェクトに渡されるコンテキストクラス(プロパティバッグオブジェクトのみ)にプロパティがあります。これはブール値であり、デフォルトはfalseです。
このプロパティは、Debug.Assertを使用してコンテキストクラスデストラクタで評価され、チェーンを終了する最後のメソッドが呼び出されたかどうかを判断して、開発中にログエラーを検出できるようにします。(プロパティ、プロパティを設定するコード、およびデストラクタ自体はすべて#if DEBUGプリプロセッサディレクティブのコンテキストで作成されるため、リリースに組み込まれている場合、またはシンボルが存在しない場合、コードは作成されません。コンパイルされます。)
c#2.0以降では、デストラクタの使用が不適切であり、ファイナライズ順序についての保証がないと思われるため、プロパティにアクセスできない可能性があることを知っています。これが、デバッグモードでビルドされた場合にのみ発生する理由であり、私がそれを避けたい理由です。
私がアサーションを作成しようとしている理由は、忘れがちで、次のようなコードを記述してしまうためです。
Logger.Debug().Message("Debug message!");
これは、大まかに見ると、ログに記録されるはずのように見えますが、何もログに記録されないことを意味します。
私の質問
私が知りたいのは、finalメソッドが常に呼び出されていることを確認する別の方法を誰かが考えられるでしょうか。これらのメッセージは、メソッドチェーンが終了していないことを開発者に強調するために、開発中に必要なだけです。エンドユーザーが最終製品へのログインに関連するエラーメッセージを見つけてほしくないのです。