Avatar ·

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