能被赋值为null的,不一定是引用类型啊。

📅 2026/7/5 3:34:51
能被赋值为null的,不一定是引用类型啊。
注CLR本身并不支持值类型被赋值为null最多是将每个bit都设置为0。之所以现在能够被赋值为null是因为编译器帮我们做了转换使得C#语法支持了这种情况。这也是回复的网友说的语法糖Syntactic sugar下面的代码在控制台中打印的结果是100而不是101public void Test() { int? number 100; ChangeValue(number); Console.WriteLine(number); } void ChangeValue(int? number) { number 1; }另外大家看看下面这个代码行int? number new Nullableint();number变量的值居然是null。有的朋友会说NullableT是结构类型所以装箱和拆箱是符合值类型特点的我认为这句话是错误的。比如object o null; int? a (int?)o; int b (int)o;a是可以被拆箱为null值的而b这行代码运行时是要抛出NullReferenceException异常的。第二NullableT可以转换为接口类型本身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表达式里面增强可读性FuncString f () SomeMethod() ?? Untitled;上面这些东西希望对大家有用。