在C#中使用#ifdefs的问题

时间:2015-10-07 14:04:05

标签: c# c++ dll

我有使用这种方法的C ++代码:

#if defined(CONSTANT)
..
// Some code
#else
// Some other code

我被告知我可以在C#中使用类似的方法 - 因为我需要将这个C ++项目重写为C#。 但是有一个问题。从我在C#中看到的文档,如果我使用

#define CONSTANT

这只是在声明的文件中可见

但我不想要这个。我想在所有课程中看到这个CONSTANT? 我认为一个解决方案是在项目设置等中声明这样的常量 - 但这是我的第一个问题:在这种情况下,我是否需要使用我的DLL发送一些额外的文件?或者这些常量将嵌入DLL?

最后,为了避免上述问题,我正在考虑在C#中使用公共const值的方法。像

if(Globals.SomeConstant == SOMEVALUE)
// Do this
else
// Do smth else

然后根据配置,我将在Globals.SomeConstant声明期间将默认值设置为我需要的值,编译DLL并发送它。这听起来不错吗?它会像这样工作吗?是否可以在DLL方法中正确分配和读取默认值? (他们会像#ifdefs一样工作吗?

我知道我需要重新编译才能更改代码,但没关系。

2 个答案:

答案 0 :(得分:2)

C#没有"预处理器"就像C / C ++一样。这些#define也不是"常数" - 它们只是"符号",您只能查询是否存在。它们在编译的程序集中没有留下任何痕迹。

现在,当您使用(或不使用)#define d符号编译程序集时,结果可能会有所不同:

public const int I =
#if FOO_BAR
    42
#else
    43
#endif
;

关于#define,C / C ++和C#之间的概念差异在于C / C ++中的库通常以源代码形式分发,并且当与您自己的代码一起编译时,遵循全局{{1 }}秒。另一方面,在C#中,第三方代码通常作为已编译的程序集分发。因此,如果要更改此第三方程序集中的代码的工作方式,则必须在运行时执行此操作。

答案 1 :(得分:1)

如果您使用Visual Studio,则执行预处理程序指令非常简单。

  1. 选择项目
  2. 属性
  3. 构建
  4. On'条件编译符号'把你想要的符号放在你所有的程序集中
  5. 如果您不使用Visual Studio,请关注this topic

    有关预处理程序指令的学习目的,您可以访问Tutorialspoint C#网站。

    要使用C ++方法在C#中编写代码,可以使用以下语法:

    #define Name_Value
    
    #if (Name_value)
    {
       //code
    }
    

    如果这不符合您的需求,您可以使用配置文件,您可以在其中堆叠所有密钥名称 - 值并通过ConfigurationManger.AppSettings["Key"]

    访问它们

    另一种方法是拥有全局enum并分配值。

     public enum DemoEnum
     {
         Name = Value
     } 
    
     if(passedEnum == DemoEnum.Name)
     {
         // code
     }
    

    您使用常量提供的解决方案不是很灵活,因为如果您的代码发生更改,您将不得不创建新的常量并且图像变得太模糊。

    使用只读属性,您可以切换' const'的值。在你的方法中。

    public class Global
    {
        public readonly string Name;
    
        public Global()
        {
            if(condition)
               Name = 10;
            else
               Name = 30;
        }
    }
    

    如果我忘记了一个选项,请随时评论:)