我有使用这种方法的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
一样工作吗?)
我知道我需要重新编译才能更改代码,但没关系。
答案 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,则执行预处理程序指令非常简单。
如果您不使用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;
}
}
如果我忘记了一个选项,请随时评论:)