86

为什么这有效

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

这不?

Type tp = typeof(mycontrol);

但这有效

Type tp = mycontrol.GetType();

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

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

4

4 回答 4

131

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

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

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

if (myControl is TextBox)
{
    // Whatever
}

或者

TextBox tb = myControl as TextBox;
if (tb != null)
{
    // Use tb
}
于 2012-07-03T13:36:38.660 回答
64

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是 aTextBox那么您可以简单地测试

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!

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

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

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

于 2012-07-03T13:42:48.257 回答
8

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

于 2012-07-03T13:38:33.740 回答
5

is您可能会发现使用关键字更容易:

if (mycontrol is TextBox)
于 2012-07-03T13:38:22.170 回答