2013-03-18 39 views
8

我的一個項目的值類型/結構表示視頻格式的自定義標識符字符串。在這種情況下,它將包含一個內容類型字符串,但可能會有所不同。可以與開關一起使用的自定義結構/類型()

我已經使用了一個結構體,因此當它傳遞時它可以是強類型的,並對初始字符串值執行一些完整性檢查。 實際的字符串值可能是任何東西,並由外部插件庫提供,因此數字enum不適用。

public struct VideoFormat { 
    private string contentType; 

    public VideoFormat(string contentType) { 
     this.contentType = contentType; 
    } 

    public string ContentType { 
     get { return this.contentType; } 
    } 

    public override string ToString() { 
     return this.contentType; 
    } 

    // various static methods for implicit conversion to/from strings, and comparisons 
} 

由於有幾個非常常見的格式,我已經露出使用默認值這些靜態只讀域。

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"); 

這似乎工作在大多數情況下,除了開關塊,它說,值必須是一個常數。有什麼方法可以直接在開關塊中使用此類型和靜態值,而無需打開內部部件或重寫?

有沒有更好的整體方法來做到這一點,而不使用設計時間enum與數值或純字符串常量?

+0

爲什麼不使用else if語句而不是switch語句? – Nathan 2013-03-18 23:22:22

+0

@Nathan'if ... else'是一個選項,但我歷史上首選'switch',其條件是多個並且「固定」 – Deanna 2013-03-18 23:26:54

+0

我已經刪除了詢問最佳方法以公開常見值並移動的位它來[這個問題](http://stackoverflow.com/q/15489000/588306)。 – Deanna 2013-03-18 23:42:44

回答

11

更新:由於C#7中的switch語句的新規則,此答案不再完全準確。有關詳細信息,請參閱C#7文檔。


有什麼辦法,我可以利用這個類型,並在開關塊直接靜態值

號switch語句的治理型必須是一個sbyte,byte,short,ushort,int,uint,long,ulong,char,bool,任何枚舉,任何這些值或字符串的可爲空值類型。並且case標籤中使用的常量必須是與控制類型兼容的編譯時間常量。

3

事實上,重構代碼可能會更好,因此您不必在處使用switch語句。雖然建築本身不是反模式,但通常採用polymorphism來代替。 Here是關於如何擺脫switch的另一個討論。

1

在我看來,您正在使用的所有可能的視頻格式可能是使用枚舉的典型示例。如果添加其他格式,我實在看不出有什麼問題可以用新值來擴展枚舉。是的,我們需要確保程序中使用的任何VideoFormat都適合枚舉。但可能它不會是一個缺點。

+0

可以通過插件在覈心庫之外添加和處理格式。我不想將它與X固定格式綁定。 – Deanna 2013-03-18 23:48:18

+0

那麼也許你可以使用字典? – Shymep 2013-03-18 23:53:08

+0

字典將如何提供幫助?這只是與幀數據一起使用的字符串標識符。 – Deanna 2013-03-18 23:57:20

相關問題