C#中的类型检查:typeof、GetType()或is——何时使用什么?
大家好。我是一名初学C#的开发者,经常在类型检查上感到困惑。有三种方式:`typeof`、`GetType()`方法和`is`运算符。
例如,我有这样一段代码:
```csharp
object obj = "Hello";
// 方式1
if (obj.GetType() == typeof(string))
Console.WriteLine("这是通过GetType得到的字符串");
// 方式2
if (obj is string)
Console.WriteLine("这是通过is得到的字符串");
// 方式3
Type t = typeof(string);
```
看起来这三种方式都在检查类型,但我注意到一些奇怪的行为。当我使用`is`处理nullable类型时,它的行为与`GetType()`不同。例如:
```csharp
int? x = 5;
if (x is int) // true
Console.WriteLine("x is int");
if (x.GetType() == typeof(int)) // 也是true
Console.WriteLine("x.GetType == typeof(int)");
```
但如果x = null,那么`x is int?`返回false,而`GetType()`则会抛出NullReferenceException。
还有一点:我读到过`typeof`只适用于编译时的类型,而`GetType