可为空的值类型(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
罚罪1+2全80集阿里云盘全集资源链接-罚罪1+2全集高清1080P/4K阿里云盘资源下载无删减
邵氏精品禁品未删减资源在线看-必看的50部邵氏电影无删减观看入口
羞羞漫画高清最新资源-正规平台免费入口与无删减资源导航
日漫入口-官方认证安全入口与无删减日漫资源直达导航
一拳超人漫画入口-2026最新免费高清全集在线看
杨紫《生命树》1080p全40集迅雷磁力链接分享-杨紫《生命树》40集高清完整版迅雷云盘下载1080P(4k)资源