前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 条件编译 (#if 和 Conditional)

C# 条件编译 (#if 和 Conditional)

作者头像
用户9127601
发布2021-11-01 16:49:38
3K0
发布2021-11-01 16:49:38
举报
文章被收录于专栏:dotNET编程大全

本文主要讲述C#中,使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景。


本文参考了c# Conditional用法详解和.NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景


条件编译符号和预处理符号

我们有时会使用 #if DEBUG 或者 [Conditional("DEBUG")] 来让我们的代码仅在特定的条件下编译。

而这里的 DEBUG 是什么呢?

在我们编写的 C# 代码中,这个叫做 “条件编译符号”(Conditional compilation symbols) 在项目的构建过程中,这个叫做 “定义常量”(Define constants) 而在将 C# 代码编译到 dll 的编译环节,这个叫做 “预处理符号”(Preprocessor symbols) 本文要讨论的是 #if 和 Conditional 的使用,这是在 C# 代码中的使用场景,因此,本文后面都将其称之为 “条件编译符号”。

对于C#,与 C 和 C++ 不同,您不能对符号赋予数值;C# 中的 #if 语句是 Boolean,仅测试符号是否已定义。

在项目ConsoleApp1设置中的生成中定义一个条件编译符号CONDITIONA。

下面请看ConsoleApp1的示例

代码语言:javascript
复制
using System;

namespace ConsoleApp1
{
    public class Class1
    {
        [Conditional("CONDITIONA")]
        public static void Hello1()
        {
            Console.WriteLine("Hello,我是Conditional条件下才可以执行的函数1");
        }

        public static void Hello2()
        {
#if CONDITIONA
            Console.WriteLine("Hello,我是#if条件下才可以执行的函数语句2");
#endif
        }
    }

    class Hello
    {
        static void Main(string[] args)
        {
            Class1.Hello1();
            Class1.Hello2();
            Console.ReadKey();
        }
    }
}
代码语言:javascript
复制


执行结果

由此,我们得到了#if与Conditional的第一个区别: 在这段代码中,#if CONDITIONA和 #endif 之间的代码仅在设置CONDITIONA后会编译,不配置是不会编译的。 Conditional影响的,是调用这个方法的代码。调用这个方法的代码,仅在 CONDITIONA下会编译,在其他配置下是不会编译的。

这也引出了#if与Conditional的第二个区别: 因为 #if CONDITIONA和 #endif 仅仅影响包含在其内的代码块,因此其仅仅影响写的这点代码所在的项目(或者说程序集)。于是使用 #if 只会影响实现代码。 而 [Conditional("CONDITIONA")] 影响的是调用它的代码,因此可以设计作为 API 使用——让目标项目(或者程序集)仅在目标项目特定的配置下才会编译。

上面是博主吕毅的官方解释,我这里举个例子吧。 我们新建一个ConsoleApp2,,添加引用ConsoleApp1.

写一个新类

代码语言:javascript
复制
using System;
using ConsoleApp1;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1.Hello1();//Class1是ConsoleApp1中的类
            Class1.Hello2();
            Console.ReadKey();
        }
    }
}
代码语言:javascript
复制


关键就在于设置这个条件编译变量上 当你为ConsoleApp1项目设置了CONDITIONA,Hello2()打印字符串。 当你为ConsoleApp2项目设置了CONDITIONA,执行Hello1(),打印字符串。

实验: 为ConsoleApp1项目设置CONDITIONA,不为ConsoleApp2项目设置CONDITIONA。 Hello,我是#if条件下才可以执行的函数语句2

不为ConsoleApp1项目设置CONDITIONA,为ConsoleApp2项目设置CONDITIONA。 Hello,我是Conditional条件下才可以执行的函数1

为ConsoleApp1项目设置CONDITIONA,为ConsoleApp2项目设置CONDITIONA。 Hello,我是Conditional条件下才可以执行的函数1 Hello,我是#if条件下才可以执行的函数语句2

以此为例,就可以深刻体会以下的结论了: 因为 #if CONDITIONA和 #endif 仅仅影响包含在其内的代码块,因此其仅仅影响写的这点代码所在的项目(或者说程序集)。于是使用 #if 只会影响实现代码。 而 [Conditional("CONDITIONA")] 影响的是调用它的代码,因此可以设计作为 API 使用——让目标项目(或者程序集)仅在目标项目特定的配置下才会编译。

用Conditional属性的方式,方法是否生效是取决于调用方,而用#if方式,方法是否生效是取决于方法定义所在的程序集。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 dotNET编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 条件编译符号和预处理符号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档