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