空条件运算符(null-conditional operator)`?.` 用于在访问对象成员(属性、方法、索引器等)之前检查对象是否为 `null`。如果对象为 `null`,则整个表达式的结果为 `null` 或 `default`,并且不会引发 `NullReferenceException`。
以下是一个完整的控制台应用程序示例,演示如何使用空条件运算符 `?.`:
```csharp
using System;
namespace NullConditionalOperatorDemo
{
class Program
{
static void Main(string[] args)
{
Person person = null;
Console.WriteLine("Using null-conditional operator:");
// 使用空条件运算符访问属性
string name = person?.Name;
Console.WriteLine($"Name: {name ?? "null"}"); // 如果 person 为 null,则 name 为 null
// 使用空条件运算符调用方法
person?.DisplayGreeting();
// 赋值一个对象后再次使用空条件运算符
person = new Person { Name = "Alice" };
name = person?.Name;
Console.WriteLine($"Name: {name}");
person?.DisplayGreeting();
}
}
class Person
{
public string Name { get; set; }
public void DisplayGreeting()
{
Console.WriteLine($"Hello, my name is {Name}.");
}
}
}
```
### 解释
1. **`Person` 类**:
- 包含一个 `Name` 属性和一个 `DisplayGreeting` 方法,用于打印问候信息。
2. **`Main` 方法**:
- 定义一个 `Person` 类型的变量 `person` 并将其初始化为 `null`。
- 使用空条件运算符访问 `person` 的 `Name` 属性。如果 `person` 为 `null`,则 `name` 也为 `null`。使用 `??` 运算符确保输出时不会显示 `null`,而是显示字符串 `"null"`。
- 使用空条件运算符调用 `person` 的 `DisplayGreeting` 方法。如果 `person` 为 `null`,则不会调用该方法。
- 将 `person` 赋值为一个新的 `Person` 对象,并再次使用空条件运算符访问 `Name` 属性和调用 `DisplayGreeting` 方法。
### 示例运行结果
```
Using null-conditional operator:
Name: null
Name: Alice
Hello, my name is Alice.
```
### 关键点总结
- 当 `person` 为 `null` 时,使用 `person?.Name` 不会引发 `NullReferenceException`,而是返回 `null`。
- 使用 `person?.DisplayGreeting()` 调用方法时,如果 `person` 为 `null`,方法不会被调用。
- 空条件运算符 `?.` 提供了一种简洁且安全的方式来处理可能为 `null` 的对象成员访问。