可为空的值类型(nullable
第一,它是一个结构类型,值类型
其实下面的这个变量声明就是可为空的值类型
int? number = 100;
但是number是真的值类型吗,我们使用typeof(int?)看看他的类型吧,
system.nullable`1[system.int32]
nullable
public struct nullable
声明很清楚是struct,这样我们就明白了,原来int?是值类型啊。
为了验证,我们使用number.gettype()来看看类型是什么,答案是system.int32。
所以,能被赋值为null的,不一定是引用类型啊。
下面的代码在控制台中打印的结果是100,而不是101:
public void test()
{
int? number = 100;
changevalue(number);
console.writeline(number);
}
void changevalue(int? number)
{
number += 1;
}
另外,大家看看下面这个代码行:
int number = new nullable
number变量的值居然是null。
有的朋友会说nullable
比如:
object o = null;
int? a = (int?)o;
int b = (int)o;a是可以被拆箱为null值的,而b这行代码运行时是要抛出nullreferenceexception异常的。
第二,nullable
本身nullabe没有实现任何接口,但是请看下面的代码段:
int32? n = 5;
int32 result = ((icomparable) n).compareto(5); // compiles & runs ok
console.writeline(result); // 0
这是clr为开发人员提供的福利啊,呵呵。
如果没有这个福利的话,我们就写出下面的代码才能实现同样的过程:
int32 result = ((icomparable) (int32) n).compareto(5); 第三,??操作符
顺便提提这个??(null-coalescing operator)操作符,当操作符左边的表达式为空时,返回操作符右边的值;如果操作符左边表达式值不为空时,返回操作符左边表达式值。
??操作符给我们的编码带来了很多的便利,是我们的代码更为简练,可读性更强,看下面几个示例:
private static void nullcoalescingoperator() {
int32? b = null;
// the line below is equivalent to:
// x = (b.hasvalue) ? b.value : 123
int32 x = b ?? 123;
console.writeline(x); // "123"
// the line below is equivalent to:
// string temp = getfilename();
// filename = (temp != null) ? temp : "untitled";
string filename = getfilename() ?? "untitled";
}还可以连写:
string s = somemethod1() ?? somemethod2() ?? "untitled";
还可以用在lamda表达式里面,增强可读性:
func
我的博物馆故事 官方安卓版v1.61.2
我的博物馆故事是一款以消除为主题的经营养成类手游,在这里玩家
专业模拟飞行10 手机版v12.2.4
专业模拟飞行10安卓版是一款飞行休闲手游,顶尖的物理飞行引擎
动物起义战斗模拟器二琳同款 最新版v4.1.1
动物起义战斗模拟器是一个非常有趣的模拟类游戏,玩家可以召唤各
迷你世界七周年 安卓手机版v1.43.0
迷你世界7周年是一款由《迷你世界》官方推出的庆祝特别版本,在
劫后公司无限资源版 v1.0.5.1
劫后公司内置菜单版是游戏的破解版本,在该版本中为玩家提供了内