c# #if 与 Conditional属性宏的区别

测试代码

using System;
using System.Diagnostics;

namespace ConsoleApp1
{
    public class TestClass
    {
        [Conditional("Debug1")]
        public static void Func1()
        {
            Console.WriteLine("Conditional 宏");
        }

        public static void Func2()
        {
#if Debug2
            Console.WriteLine("#if 宏");
#endif
        }
    }

    class Hello
    {
        static void Main(string[] args)
        {
            TestClass.Func1();
            TestClass.Func2();
            Console.ReadKey();
        }
    }
}

生成DLL,使用ILSpy打开,可以看到:

c# #if 与 Conditional属性宏的区别_第1张图片

使用#if 包住的代码直接被预处理去掉了,而使用Conditional的代码带着属性被保留了下来

这里因为两个宏都没添加到编译宏里,所以,可以看到本程序集调用Func1的代码被预编译去掉了。c# #if 与 Conditional属性宏的区别_第2张图片

新增一个工程,切依赖前面的工程

using ConsoleApp1;
using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            TestClass.Func1();
            TestClass.Func2();
        }
    }
}

同样使用ILSpy查看:

c# #if 与 Conditional属性宏的区别_第3张图片

可以看到ConsoleApp2调用Func1的代码被预编译去掉了

结论:

1. 使用#if 包的代码,如果本程序集没定义该宏,则在预编译阶段直接去掉

2.使用Conditional属性的函数,在调用的程序集如果没定义,则会去掉该函数的调用,但是代码是存在的

你可能感兴趣的:(语言,c#,开发语言)