2009-04-02 1 views
9

Betrachten Sie den folgenden Code ein:Gibt es eine Möglichkeit, den C# -Compiler Warnungen anzeigen zu lassen, wenn eine switch-Anweisung nicht behandelte Fälle enthält?

 private enum myEnum 
     { 
      A, 
      B 
     } 
     private void myMethod(myEnum m) 
     { 
      switch (m) 
      { 
       case myEnum.A: 
        //do stuff 
       break; 
       case myEnum.B: 
        //do stuff 
       break; 
       default: 
        throw new NotImplementedException(m.ToString()); 
      } 
     } 

Wenn ich jemals ein drittes Element C zu MyEnum hinzufügen, ich werde nur zur Laufzeit von einem zu tun haben, ich würde

Was

NotImplementedException gewarnt werden möchte, ist der Compiler warnen Sie mich, wenn es einen Schalter mit unbehandelten Fällen und kein Standard gibt: case.

Gibt es eine Möglichkeit, dies zu tun, oder eine andere Lösung für dieses Problem, das ultimative Ziel ist es, zur Kompilierungszeit gewarnt zu werden, dass etwas fehlt?

Antwort

6

Leider ist hier keine Compiler-Funktion, um dies für Sie zu tun.

Anstatt eine Enum zu haben, haben Sie eine Basisklasse oder eine Schnittstelle. MyMethod ist auf der Schnittstelle definiert.

Jedes enum-Member wird jetzt eine Klasse mit unterschiedlichem Verhalten für myMethod. Wenn Sie eine Klasse hinzufügen (um die Optionen zu erweitern, würden Sie derzeit ein Enum-Element hinzufügen), implementieren Sie aber myMethod nicht, erhalten Sie einen Compilerfehler.

mit vielen Stellen in Code, wo Sie unterschiedliche Verhalten in Select-Anweisungen bieten, ist ein Geruch, den Sie möglicherweise Polymorphismus verwenden müssen.

EDIT

Der beste Rat, den ich geben kann, ist Unit-Tests für jede Funktion zu erstellen, die auf der Switch-Anweisung beruht und nennt es für jeden Wert in der Aufzählung (Sie können die Werte zur Laufzeit erhalten mit das GetValues-Mitglied in der Enum-Klasse)

+0

, dass ein guter Punkt. Aber in meiner Situation glaube ich nicht, dass es zutrifft (es würde zu fast leeren Klassen führen, die eine Logik enthalten, die nicht in ihrer Verantwortung liegt.Normalerweise habe ich einige DataContracts, die enumerierte Member enthalten, und meine GUI schaltet diese Member ein, um zu sehen, wie sie formatiert werden.) – Brann

+0

Ein gutes Muster, aber vorsichtig. Wenn Ihr Enum groß ist und Ihr Switch nur einige wenige Fälle bewältigen muss, möchten Sie wahrscheinlich keine Zillion-Klassen erstellen. –

+0

+1 für die Bearbeitung. =) –

1

Nein, es gibt nichts in der Sprache, um dies zu überprüfen.

Sie können eine haben:

default: 
    throw new ArgumentOutOfRangeException("Invalid value or bug"); 

Fall, aber offensichtlich eher Ausführungszeit, das ist als Kompilierung der Zeit.

1

Nie benutzt, aber FxCop kann hilfreich sein. Es unterstützt das Schreiben von benutzerdefinierten Regeln. Natürlich ist das keine Kompilierzeitprüfung, sondern etwas, das in Ihre Prozesse integriert werden kann.

0

Dies kann ein Wartungs-Albtraum werden, musste eine loooooot Zeit damit verbringen, einen fehlenden Enum-Wert in einer switch-Anweisung zu debuggen.

Schrieb eine kleine Klasse Switch-Anweisungen über ein wenig mehr wartungsfreundlich,

enter image description here

Die Klasse stellt sicher, dass alle Enum-Werte werden entweder behandelt oder explizit ignoriert, es wirft einen NotImplementedExpcetion anders zu machen.

Schauen Sie sich den Quellcode und weitere Details here

Verwandte Themen