2013-03-18 7 views
8

Eines meiner Projekte hat einen Werttyp/struct, der eine benutzerdefinierte ID-Zeichenfolge für ein Videoformat darstellt. In diesem Fall enthält es eine Zeichenfolge vom Inhaltstyp, die jedoch variieren kann.Benutzerdefinierte Struktur/Typ, der mit switch() verwendet werden kann

Ich habe eine Struktur verwendet, so dass es stark sein kann, wenn es herumgereicht wird, und führen Sie einige Plausibilitätsprüfungen für den ursprünglichen Zeichenfolgenwert durch. Der tatsächliche Zeichenfolgenwert kann alles sein und wird von externen Plugins-Bibliotheken bereitgestellt, so dass eine numerische enum nicht zutrifft.

Da es ein paar sehr häufige Formate gibt, habe ich diese als statische schreibgeschützte Felder mit Standardwerten verfügbar gemacht.

public static readonly VideoFormat Unknown = new VideoFormat(string.Empty); 
public static readonly VideoFormat JPEG = new VideoFormat("image/jpeg"); 
public static readonly VideoFormat H264 = new VideoFormat("video/h264"); 

Dies scheint in den meisten Fällen mit Ausnahme eines Schalterblocks zu funktionieren, in dem angegeben wird, dass der Wert eine Konstante sein muss. Gibt es irgendeine Möglichkeit, diesen Typ und die statischen Werte direkt in einem Schaltblock zu verwenden, ohne das interne Element oder den .ToString() Override einzuschalten?

Gibt es eine bessere Gesamtmethode, um dies zu tun, ohne eine Entwurfszeit enum mit numerischen Werten oder einfachen String-Konstanten zu verwenden?

+0

Warum nicht sonst if-Anweisung anstelle einer switch-Anweisung? – Nathan

+0

@Nathan 'if ... else' ist eine Option, aber ich habe in der Vergangenheit' switch' bevorzugt, wo die Bedingungen mehrere sind und "fixed" – Deanna

+0

Ich habe das Bit entfernt nach der besten Methode gefragt, um gemeinsame Werte zu veröffentlichen und verschoben es zu [dieser Frage] (http://stackoverflow.com/q/15489000/588306). – Deanna

Antwort

11

UPDATE: Diese Antwort ist aufgrund neuer Regeln für Switch-Anweisungen in C# 7 nicht mehr vollständig zutreffend. Weitere Informationen finden Sie in der C# 7-Dokumentation.


Gibt es eine Möglichkeit, die Verwendung dieser Art und die statischen Werte direkt in einem Schalterblock

Nr Die Regierungs Typ einer switch-Anweisung muss man sein machen kann sbyte, byte, kurz, ushort, int, uint, lang, ulong, char, bool, alle enum, die nullbaren Werttypen von diesen oder die Zeichenfolge. Und die in den Case-Labels verwendeten Konstanten müssen Kompilierzeitkonstanten sein, die mit dem Steuerungstyp kompatibel sind.

3

Eigentlich könnte es besser sein, den Code zu refaktorieren, so dass Sie switch Anweisungen überhaupt nicht verwenden müssen. Obwohl die Konstruktion selbst kein Anti-Pattern ist, ist es allgemein üblich, stattdessen polymorphism zu verwenden. Here ist eine andere Diskussion über die Möglichkeiten, switch loszuwerden.

1

Es scheint mir, dass alle möglichen Videoformate, mit denen Sie arbeiten, ein klassisches Beispiel für die Verwendung von Aufzählungen sein könnten. Ich sehe wirklich kein Problem, Ihre Aufzählung mit neuen Werten zu erweitern, wenn einige andere Formate hinzugefügt werden. Ja, die wichtige Sache, die wir sicherstellen müssen, dass alle in dem Programm verwendeten VideoFormat die Aufzählung passen sollte. Aber möglicherweise wird es kein Nachteil sein.

+0

Formate können über Plugins außerhalb der Core-Bibliothek hinzugefügt und bearbeitet werden. Ich möchte es nicht mit X fixierten Formaten verknüpfen. – Deanna

+0

Dann können Sie vielleicht ein Wörterbuch verwenden? – Shymep

+0

Wie würde ein Wörterbuch helfen? Es ist nur eine String-Kennung, die zu den Rahmendaten gehört. – Deanna

Verwandte Themen