面试题答案
一键面试可空类型变量的声明语法
在C#中,可空类型变量可以通过在类型后面加上 ?
来声明,例如:
int? nullableInt; // 可空的整数类型
DateTime? nullableDateTime; // 可空的日期时间类型
也可以使用 Nullable<T>
泛型结构来声明,例如:
Nullable<int> nullableInt2;
空值检查和处理
- 使用
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.");
}
- 使用
if
语句直接比较是否为null
:
int? nullableInt = null;
if (nullableInt == null)
{
Console.WriteLine("The variable is null.");
}
else
{
Console.WriteLine($"The value is {nullableInt.Value}");
}
- 使用
??
运算符(空合并运算符):
int? nullableInt = null;
int result = nullableInt?? 10; // 如果nullableInt为null,则使用10
Console.WriteLine($"The result is {result}");
- C# 8.0 及更高版本中的
switch
表达式:
int? nullableInt = null;
var result = nullableInt switch
{
null => 10,
_ => nullableInt.Value * 2
};
Console.WriteLine($"The result is {result}");
实际业务场景及优势
- 数据库相关场景:
- 场景:从数据库中读取可能为
NULL
的字段。例如,员工表中的Salary
字段,可能某些员工还未设定薪资,该字段在数据库中为NULL
。 - 优势:可空类型变量能够准确地映射数据库中的
NULL
值,避免在读取数据时因为空值引发异常。同时,方便在代码中根据是否有值进行不同的业务逻辑处理,如计算平均薪资时,可空类型能清晰地区分有薪资和无薪资的员工记录。
- 场景:从数据库中读取可能为
// 假设从数据库读取员工薪资
int? salary = GetEmployeeSalaryFromDatabase(employeeId);
if (salary.HasValue)
{
// 进行与薪资相关的计算
totalSalary += salary.Value;
employeeCount++;
}
- 用户输入场景:
- 场景:在用户注册表单中,某些字段可能是可选的,比如用户的中间名(Middle Name)。用户可能不填写该字段。
- 优势:使用可空类型可以方便地处理用户未输入的情况,避免因为必填字段验证规则的变化而频繁修改代码。在保存用户信息到数据库时,可空类型可以直接对应数据库中允许
NULL
的字段。
string? middleName = userRegistrationForm.MiddleName;
if (string.IsNullOrEmpty(middleName))
{
// 处理无中间名的情况
fullName = $"{userRegistrationForm.FirstName} {userRegistrationForm.LastName}";
}
else
{
fullName = $"{userRegistrationForm.FirstName} {middleName} {userRegistrationForm.LastName}";
}
- 计算结果可能为空的场景:
- 场景:在一个数学计算方法中,某些输入可能导致结果无法计算,例如计算一个数除以另一个数,当除数为零时,结果无法得出。
- 优势:可空类型可以清晰地表示计算结果的不确定性,调用方可以根据返回的可空类型进行适当的处理,而不是返回一个特殊值(如
-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.");
}