可空类型标记符(?
)
说明:
- 可空类型标记符
?
用于指示某个值类型(如int
、float
等)可以为null
。这是C# 2.0引入的一个特性,用于处理数据库查询、JSON解析等场景中可能出现的空值。
示例代码:
int? nullableInt = 5;
int? nullableIntWithNull = null;
if (nullableInt.HasValue)
{
Console.WriteLine(nullableInt.Value); // 输出: 5
}
if (!nullableIntWithNull.HasValue)
{
Console.WriteLine("The value is null."); // 输出: The value is null.
}
空值传播操作符(?.
)
说明:
- 空值传播操作符
?.
用于在访问可能为null
的对象的成员之前进行空检查。如果对象为null
,则不会尝试访问其成员,而是直接返回null
。
示例代码:
string str = null;
int? length = str?.Length; // length 为 null,因为 str 为 null
Person person = null;
string jobTitle = person?.JobTitle; // jobTitle 为 null,因为 person 为 null
person = new Person { JobTitle = "Software Engineer" };
jobTitle = person?.JobTitle; // jobTitle 为 "Software Engineer"
条件(三元)运算符(?:
)
说明:
- 条件运算符
?:
是C#中的三元运算符,用于根据条件选择两个值之一。其语法为condition ? expression1 : expression2
。
示例代码:
int x = 10;
int y = 5;
int max = x > y ? x : y; // max 为 10
Console.WriteLine("最大值: " + max);
空值合并操作符(??
)
说明:
- 空值合并操作符
??
用于在第一个操作数为null
时返回第二个操作数的值,否则返回第一个操作数的值。这常用于提供默认值以避免null
引发的异常。
示例代码:
string name = null;
string displayName = name ?? "匿名用户"; // displayName 为 "匿名用户"
string username = "DeveloperDave";
displayName = username ?? "Newbie"; // displayName 为 "DeveloperDave",因为 username 不为 null
Console.WriteLine(displayName);
空值合并赋值运算符(??=
)
说明:
- 空值合并赋值运算符
??=
是C# 8.0及更高版本中引入的一个特性,它结合了空值合并运算符(??
)和赋值运算符(=
)的功能。这个运算符用于将右侧的值赋给左侧的变量,但仅当左侧的变量为null
时。如果左侧的变量不为null
,则不会更改其值。这提供了一种更简洁的方式来为可能为null
的变量提供默认值或更新它们的值,而无需编写额外的if
语句。
示例代码:
string firstName = null;
firstName ??= "未知"; // 如果 firstName 是 null,则将其设置为 "未知"
Console.WriteLine(firstName); // 输出: 未知
firstName = "John";
firstName ??= "未知"; // firstName 不是 null,所以不会更改其值
Console.WriteLine(firstName); // 输出: John
// 示例使用可空类型
int? age = null;
age ??= 30; // 如果 age 是 null,则将其设置为 30
Console.WriteLine(age.HasValue ? age.Value.ToString() : "null"); // 输出: 30
age = 25;
age ??= 30; // age 不是 null,所以不会更改其值
Console.WriteLine(age.HasValue ? age.Value.ToString() : "null"); // 输出: 25
// 示例使用类对象的属性
Person person = null;
person ??= new Person { Name = "默认名称" }; // 如果 person 是 null,则创建新实例并赋值
if (person != null)
{
Console.WriteLine(person.Name); // 如果 person 是新创建的实例,则输出: 默认名称
}
person = new Person { Name = "John Doe" };
person.Name ??= "默认名称"; // person.Name 不是 null,所以不会更改其值
Console.WriteLine(person.Name); // 输出: John Doe
在上面的示例中,??=
运算符首先检查左侧的变量(或属性)是否为null
。如果是,则将其设置为右侧的值;如果不是,则保持其当前值不变。这种操作对于初始化可能为null
的变量或在某些条件下更新它们非常有用。
请注意,最后一个示例中尝试使用??=
来更新Person
对象的Name
属性可能不会按预期工作,因为??=
是专门为变量赋值设计的,而不是用于属性的。在属性上使用??=
会导致编译错误,除非该属性是特殊的(如可空值类型的自动实现属性)。