0Pricing
C# Academy · 课时

可空值类型

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 可空值类型
  2. 空值条件运算符
  3. 空值合并运算符
  4. 防范空值
← 返回 C# Academy