何时何地使用 GetType() 或 typeof()? [复制]

Posted

技术标签:

【中文标题】何时何地使用 GetType() 或 typeof()? [复制]【英文标题】:When and where to use GetType() or typeof()? [duplicate] 【发布时间】:2012-07-03 22:56:14 【问题描述】:

为什么会这样

if (mycontrol.GetType() == typeof(TextBox))
 

这不是吗?

Type tp = typeof(mycontrol);

但是这行得通

Type tp = mycontrol.GetType();

我自己使用is 运算符来检查类型,但是当我使用typeof()GetType() 时我的理解失败了

何时何地使用GetType()typeof()

【问题讨论】:

这个作品是什么意思……而这不是……? @anouar204:在您的 IDE 中试用它们。 不提供compile 比不提供work 更合适 【参考方案1】:

typeof 是一个运算符,用于获取在编译时 已知的类型(或至少是泛型类型参数)。 typeof 的操作数始终是类型或类型参数的名称 - 从不带有值的表达式(例如变量)。有关详细信息,请参阅C# language specification。

GetType() 是您在单个对象上调用的方法,用于获取对象的 执行时间 类型。

请注意,除非您想要您通常使用的 TextBox 的实例(而不是子类的实例):

if (myControl is TextBox)

    // Whatever

或者

TextBox tb = myControl as TextBox;
if (tb != null)

    // Use tb

【讨论】:

Your Line 'The operand of typeof is always the name of a type or type parameter - never an expression with a value (e.g. a variable)' 是我问题的完美答案。感谢您帮助我。【参考方案2】:

typeof 应用于编译时已知的类型或泛型类型参数的名称(作为标识符给出,而不是字符串)。 GetType 在运行时在对象上调用。在这两种情况下,结果都是 System.Type 类型的对象,其中包含有关类型的元信息。

编译时和运行时类型相等的示例

string s = "hello";

Type t1 = typeof(string);
Type t2 = s.GetType();

t1 == t2 ==> true

编译时和运行时类型不同

的示例
object obj = "hello";

Type t1 = typeof(object); // ==> object
Type t2 = obj.GetType();  // ==> string!

t1 == t2 ==> false

即变量obj的编译时类型(静态类型)与obj所引用的对象的运行时类型不同。


测试类型

但是,如果您只想知道 mycontrol 是否为 TextBox,那么您可以简单地测试

if (mycontrol is TextBox)

请注意,这并不完全等同于

if (mycontrol.GetType() == typeof(TextBox))    

因为mycontrol 可能有一个派生自TextBox 的类型。在这种情况下,第一个比较产生true 和第二个false!在大多数情况下,第一个也是更简单的变体是可以的,因为从 TextBox 派生的控件继承了 TextBox 的所有内容,可能会添加更多内容,因此分配与 TextBox 兼容。

public class MySpecializedTextBox : TextBox



MySpecializedTextBox specialized = new MySpecializedTextBox();
if (specialized is TextBox)       ==> true

if (specialized.GetType() == typeof(TextBox))        ==> false

选角

如果您有以下测试后跟一个强制转换并且 T 可以为空......

if (obj is T) 
    T x = (T)obj; // The casting tests, whether obj is T again!
    ...

...您可以将其更改为...

T x = obj as T;
if (x != null) 
    ...

测试值是否属于给定类型和强制转换(再次涉及相同的测试)对于长继承链都可能很耗时。使用as 运算符,然后对null 进行测试,性能更高。

从 C# 7.0 开始,您可以使用模式匹配来简化代码:

if (obj is T t) 
    // t is a variable of type T having a non-null value.
    ...

顺便说一句:这也适用于值类型。对于测试和拆箱非常方便。请注意,您不能测试可空值类型:

if (o is int? ni) ===> does NOT compile!

这是因为值要么是null,要么是int。这适用于int? o 以及object o = new Nullable<int>(x);

if (o is int i) ===> OK!

我喜欢它,因为它消除了访问 Nullable<T>.Value 属性的需要。

【讨论】:

【参考方案3】:

typeOf 是一个 C# 关键字,当您拥有类的名称时使用。它是在编译时计算的,因此不能在运行时创建的实例上使用。 GetType 是可以在实例上使用的对象类的方法。

【讨论】:

【参考方案4】:

您可能会发现使用is keyword 更容易:

if (mycontrol is TextBox)

【讨论】:

这个答案我到处都可以找到,我知道这一点。 @NikhilAgrawal:如果您已经知道一些对您的问题很明显的答案,那么您应该在问题中这样说,以避免浪费人们的时间。请阅读tinyurl.com/so-hints @JonSkeet:我用的是 is 关键字,但对 typeof() 和 GetType() 感到困惑

以上是关于何时何地使用 GetType() 或 typeof()? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

何时何地使用 LINQ to Objects?

我应该在何时何地将值存储在 BLoC 本身或其状态中

使用 GetType() 和 typeof() 获取 Type 有啥区别? [复制]

c#种GetType()和TypeOf()的区别

GetType、typeof 和 is,处理 null 和转换 [重复]

C# typeof 与GetType()的区别