可为空的值类型(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
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔