私はコンストラクタを介してオプションのデリゲートを受け取る関数をリファクタリングしています。デリゲートは、クラス内でイベントがトリガーされたときに実行されます。デリゲートは、その後渡されていない場合はローカルのデフォルトの機能が代わりに使用されています。私は、デフォルト値を(これは非常に望ましいだろうオーバーロードをパブリックインタフェースである)を除去するために探していますが、これは生産されてC#コンストラクタで任意の代理人を処理する最善の方法は何ですか?
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アクションをキャッチすることができるようにしたいと思います。私は代議員から読んだものを取り除くことができましたが、本当に読んでいるだけに、素晴らしい解決策のようには感じられません。
どのような考えにも感謝します。
公共 'フー(アクションonEventOne):この(onEventOne、ヌル)は'だろうどのような他のすべての呼び出しがどこから来たのかを示すのparamで呼び出す「メイン」 - オンとして内部コンストラクタを使用する方法についてpublic static void NoEvent() { // DoNothing() } 'のようなfuncを持っています。次のように扱う: '...、new Action(NoEvent) ' – TripleEEE
そして、(nullではない)デリゲートの代わりに' DefaultEventTwo'を呼び出すと 'null'をチェックします。 – HimBromBeere