9

私のプロジェクトの 1 つに、ビデオ形式のカスタム識別子文字列を表す値の型/構造体があります。この場合、コンテンツ タイプの文字列が含まれますが、これは異なる場合があります。

構造体を使用したので、渡されるときに厳密に型指定でき、初期文字列値に対していくつかの健全性チェックを実行できます。実際の文字列値は任意であり、外部プラグイン ライブラリによって提供されるため、数値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");

これは、値が定数でなければならないという switch ブロックを除いて、ほとんどの場合に機能するようです。.ToString()内部メンバーまたはオーバーライドをオンにせずに、この型と静的値をスイッチ ブロックで直接利用する方法はありますか?

enum数値またはプレーン文字列定数で指定された設計時間を使用せずにこれを行うためのより良い全体的な方法はありますか?

4

3 に答える 3

13

更新: C# 7 の switch ステートメントの新しいルールにより、この回答は完全に正確ではなくなりました。詳細については、C# 7 のドキュメントを参照してください。


このタイプと静的な値をスイッチブロックで直接利用する方法はありますか

いいえ。switch ステートメントの管理型は、sbyte、byte、short、ushort、int、uint、long、ulong、char、bool、任意の列挙型、それらのいずれかの null 許容値型、または文字列のいずれかである必要があります。また、ケース ラベルで使用される定数は、管理型と互換性のあるコンパイル時定数でなければなりません。

于 2013-03-19T00:09:59.733 に答える
3

switch実際には、ステートメントをまったく使用する必要がないように、コードをリファクタリングする方がよい場合があります。構造自体はアンチパターンではありませんが、代わりにポリモーフィズムを使用することが一般的に受け入れられています。これは、を取り除く方法についての別の議論ですswitch

于 2013-03-18T23:08:46.790 に答える
1

あなたが作業しているすべての可能なビデオフォーマットは、列挙を使用するための古典的な例になる可能性があるように私には思えます。他の形式が追加されるときに、列挙を新しい値で拡張することに問題はありません。VideoFormatはい、重要なことは、プログラムで使用されているものが列挙型に適合することを確認する必要があることです。でも多分デメリットにはならない。

于 2013-03-18T23:45:17.403 に答える