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)移动到单独的库中。

例如,创建您的主应用程序将使用的接口。并创建这些接口的两个实现——一个使用 Linq,另一个不使用:

在主要项目中:

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

没有应用#defineon的意义usings,因为这样你就不会从你的项目中取消链接库,我想你想避免在某些情况下引用。

.NET 中没有条件程序集引用(如果不手动完成,则动态完成)。

因此,预处理器指令的主要使用点只是名称空间enable/disable内的部分代码。

于 2012-12-12T09:29:22.303 回答