在sharpdevelop中看到如下一段代码
1 public void StartCoreServices()
2 {
3 if (configDirectory == null)
4 configDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
5 applicationName);
6 PropertyService.InitializeService(configDirectory,
7 dataDirectory ?? Path.Combine(FileUtility.ApplicationRootPath, "data"),
8 propertiesName);
9 PropertyService.Load();
10 ResourceService.InitializeService(FileUtility.Combine(PropertyService.DataDirectory, "resources"));
11 StringParser.Properties["AppName"] = applicationName;
12 }
注意这个下边红色的运算符2 {
3 if (configDirectory == null)
4 configDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
5 applicationName);
6 PropertyService.InitializeService(configDirectory,
7 dataDirectory ?? Path.Combine(FileUtility.ApplicationRootPath, "data"),
8 propertiesName);
9 PropertyService.Load();
10 ResourceService.InitializeService(FileUtility.Combine(PropertyService.DataDirectory, "resources"));
11 StringParser.Properties["AppName"] = applicationName;
12 }
PropertyService.InitializeService(configDirectory,
dataDirectory ?? Path.Combine(FileUtility.ApplicationRootPath, "data"),
propertiesName);
看到后很诧异,从来没有见过,google了一下,也没有任何结果。
测试后发现??的作用类似于三目运算符,相当于(结果1==null)?结果2:结果1
可以看到,结果1这个变量因为要与null比较,故结果1必须为引用类型或者可空值类型
过路的朋友是否有其他见解,请指点
----------------------------------------------------------------------------------------
补充一下:
msdn上说明如下:
如果 ?? 运算符的左操作数非空,该运算符将返回左操作数,否则返回右操作数。
备注
可空类型可以包含值,或者可以是未定义的。?? 运算符定义当可空类型分配给非可空类型时返回的默认值。如果在将可空类型分配给非可空类型时不使用 ?? 运算符,将生成编译时错误。如果使用强制转换,并且当前未定义可空类型,将发生 InvalidOperationException 异常。
http://msdn2.microsoft.com/zh-cn/library/ms173224(VS.80).aspx
另《C#高级编程》中称之为空结合操作符,并且当右操作数不能隐式转换为做操作数时会引发异常。
博问中Klesh Wong 还指出:
??是短路式的
比如
a ?? b ?? c ?? d ?? e ......
左边第一个非null值会被返回,然后表达式会停止往下运算
-------------------------------------------------------------------------------------
补充以上