为何‘null整数’转换为字符串后不抛出NullReferenceException?
为什么null整数转字符串不会抛出NullReferenceException?
先来看你给出的这段会抛出异常的代码:
using System; public class Test { static string r = null; public static void Main() { string s = ""; try { s = r.ToString(); Console.Write("Successful"); } catch(Exception ex) { Console.WriteLine("exception via using null int...." + ex); } Console.WriteLine(s); } }
这段代码里string r = null抛出NullReferenceException完全符合预期——因为string是引用类型,当变量是null时,意味着它没有指向任何实际的对象实例,调用实例方法ToString()自然会触发空引用异常。
那为什么“null整数”转字符串不会出问题?这里要先澄清一个点:C#里的基础值类型(比如int)本身是不能为null的,你说的“null整数”其实是可空值类型int?(等价于Nullable<int>),它是专门用来包装值类型、让其能表示null状态的结构体。
Nullable<T>这个结构体做了特殊处理:它重写了ToString()方法。当它处于null状态(也就是HasValue属性为false)时,调用ToString()会直接返回空字符串"",而不会尝试去调用底层值类型的方法,自然也就不会抛出空引用异常。
举个简单的例子验证一下:
int? nullInt = null; string result = nullInt.ToString(); // 结果是"",没有任何异常
另外还有一种常见场景:如果是用Convert.ToString(null)来做转换,这个静态方法本身就内置了null处理逻辑,不管传入的是引用类型的null还是可空值类型的null,都会安全返回空字符串,同样不会触发异常。
核心差异可以总结成两点:
- 引用类型的null:没有实际对象,调用实例方法必然触发
NullReferenceException - 可空值类型的null:是一个合法的
Nullable<T>结构体实例,只是内部没有值,其重写的方法会安全处理null状态
内容的提问来源于stack exchange,提问作者Harsh
相关产品推荐
相关产品推荐

