0

私が制御できない外部データを扱うプログラムを書いています。このデータは時間の経過とともに変化しますが、プログラムがさまざまなバージョンと互換性を持つようにしたいと考えています。他の言語では、#define を使用してバージョンを指定し、#if を使用して、指定されたバージョンに必要なことを行います。お気に入り

#if VERSION >= 5
    ...
#endif

C# ではシンボルを定義することしかできないため、これが不可能であることはわかっていますが、シンボルに何かを割り当てることはできません。だから私は疑問に思っています、これを達成するための最良の方法は何ですか? VERSION_5 のようなものを定義することもできますが、特定のバージョン、特にrangeをチェックできるようにしたいのですが、これは面倒です。私が考えることができる次善の策は const ですが、これは実行時にチェックする必要があるため、動作が少し遅くなる可能性があります。私のプロジェクトでそれが目立つかどうかはわかりませんが、心配です。

C#でこれを行う標準的な方法はありますか? 最善の方法は何ですか?

4

3 に答える 3

1

データ処理用に1つまたは複数のインターフェイスを作成します。各インターフェイスは、バージョン範囲ごとに1回ずつ、複数回実装される可能性があります。これらのインターフェースの実装は、データを処理するクラスに注入されます。

このようなもの:

public interface IDataProcessor
{
    void Process(Data data);
    bool SupportsVersion(int version);
}

データハンドラークラスの場合:

foreach(var dataProcessor in _dataProcessors)
{
    if(dataProcessor.SupportsVersion(versionOfCurrentData))
    {
        dataProcessor.Process(data);
    }
}
于 2012-09-11T08:14:59.197 に答える
0

この例は、.NET のバージョンに依存します。一部のプロジェクトでは、

#if NET_2_0
...
#endif
#if NET_3_5
...
#endif
#if NET_4_0
...
#endif
#if NET_4_5
...
#endif

.NET 1.1 のライフサイクルの終わりに、より少ない条件を維持するために、単純に NET_2_0 条件を削除します。

.NET 4.5 のプロジェクト ファイルで、NET_2_0、NET_3_5、NET_4_0、NET_4_5 を定義します。

.NET 4.0 のプロジェクト ファイルで、NET_2_0、NET_3_5、NET_4_0 を定義します。

.NET 3.5 のプロジェクト ファイルで、NET_2_0、NET_3_5 を定義します。

.NET 2.0 のプロジェクト ファイルで、NET_2_0 を定義します。

.NET 1.1 のプロジェクト ファイルでは、define シンボルはありません

于 2012-09-11T08:35:00.617 に答える
0

私が制御できない外部データを扱うプログラムを書いています。

そのため、サーバー アプリケーションでありながら、任意のバージョンでフォーマットされたデータを受け取る可能性があるため、すべてをサポートする必要があります。そのため、ディレクティブを介してコンパイル時の決定を行うべきではありません。サポートされているパターンについてデータ ランタイムを分析し、パターンを認識した後に適切な処理を続行する必要があります。たとえば、異なるバージョンに対して異なるスレッドを実行すると、レコグナイザーは認識されたデータを適切なスレッドに並行して渡す必要があり、未知のデータも失敗します!

于 2012-09-11T08:36:52.830 に答える