13

C#プリプロセッサディレクティブを使用して、コードの一部のコンパイルを有効/無効にできることを知っています。

同じファイルでディレクティブを定義すると、正常に機能します。

#define LINQ_ENABLED
using System;
using System.Collections.Generic;

#if  LINQ_ENABLED
using System.Linq;      
#endif

今、私はC++このすべての構成ディレクティブを単一のヘッダーファイル内に配置し、そのようなディレクティブが必要なすべてのファイルにインクルードすることに慣れています。

私がC#何かで同じことをした場合、うまくいきません:

//Config.cs
#define LINQ_ENABLED

//MyClass.cs
#define LINQ_ENABLED
using System;
using System.Collections.Generic;

#if  LINQ_ENABLED
using System.Linq;      
#endif

次のことも試しましたが、名前空間内にディレクティブを定義できないようです。

//Config.cs
namespace Conf{
#define LINQ_ENABLED
}

//MyClass.cs
#define LINQ_ENABLED
using System;
using System.Collections.Generic;
using Conf;
#if  LINQ_ENABLED
using System.Linq;      
#endif
  1. 私は何が間違っているのですか?
  2. のさまざまなファイルでプリプロセッサを使用する正しい方法は何 C#ですか?
  3. それを行うためのより良い方法はありますか?
4

4 に答える 4

11

.csprojには、次のセクションがあります。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DefineConstants>TRACE;DEBUG;LINQ</DefineConstants>
  </PropertyGroup>
</Project>

追加のプリプロセッサが必要な場合は、そこに追加できます。

または、プロジェクトのプロパティを介して、プロジェクトに自動的に追加されます。[ビルド]タブのプロパティ。

于 2012-12-12T09:27:31.957 に答える
4

Project|Propertiesからプロジェクト全体に対して実行できます。

AfaikにはC#でインクルードファイルを使用する方法がないため、ファイルのグループの場合、簡単な解決策はありません。

于 2012-12-12T09:27:18.807 に答える
3

ファイルに条件付きコンパイルを追加する代わりに、Linq を使用するコード ブロックと使用しないコード ブロックを追加します。すべてのデータ アクセス ロジック (つまり、Linq を使用する場合と使用しない場合の 2 つの実装を持つコード) を別のライブラリに移動しました。

たとえば、メイン アプリケーションが使用するインターフェイスを作成します。そして、これらのインターフェイスの 2 つの実装を作成します。1 つは Linq を使用し、もう 1 つは使用しません。

メインプロジェクトで:

public interface IUserRepository
{
    IEnumerable<User> GetUsersByCompanyName(string companyName);
}

Persistence.Linq.dll:

using System.Linq; 

public class UserRepository : IUserRepository
{
    public IEnumerable<User> GetUsersByCompanyName(string companyName)
    // use Linq here
}

Persistence.SomethingOther.dll:

public class UserRepository : IUserRepository
{
    public IEnumerable<User> GetUsersByCompanyName(string companyName)
    // do not use Linq here
}

IUserRepositoryの実装をメインのアプリケーション クラスに挿入できるようになりました。

于 2012-12-12T09:35:45.430 に答える
2

に適用する意味はあり#defineませんusings。このようにして、プロジェクトからライブラリのリンクを解除しないため、何らかの条件で参照することを避けたいと思います。

.NET には、条件付きアセンブリ参照のようなものはありません (手動で実行しない場合、動的に)。

したがって、プリプロセッサ ディレクティブの使用の主なポイントは、名前空間enable/disable内のコードの一部にすぎません。

于 2012-12-12T09:29:22.303 に答える