http://www.chenjiliang.com/Article/View.aspx?ArticleID=13755
1. 可空类型
值类型的变量可以接受指定类型的数据,但是如果要把该变量的值定义为 undefined,就需要使用可空类型给应用程序提供一个独特的值。比如:
int? i = null;
bool? b = null;
这样的写法是正确的,不能将 null 赋值给一个简单的值类型的变量,比如:
int? ni = null;
int i = ni; /// 这里将产生编译错误。
这里可以使用空接合运算符解决:
int i = ni ?? 0;
另外,如果在程序中使用可空类型,就必须考虑 null 值在与各种运算符一起使用时的影响。通常有如下规则:
1> 可空类型与一元或二元运算符一起使用时,如果其中一个操作数或两个操作数都是 null,其结果就是 null;
2> 在进行可空类型的比较运算时,只要有一个操作数是 null,比较的结果就是 false。
或者使用可空泛型也可以实现值类型变量接受 null 数值。比如:
Nullable<int> i = null;
2. 空接合运算符(??)
空接合运算符的用法类似于 _?_:_ 三元运算符,用于比较两个操作数,当操作数1的值不为null时,表达式返回第一个操作数,否则表达式返回第二个操作数。
要求:
1> 第一个操作数必须是可空类型或引用类型(值类型无法处理 null 值);
2> 第二个操作数必须与第一个操作数的类型相同或能隐式转换为第一个操作数的类型。
例如:
int? a = null;
int b;
b = a ?? 10;
这里,首先变量 a 为可空类型,因此可以接受 null 值,第三天语句判断变量 a 是否为空,因而这里 b 的值为 10。
总结:
1:遍历集合时,最好使用c => c ?? Enumerable.Empty<int>()条件,避免元素为空导致出错;
2:在对表字段进行汇总求和时,字段要求为非空;
3:查询表记录时,判断一个字段是否等于NULL,用法和SQL差不多,含义一样;
4:计算集合第一个元素时,尽量使用FirstOrDefault,避免结果集为空导致程序出错.
上面是关于NULL在LINQ中和其它语言不太一样的地方,大家如果还有其它的观点可以指教下.