コンストラクターを介してオプションのデリゲートを受け取る関数をリファクタリングしています。クラス内でイベントがトリガーされると、デリゲートが実行されます。デリゲートが渡されない場合は、代わりにローカルのデフォルト関数が使用されます。
public class Foo
{
int _memberVariable;
readonly Action _onEventOne;
readonly Action _onEventTwo;
public Foo(Action onEventOne, Action onEventTwo = null)
{
_memberVariable = 0;
_onEventOne = onEventOne;
_onEventTwo = onEventTwo ?? DefaultEventTwo;
_onEventOne();
}
private void DefaultEventTwo()
{
++_memberVariable;
}
}
デフォルト値を削除しようとしています (これはパブリック インターフェイスであるため、オーバーロードが望ましいでしょう)。これは運用コードに含まれているため、必要がない限りインターフェイスを変更したくありません。
理想的な世界では、コンストラクター チェーンを使用します。
public Foo(Action onEventOne) : this(onEventOne, DefaultEventTwo)
{
//CS0120 An object reference is required for the non-static field, method, or property 'Foo.DefaultEventTwo()
}
(これがコンストラクターでない場合に使用するソリューションの種類の例を示すだけで、これが機能しない理由を理解しています)。
デリゲートは読み取り専用であるため、共有の初期化型関数でそれらを設定することはできません。
null を渡してからメインコンストラクターでキャッチするよりも、ケースを処理するためのより良い方法はありますか? あまり洗練されていません。理想的には、null アクションを例外としてキャッチできるようにしたいと考えています (オーバーロードされたコンストラクターを使用する代わりに外部呼び出し元が null を使用した場合)。デリゲートから読み取り専用を削除することもできますが、実際には読み取り専用であるため、優れたソリューションとは思えません。
任意の考えをいただければ幸いです。