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

时间:2012-07-03 13:34:30

标签: c# .net types typeof gettype

为什么会这样?

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

这不是吗?

Type tp = typeof(mycontrol);

但这有效

Type tp = mycontrol.GetType();

我自己使用is运算符来检查类型,但是当我使用typeof()GetType()

时,我的理解失败了

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

4 个答案:

答案 0 :(得分:90)

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

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

请注意,除非要完全使用TextBox的实例(而不是子类的实例),否则通常会使用:

if (myControl is TextBox)
{
    // Whatever
}

或者

TextBox tb = myControl as TextBox;
if (tb != null)
{
    // Use tb
}

答案 1 :(得分:39)

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.
    ...
}

答案 2 :(得分:8)

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

答案 3 :(得分:5)

您可能会发现使用is keyword

更容易
if (mycontrol is TextBox)