Je suis en train de refactoriser une fonction qui accepte un délégué optionnel à travers le constructeur. Le délégué est exécuté lorsque des événements sont déclenchés dans la classe. Si le délégué n'est pas passé alors une fonction locale par défaut est utilisé à la place:Quelle est la meilleure façon de gérer les délégués optionnels dans un constructeur 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;
}
}
Je cherche à supprimer la valeur par défaut (ce qui est une interface publique surcharge donc serait préférable), ce qui est en production code donc je ne veux pas changer l'interface sauf si je dois.
Dans un monde idéal, je voudrais utiliser l'enchaînement constructeur:
public Foo(Action onEventOne) : this(onEventOne, DefaultEventTwo)
{
//CS0120 An object reference is required for the non-static field, method, or property 'Foo.DefaultEventTwo()
}
(je comprends pourquoi cela ne fonctionne pas, il suffit de donner un exemple du genre de solution que je voudrais utiliser si cela était pas un constructeur). Comme les délégués sont en lecture seule, je ne peux pas les définir dans une fonction de type initialize partagée.
Existe-t-il un meilleur moyen de gérer un cas comme de simplement passer en null et de l'attraper dans le constructeur principal? Il ne semble pas très élégant, et j'aimerais pouvoir attraper une Action nulle comme une exception idéalement (car si un appelant externe utilisait null au lieu d'utiliser le constructeur surchargé). Je pourrais enlever le readonly des délégués mais encore une fois il ne se sent pas comme une bonne solution car ils sont vraiment en lecture seule.
Toutes les pensées seraient appréciées.
publique 'Foo (Action onEventOne): ce (onEventOne, null)' serait un chemin ou 'public Foo (Action onEventOne): ceci (onEventOne, nouvelle Action (Console.Beep))' ou vous avez une fonction comme: 'public static void NoEvent() { // NeNo() }' et le gérer comme: '..., nouvelle action (NoEvent) ' – TripleEEE
Et puis vous vérifiez simplement' null' et si elle passe, appelez 'DefaultEventTwo' au lieu du délégué (non) fourni. – HimBromBeere