MST
星途 面试题库

面试题:C#中如何正确声明和使用可空类型变量及其实际应用场景

说明在C#中可空类型变量的声明语法,以及如何在代码中进行有效的空值检查和处理。同时,请举例说明在哪些实际的业务场景中,可空类型变量会被频繁使用以及这样做的优势。
23.7万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

可空类型变量的声明语法

在C#中,可空类型变量可以通过在类型后面加上 ? 来声明,例如:

int? nullableInt; // 可空的整数类型
DateTime? nullableDateTime; // 可空的日期时间类型

也可以使用 Nullable<T> 泛型结构来声明,例如:

Nullable<int> nullableInt2;

空值检查和处理

  1. 使用 if 语句检查 HasValue 属性
int? nullableInt = 5;
if (nullableInt.HasValue)
{
    int value = nullableInt.Value;
    Console.WriteLine($"The value is {value}");
}
else
{
    Console.WriteLine("The variable is null.");
}
  1. 使用 if 语句直接比较是否为 null
int? nullableInt = null;
if (nullableInt == null)
{
    Console.WriteLine("The variable is null.");
}
else
{
    Console.WriteLine($"The value is {nullableInt.Value}");
}
  1. 使用 ?? 运算符(空合并运算符)
int? nullableInt = null;
int result = nullableInt?? 10; // 如果nullableInt为null,则使用10
Console.WriteLine($"The result is {result}");
  1. C# 8.0 及更高版本中的 switch 表达式
int? nullableInt = null;
var result = nullableInt switch
{
    null => 10,
    _ => nullableInt.Value * 2
};
Console.WriteLine($"The result is {result}");

实际业务场景及优势

  1. 数据库相关场景
    • 场景:从数据库中读取可能为 NULL 的字段。例如,员工表中的 Salary 字段,可能某些员工还未设定薪资,该字段在数据库中为 NULL
    • 优势:可空类型变量能够准确地映射数据库中的 NULL 值,避免在读取数据时因为空值引发异常。同时,方便在代码中根据是否有值进行不同的业务逻辑处理,如计算平均薪资时,可空类型能清晰地区分有薪资和无薪资的员工记录。
// 假设从数据库读取员工薪资
int? salary = GetEmployeeSalaryFromDatabase(employeeId);
if (salary.HasValue)
{
    // 进行与薪资相关的计算
    totalSalary += salary.Value;
    employeeCount++;
}
  1. 用户输入场景
    • 场景:在用户注册表单中,某些字段可能是可选的,比如用户的中间名(Middle Name)。用户可能不填写该字段。
    • 优势:使用可空类型可以方便地处理用户未输入的情况,避免因为必填字段验证规则的变化而频繁修改代码。在保存用户信息到数据库时,可空类型可以直接对应数据库中允许 NULL 的字段。
string? middleName = userRegistrationForm.MiddleName;
if (string.IsNullOrEmpty(middleName))
{
    // 处理无中间名的情况
    fullName = $"{userRegistrationForm.FirstName} {userRegistrationForm.LastName}";
}
else
{
    fullName = $"{userRegistrationForm.FirstName} {middleName} {userRegistrationForm.LastName}";
}
  1. 计算结果可能为空的场景
    • 场景:在一个数学计算方法中,某些输入可能导致结果无法计算,例如计算一个数除以另一个数,当除数为零时,结果无法得出。
    • 优势:可空类型可以清晰地表示计算结果的不确定性,调用方可以根据返回的可空类型进行适当的处理,而不是返回一个特殊值(如 -1 表示错误),这样使代码逻辑更清晰,语义更明确。
double? Divide(double numerator, double denominator)
{
    if (denominator == 0)
    {
        return null;
    }
    return numerator / denominator;
}
double? result = Divide(10, 0);
if (result.HasValue)
{
    Console.WriteLine($"The result is {result.Value}");
}
else
{
    Console.WriteLine("Division by zero, result is not available.");
}