Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 你如何使用#define?_C# - Fatal编程技术网

C# 你如何使用#define?

C# 你如何使用#define?,c#,C#,我想知道它在使用sent-to-use#define和#if语句时会出现什么情况。我知道它有一段时间了,但从来没有把它纳入我的编码方式。这究竟如何影响编译 #定义是否是确定编译时是否包含代码的唯一因素?如果我有#define DEBUGme作为自定义符号,那么将其从编译中排除的唯一方法就是删除这个#define语句 嗯,定义通常用于编译时常量和宏。这可以使代码更快一些,因为实际上没有函数调用,宏的输出值是在编译时确定的。“如果”非常有用。我能想到的最简单的例子是检查调试构建以添加一些额外的日志记

我想知道它在使用sent-to-use#define和#if语句时会出现什么情况。我知道它有一段时间了,但从来没有把它纳入我的编码方式。这究竟如何影响编译

#定义是否是确定编译时是否包含代码的唯一因素?如果我有#define DEBUGme作为自定义符号,那么将其从编译中排除的唯一方法就是删除这个#define语句


嗯,定义通常用于编译时常量和宏。这可以使代码更快一些,因为实际上没有函数调用,宏的输出值是在编译时确定的。“如果”非常有用。我能想到的最简单的例子是检查调试构建以添加一些额外的日志记录或消息传递,甚至可能是一些调试功能。您还可以通过这种方式检查不同的环境变量


我敢肯定,其他拥有更多C/C++经验的人可以添加更多功能。

我经常发现自己定义了一些在某些函数中重复执行的功能。这使得代码更短,因此可以更好地进行概述

但和往常一样,试着找到一个好的方法,不要用它来创造一种新的语言。对于以后的偶尔维护,可能有点难以阅读。

在C#
#中,定义
宏是不允许的,就像Bernard的一些示例一样。如果C语言中的s,则定义/
#的唯一常用用法是添加可选的仅调试代码。例如:

        static void Main(string[] args)
        {
#if DEBUG
            //this only compiles if in DEBUG
            Console.WriteLine("DEBUG")
#endif 
#if !DEBUG
            //this only compiles if not in DEBUG
            Console.WriteLine("RELEASE")
#endif
            //This always compiles
            Console.ReadLine()
        }
#define用于定义编译时常量,如果要包含或排除代码位,可以将其与#一起使用

#define USEFOREACH

#if USEFOREACH
    foreach(var item in items)
     {  
#else
    for(int i=0; i < items.Length; ++i)
     { var item = items[i];   //take item
#endif

       doSomethingWithItem(item);
     }
#定义USEFOREACH
#如果使用每个
foreach(项目中的var项目)
{  
#否则
对于(int i=0;iE/CODL> 

@ ED:当使用C++时,在创建宏时,使用超定义比内联函数几乎没有任何好处。“更大速度”的概念是一个误解。使用内联函数,您可以得到相同的速度,但也可以获得类型安全,并且预处理器“粘贴”没有副作用。由于参数是在调用函数之前计算的(例如,尝试编写无处不在的MAX宏,并像这样调用它:MAX(x++,y)…您将看到我的意思)

<>我在C语言中从来没有用到过定义,而且我很少使用它来做其他的平台和编译器版本检查C++中的条件编译。 定义是唯一可以 确定是否包含代码 何时编译?如果我有定义 DEBUGme作为自定义符号 将其从编译中排除的方法是 是否删除此#define语句

你也可以使用符号

#if defined(DEBUG)
#undef DEBUG
#endif

也许“C#define in C#”最常见的用途是区分调试/发布和不同的平台(例如XNA框架中的Windows和X-Box 360)。

它用于条件编译,因此您可以根据项目属性包括或删除一些代码,这些属性通常是:

  • 预期平台(Windows/Linux/XB360/PS3/Iphone等)
  • 发布或调试(通常,日志记录、断言等仅包含在调试版本中)
它们还可用于快速禁用系统的大部分, 例如,在游戏开发过程中,我可能会定义

#define PLAYSOUNDS
然后将最后一个调用包装起来,在其中播放声音:

#ifdef PLAYSOUNDS
// Do lots of funk to play a sound
return true;
#else
return true;
因此,对于我来说,为构建打开和关闭声音播放是非常容易的(通常我在调试时不播放声音,因为这会妨碍我的个人音乐:) 这样做的好处是,您不会通过添加if语句来引入分支……

#if defined(X)
可能不再有效(至少它不是在Visual Studio 2019中使用C#8.0为我编译的!)。您仍然可以这样做,只要将第1行更改为
#if DEBUG
#define
的主要用例用于条件编译(在这方面它可能非常有用)。您正确地认为,对符号和(请不要这样做)宏使用
#define
不是一个好的用例。