详解)
在 C# 中**可空类型Nullable Types允许值类型Value Types**存储null值。在数据库开发、Web 开发以及企业级应用中非常常见。一、为什么需要可空类型普通值类型不能为null。例如int age null; // ❌ 编译错误因为intdoubleboolDateTime都属于值类型它们必须有一个值。但是现实开发中经常会出现用户年龄未知出生日期未知成绩未录入这些情况都需要一个没有值的状态。因此 C# 提供了 Nullable。二、Nullable 的写法有两种写法。第一种完整写法Nullableint age null;等价于Nullableint age 18;第二种推荐使用?int? age null;其实就是Nullableint的语法糖。例如double? price null; bool? result null; DateTime? birthday null;三、示例using System; class Program { static void Main() { int? age null; Console.WriteLine(age); } }输出什么也没有因为值就是 null。再赋值int? age 20; Console.WriteLine(age);输出20四、HasValue 属性判断是否有值。int? age null; Console.WriteLine(age.HasValue);输出False再看int? age 25; Console.WriteLine(age.HasValue);输出True五、Value 属性获取真正的值。int? age 25; Console.WriteLine(age.Value);输出25但是int? age null; Console.WriteLine(age.Value);运行结果System.InvalidOperationException Nullable object must have a value.所以不要在 HasValue 为 false 时访问 Value。正确写法if (age.HasValue) { Console.WriteLine(age.Value); }六、GetValueOrDefault()获取值。如果为空就返回默认值。int? age null; Console.WriteLine(age.GetValueOrDefault());输出0因为 int 默认值就是 0。也可以指定默认值Console.WriteLine(age.GetValueOrDefault(18));输出18七、空合并运算符 ??这是 Nullable 最常用的功能。int? age null; Console.WriteLine(age ?? 18);输出18意思如果左边不是 null返回左边如果左边是 null返回右边例如int? age 30; Console.WriteLine(age ?? 18);输出30八、空合并赋值 ??C# 8.0 新增。例如string name null; name ?? Tom; Console.WriteLine(name);输出Tom如果已经有值string name Jack; name ?? Tom; Console.WriteLine(name);输出Jack不会覆盖。九、空条件运算符 ?.用于防止空引用异常。例如Student stu null; Console.WriteLine(stu?.Name);不会报错。输出null如果不用Console.WriteLine(stu.Name);就会NullReferenceException十、可空类型之间运算int? a 10; int? b 20; Console.WriteLine(a b);输出30如果其中一个是 nullint? a null; int? b 20; Console.WriteLine(a b);输出结果也是 null。因为null 20 null十一、判断是否为空最简单if (age null) { Console.WriteLine(没有年龄); }或者if (age ! null) { Console.WriteLine(age); }也可以if (age.HasValue) { Console.WriteLine(age.Value); }十二、NullableT 常用成员成员作用HasValue是否有值Value获取值GetValueOrDefault()获取值没有则返回默认值GetValueOrDefault(x)没有值返回指定值十三、值类型与引用类型类型是否可为 nullint❌double❌bool❌DateTime❌int?✅double?✅bool?✅DateTime?✅string✅引用类型object✅引用类型补充C# 8.0虽然string本身可以为null但启用**可空引用类型Nullable Reference Types**后可以用string?明确表示允许为null而string表示不应为null编译器会提供相应的空值警告。这与int?可空值类型是不同的概念。十四、实际开发案例假设数据库中的年龄字段允许为空public class User { public string Name { get; set; } public int? Age { get; set; } }使用User user new User(); user.Name 张三; user.Age null; Console.WriteLine(user.Age ?? 18);输出18表示如果数据库没有年龄就默认显示 18。十五、最佳实践优先使用T?如int?、DateTime?代码更简洁。读取值前先判断HasValue或使用??提供默认值避免直接访问Value。数据库字段可为空时实体类对应属性应使用可空值类型。区分两类可空int?可空值类型Nullableint。string?可空引用类型C# 8.0 的编译器空值分析。十六、小结语法说明int? age声明可空整型Nullableintint?的完整写法HasValue判断是否有值Value获取值需确保不为nullGetValueOrDefault()获取值或类型默认值GetValueOrDefault(x)获取值或指定默认值??空合并运算符提供默认值??空合并赋值仅在为空时赋值?.空条件运算符避免空引用异常