可空值类型
int? 和 Nullable 结构体。
可空值类型 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
为什么需要可空值类型?
像 int、bool 和 DateTime 这样的值类型始终保存一个值。int 的默认值为 0,绝不会表示“没有值”。
有时您需要表示缺失的数据,例如未回答的调查字段或空的数据库列。可空值类型让值类型也能够保存 null。
使用 int? 声明
在值类型后添加 ?,即可将其设为可空。int? 可以保存任意整数或 null。
在日常 C# 代码中,这是编写可空值类型最常见的方式。
int? age = null;
int count = 5;
age = count;
System.Console.WriteLine(age);Nullable<T> 背后的机制
? 语法是一种简写。int? 与 Nullable<int> 完全是同一种类型。
Nullable<T> 是一个包装值类型的结构体,并额外添加了一个用于跟踪值是否存在的标志。
Nullable<int> a = 10;
int? b = 10;
System.Console.WriteLine(a == b);HasValue 与值
每个可空值类型都会公开两个属性。当值存在时,HasValue 为 true,而 Value 会返回底层值。
当 HasValue 为 false 时读取 Value 会抛出 InvalidOperationException,因此请先进行检查。
int? score = 42;
if (score.HasValue)
{
System.Console.WriteLine(score.Value);
}一个完整示例
下面是一个完整的程序。它会赋值、检查 HasValue,并打印结果。
请运行它,观察可空值类型实际包含数据时的行为。
using System;
class Program
{
static void Main()
{
int? temperature = 21;
if (temperature.HasValue)
Console.WriteLine("Temp: " + temperature.Value);
else
Console.WriteLine("No reading");
}
}当它为 Null 时
赋值为 null 会使 HasValue 返回 false,随后执行 else 分支。
这种模式可以安全地处理可选读数,避免程序崩溃。
using System;
class Program
{
static void Main()
{
int? temperature = null;
if (temperature.HasValue)
Console.WriteLine(temperature.Value);
else
Console.WriteLine("No reading");
}
}GetValueOrDefault
GetValueOrDefault() 在存在值时返回该值,否则返回该类型的默认值(例如 int 的默认值为 0)。
您也可以传入自己的回退值:当值为 null 时,GetValueOrDefault(100) 会返回 100。
int? quantity = null;
int result = quantity.GetValueOrDefault(100);
System.Console.WriteLine(result);隐式转换为可空类型
普通的 int 会自动转换为 int?,因为每个普通值也都是有效的可空值。
反向转换不会自动进行:从 int? 转回 int 需要显式转换或回退值,因为可空值可能为 null。
int plain = 7;
int? wrapped = plain;
int back = (int)wrapped;
System.Console.WriteLine(back);其他值类型的可空形式
任何值类型都可以使用可空形式:bool?、double?、DateTime?,甚至自定义结构体也可以。
bool? 有三种状态:true、false 和 null,这对于表示尚未回答的是或否问题非常有用。
bool? agreed = null;
double? price = 9.99;
System.Console.WriteLine(agreed.HasValue);
System.Console.WriteLine(price.Value);引用类型本身就是可空的
string 等类和数组本身就可以为 null,因此不需要使用 Nullable<T> 包装器。
引用类型上的 ?(例如 string?)含义不同:它是可空引用注释,而不是 Nullable<T> 结构体。
比较可空值
比较操作可以正常使用,但请记住 null 的行为比较特殊。两个 null 相等,而任何涉及 null 的有序比较都会返回 false。
因此,null < 5 的结果是 false,null > 5 的结果也同样是 false。
int? x = null;
System.Console.WriteLine(x < 5);
System.Console.WriteLine(x == null);快速检查
请测试您对可空值类型的理解。
总结
可空值类型让值类型也能够保存 null。请将它们写成 int?,它等同于 Nullable<int>。
请使用 HasValue 进行测试,仅在值存在时使用 Value 读取值,并使用 GetValueOrDefault() 提供安全的回退值。引用类型本身就是可空的。
常见问题解答
「可空值类型」课时是免费的吗?
是的 — 「可空值类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「可空值类型」这节课中我会学到什么?
int? 和 Nullable 结构体。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「可空值类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。