Я рефакторинг функции, которая принимает необязательный делегат через конструктор. Делегат запускается, когда события запускаются внутри класса. Если делегат не передается, то локальная функция по умолчанию используется вместо:Каков наилучший способ работы с необязательными делегатами в конструкторе 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 вместо использования перегруженного конструктора). Я мог удалить readonly от делегатов, но опять же, это не похоже на отличное решение, поскольку они действительно только для чтения.
Любые мысли будут оценены.
общественности 'Foo (Действие onEventOne): это (onEventOne, нуль)' будет путь или 'public Foo (Action onEventOne): this (onEventOne, new Action (Console.Beep))' или у вас есть func вроде: 'public static void NoEvent() { // DoNothing() }' и обрабатывайте его так: '..., new Action (NoEvent) ' – TripleEEE
И тогда вы просто проверяете на' null', и если он передает вызов 'DefaultEventTwo', а не (не) предоставленный делегат. – HimBromBeere