【发布时间】:2010-08-24 21:31:36
【问题描述】:
使用它来检查c 是否是TForm 的实例。
c.GetType().Name.CompareTo("TForm") == 0
除了使用string 作为CompareTo() 的参数之外,还有其他类型更安全的方法吗?
【问题讨论】:
-
我当然希望你也不要在 Java 中那样做。 Java 的
instanceof和 C# 的is是更好的方法。
使用它来检查c 是否是TForm 的实例。
c.GetType().Name.CompareTo("TForm") == 0
除了使用string 作为CompareTo() 的参数之外,还有其他类型更安全的方法吗?
【问题讨论】:
instanceof 和 C# 的 is 是更好的方法。
这里的不同答案有两种不同的含义。
如果你想检查一个实例是否是一个确切的类型那么
if (c.GetType() == typeof(TForm))
是要走的路。
如果您想知道c 是TForm 的实例还是子类,请使用is/as:
if (c is TForm)
或
TForm form = c as TForm;
if (form != null)
您应该清楚自己真正想要的这些行为中的哪一种。
【讨论】:
is 和 as 与模式匹配结合起来:if (x is TForm tf) {…
if ( object is string s) 的时间
if(c is TFrom)
{
// Do Stuff
}
或者如果您打算将c 用作TForm,请使用以下示例:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
第二个示例只需要检查一次c 是否属于TForm 类型。如果您检查c 是否属于TForm 类型然后强制转换,CLR 会进行额外检查。
这是reference。
编辑:从 Jon Skeet 那里偷来的
如果您想确保 c 属于 TForm 而不是任何继承自 TForm 的类,请使用
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
【讨论】:
是的,“是”关键字:
if (c is TForm)
{
...
}
详见 MSDN:http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
检查对象是否与给定类型兼容。例如,可以像这样确定一个对象是否与字符串类型兼容:
【讨论】:
还有,有点类似
Type.IsAssignableFrom(Type c)
"如果 c 和当前 Type 表示相同的类型,或者如果 current 类型在 c 的继承层次中,或者如果 current Type 是 c 实现的接口,或者如果 c 是泛型类型 参数和当前的Type代表c的约束之一。”
从这里:http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
【讨论】:
typeof(Class).IsAssignableFrom(object.getType()) 类似于 Java 的 instanceof 运算符。
T1.IsAssignableFrom(T2) 在as 运算符在给定这些类型的实例的情况下返回非空值的情况下返回true。
如果您想使用 c 作为 TForm,比其他答案更紧凑:
if(c is TForm form){
form.DoStuff();
}
【讨论】:
试试下面的
if (c is TForm) {
...
}
【讨论】:
正如其他人所提到的,“是”关键字。但是,如果您稍后将其转换为该类型,例如。
TForm t = (TForm)c;
那么你应该使用“as”关键字。
例如TForm t = c as TForm.
那你就可以查了
if(t != null)
{
// put TForm specific stuff here
}
不要与 is 组合,因为它是重复检查。
【讨论】:
或者
c.getType() == typeOf(TForm)
【讨论】:
bool isValid = c.GetType() == typeof(TForm) ? true : false;
或更简单
bool isValid = c.GetType() == typeof(TForm);
【讨论】:
==)。在支持继承的对象或面向语言中,除非您知道您的特定类型永远不会从例如sealed 类继承。另外:使用返回(静态/常量)布尔值的三元运算符让我感到困扰,如果它是 switch 语句,我就不会那么烦恼了。