#if !NETCF什么意思?看log4net的代码,发现其中有很多类似如下的代码:#if DEBUG#if !SSCLI#if NET_2_0#if N
#if !NETCF什么意思?
看log4net的代码,发现其中有很多类似如下的代码:
#if DEBUG
#if !SSCLI
#if NET_2_0
#if NET_4_0
#if NETCF_1_0
#if !MONO
#if !NETCF && !SSCLI && !CLIENT_PROFILE
#if !CLI_1_0
#if CONFIRM_WIN32_FILE_SHAREMODES
#if CLIENT_PROFILE
#if RESIZABLE_CYCLIC_BUFFER
#if HAS_READERWRITERLOCK
#if HAS_READERWRITERLOCKSLIM
对条件编译不太懂,有没有解释下都是什么意思?或者给个文档解释的链接地址,我自己去看。
谢谢。
[解决办法]项目属性啊。我说了多次了。
[解决办法]C# 好像没有任何预定义任何Conditional compilation symbol
[解决办法]楼主钻牛角尖了,那个是条件编译,也就是说,写代码的时候把所有条件对应的代码都写上去,但是实际项目编译的时候只有满足条件的部分而不是全部代码才会参与编译,如果你找不到对应的名称定义,那就代表了那部分#if作用范围内部的代码都不会参与编译,实际也你可以看到Visual Studio里面那部分代码是灰色的,不起作用。那么何时起作用?只要你自己在项目属性里面把#if 后面的条件编译符号填写进去,那部分代码就生效了,但是最好别自己乱改,你不清楚它的逻辑的情况下,随便修改条件编译符号可能会让代码冲突。
例如:
#if CSHARP30
public IEnumerable<TReturn> Read<TFirst, TSecond, TThird, TFourth, TReturn>(Func<TFirst, TSecond, TThird, TFourth, TReturn> func, string splitOn)
#else
public IEnumerable<TReturn> Read<TFirst, TSecond, TThird, TFourth, TReturn>(Func<TFirst, TSecond, TThird, TFourth, TReturn> func, string splitOn = "id")
#endif
{
return MultiReadInternal<TFirst, TSecond, TThird, TFourth, DontMap, TReturn>(func, splitOn);
}
这是我自己写的代码,意思是如果定义了条件编译符号CSHARP30,那么函数定义就是上面那个形式,否则是下面那个形式,两者区别在于.NET3.5以下版本是不支持参数默认值的,4.0以上版本才支持。那么这个条件编译符号CSHARP30仅仅区分当前项目使用的.NET版本,我修改为3.5的项目就自己添加条件编译符号CSHARP30,否则就删除它,确保不修改代码让代码可以编译出2个不同的运行时版本。