20

_MFC_VERMFCを使用しているときに、マクロをチェックすることでMFCフレームワークの複数のバージョンをサポートできることを思い出すことができます。

私は現在.NET4でいくつかの作業を行っており、いくつかの場所でタプルを使用したいのですが、それでも他のすべての3.5互換性を維持したいと思います。

私は次のようなことをしたいと思っています:

#if DOTNET4
    public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
    public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
4

5 に答える 5

11

.csproj(または理論的には.vbproj)でカスタムコンパイルシンボルを定義するときに注意すべき大きな注意点が1つあります。これらは、以前に定義されたすべてのコンパイルシンボルを上書きします。たとえば、MSBuildスニペットについて考えてみます。

  <PropertyGroup Condition="'$(TargetFrameworkVersion)' == 'v4.0'">
    <DefineConstants>$(DefineConstants);DOTNET_40</DefineConstants>
  </PropertyGroup>
  <PropertyGroup>
    <DefineConstants>ITS_CLOBBERING_TIME</DefineConstants>
  </PropertyGroup>

2番目のDefineConstants要素は、その値が示すように、DefineConstantsの最初の値を上書きします。これを回避するには、2番目のDefineConstants要素を次のように書き直します。

    <DefineConstants>$(DefineConstants);ITS_CLOBBERING_TIME</DefineConstants>

また、これは他のすべてのPropertyGroupsの後に定義されたPropertyGroup内に配置する必要があります。これは、Visual Studio 2010が現在、Visualの前に配置されている場合に定義する他のカスタムコンパイルシンボルを覆い隠すような方法でカスタムコンパイルシンボルを追加するためです。 Studioはその定義を落とします。この問題をMicrosoftに提出しました。その進捗状況は、MicrosoftConnectで追跡できます。

于 2010-09-10T04:34:36.937 に答える
7

使用できる組み込みのプリコンパイラ定数はありません。ただし、VSで独自のビルド構成を作成するのは簡単です。各構成には、独自の定義済み定数のセットと、もちろんターゲットフレームワークバージョンがあります。多くの人がこれを行って、32ビットまたは64ビットの違いに基づいて条件付きでコンパイルします。

于 2009-09-20T00:34:47.620 に答える
7

ちなみに、条件付きコンパイルコードは、それに遭遇するプログラマーを苛立たせます。

コメントに基づいて編集

独自のクラスを作成して、それが何をするかを保証でき、奇妙な署名や継承の問題が発生しないようにすることをお勧めします。

public class Pair<TSource, TResult>
{
    public TSource Source { get; set; }
    public TResult Result { get; set; }

    public Pair() {}
    public Pair(TSource source, TResult result)
    {
        Source = source;
        Result = result;
    }

    // Perhaps override Equals() and GetHashCode() as well
}

いつものように、組み込みのものを使用するか、独自のコードをロールアウトするかを比較検討することをお勧めします。一般的には、「このコードを維持およびサポートしても大丈夫ですか?」と自問することを意味します。vs.「コードは、箱から出して、必要なことを実行しますか?」

この場合、あなたが持っていることが保証されていないTuple<T1, T2>ので、他の開発者が簡単に呼吸できるように、私はあなた自身の単純なものを書くだけです:)

于 2010-09-29T15:22:57.363 に答える
4

.NET Coreビルドシステムを使用している場合は、事前定義されたシンボルを使用できます。

#if NET40
    public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
    public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif

事前定義されたシンボルのリストは、クロスプラットフォームツールを使用したライブラリの開発#if(C#リファレンス)に記載されています。

.NET Framework:、、、、、、、、、、、、、、、、、NETFRAMEWORK_ NET48_ NET472_ NET471_ NET47_ NET462_ NET461_ NET46_ NET452_ NET451_NET45NET40NET35NET20

.NET標準:、、、、、、、、、、、、NETSTANDARD_ NETSTANDARD2_1_ NETSTANDARD2_0_ NETSTANDARD1_6_ NETSTANDARD1_5_ NETSTANDARD1_4_NETSTANDARD1_3NETSTANDARD1_2NETSTANDARD1_1NETSTANDARD1_0

.NET 5+ (および.NET Core ):、、、、、、、、、、、、、、、、、、、、、NET_ NET6_0_ NET6_0_ANDROID_ NET6_0_IOS_ NET6_0_MACOS_ NET6_0_MACCATALYST_ NET6_0_TVOS_ NET6_0_WINDOWS_NET5_0NETCOREAPPNETCOREAPP3_1NETCOREAPP3_0NETCOREAPP2_2NETCOREAPP2_1NETCOREAPP2_0NETCOREAPP1_1NETCOREAPP1_0

于 2019-11-21T17:01:28.520 に答える
1

さまざまなプロジェクトが必要なため、部分的なクラスを作成し、各プロジェクトに必要なクラスのみを特定のロジックで参照することができます。

classname.cspublic部分クラス名{...}

classname.40.cspublic部分クラス名{publicTupleSomeMethod(){...}}

classname.35.cspublic部分クラス名{publicKeyValuePairSomeMethod(){...}}

于 2014-08-05T02:54:31.807 に答える