为什么会这样?
if (mycontrol.GetType() == typeof(TextBox))
{}
这不是吗?
Type tp = typeof(mycontrol);
但这有效
Type tp = mycontrol.GetType();
我自己使用is
运算符来检查类型,但是当我使用typeof()
和GetType()
何时何地使用GetType()
或typeof()
?
答案 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)
答案 3 :(得分:5)
您可能会发现使用is
keyword:
if (mycontrol is TextBox)