我已经看到我在维护的一些代码中完成了两个,但不知道区别.有吗?
让我补充一点,myCustomer是Customer的一个实例
为什么会这样
if (mycontrol.GetType() == typeof(TextBox))
{}
Run Code Online (Sandbox Code Playgroud)
这不是吗?
Type tp = typeof(mycontrol);
Run Code Online (Sandbox Code Playgroud)
但这很有效
Type tp = mycontrol.GetType();
Run Code Online (Sandbox Code Playgroud)
我自己使用is
运算符来检查类型,但是当我使用typeof()
和时,我的理解失败了GetType()
何时何地使用GetType()
或typeof()
?
这可能是一个简单的答案,我只是遗漏了一些东西,但是这里...如果我有一个Type,(即一个实际的System.Type ......不是一个实例)我该如何判断它继承自另一个特定的基类型?
我想检查一个对象的类型.如果类型完全相同,我只想返回true.继承的类应该返回false.
例如:
class A {}
class B : A {}
B b = new B();
// The next line will return true,
// but I am looking for an expression that returns false here
if(b is A)
Run Code Online (Sandbox Code Playgroud) 是否有人意识到typeof(T) where T : struct
例如与t.GetType() where t is a System.Object
?之间的任何差异?
ILdasm显示typeof(T)使用System.Type::GetTypeFromHandle(RuntimeTypeHandle handle)
,而另一个只是简单System.Object::GetType()
.实现是[MethodImpl(MethodImplOptions.InternalCall)]
,因此方法在CLR中的本机代码中定义.所以,我只是想知道是否有人知道任何理由更喜欢一个而不是另一个?
编辑:让我澄清一点,我最感兴趣的是你选择哪个似乎没关系的情况 - 也就是说,是否存在性能差异或其他原因?谢谢!
假设我们有通用方法:
public void GenericMethod<T>(T item)
{
var typeOf = typeof(T);
var getType = item.GetType();
}
Run Code Online (Sandbox Code Playgroud)
我们使用以下参数调用它:
GenericMethod(1)
GenericMethod((object) 1)
Run Code Online (Sandbox Code Playgroud)
结果是:
typeOf = System.Int32
getType = System.Int32
Run Code Online (Sandbox Code Playgroud)
和
typeOf = System.Object
getType = System.Int32
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么输入到对象的typeof整数返回System.Object,但.GetType()返回System.Int32?
可能重复:
类型检查:typeof,GetType还是?
获得该类型的首选方法是哪一种?
我想知道哪个语句在Performance Point of View中是否有用
Object.GetType() == typeof(Type)
Run Code Online (Sandbox Code Playgroud)
要么
Object is Type
Run Code Online (Sandbox Code Playgroud) is运算符仅考虑引用转换,装箱转换和拆箱转换.其他转换(例如用户定义的转化)不予考虑.
这在实践中意味着什么?用它来检查结构是否是某种类型是错误的吗?例如,
public struct Point2D
{
public int X;
public int Y;
...
public override bool Equals(Object value)
{
if (value != null && value is Point2D) // or if (value != null && GetType() == value.GetType())
{
Point2D right = (Point2D)value;
return (X == right.X && Y == right.Y);
}
else return false;
}
...
}
Run Code Online (Sandbox Code Playgroud) 根据typeof的文档:
[...] 要获取表达式的运行时类型,可以使用 .NET Framework 方法
GetType
因此,这意味着typeof
必须是一个编译时表达式。
在关于泛型类型参数的文章中,指出:
[...] 这个特定类的类型参数可以是编译器识别的任何类型。
编译器识别的任何类型都是编译器推断的任何类型,即编译时已知的任何类型。
如果这是真的,那么为什么不允许以下语句?
int value = GenericMethod<typeof(int)>();
Run Code Online (Sandbox Code Playgroud) c# ×10
.net ×7
typeof ×3
types ×3
generics ×2
gettype ×2
inheritance ×1
performance ×1
reflection ×1