我正在重构一个通过构造函数接收可选委托的函数。委托在类中触发事件时运行。如果未传递委托,则使用本地默认函数:
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 Action 捕获为异常(如果外部调用者使用 null 而不是使用重载的构造函数)。我可以从代表中删除只读,但再次感觉不是一个很好的解决方案,因为它们真的是只读的。
任何想法将不胜感激。