获取该类型的首选方法是哪一种?
答案 0 :(得分:25)
只有在编译时知道该类型,并且您尝试获取相应的typeof()
对象时,才能使用Type
。 (虽然类型可以是泛型类型参数,例如类型参数为typeof(T)
的类中的T
。)不需要使用该类型的任何实例{{1} }。 typeof
的操作数始终是类型或类型参数的名称。它不能是变量或类似的东西。
现在将其与typeof
进行比较。这将获得它被调用的对象的实际类型。这意味着:
object.GetType()
)奇怪之处:由于拳击的工作方式,GetType
会对可空值类型给出意想不到的答案。对GetType
的调用将始终涉及装箱任何值类型,包括可空值类型,并且可空值类型的装箱值可以是空引用或对实例的引用不可为空的值类型。
答案 1 :(得分:9)
GetType()在运行时工作,typeof()是编译时操作符。
所以,
// untested, schematic
void ShowType(Object x)
{
Write(x.GetType().Name); // depends on actual type
// typeof(x) won't actually compile
Write(typeof(x).Name); // always System.Object
}
ShowType("test");
将打印System.String和System.Object。
有关更好的示例,请参阅this question。
答案 2 :(得分:2)
GetType是Object上的虚方法 - 这意味着给定一个类的实例,您可以检索相应的Type对象。
typeof是一个C#运算符 - 用于执行编译时查找,即给定一个表示类名的符号,为其检索Type对象。
if (typeof(String) == "test".GetType())
答案 3 :(得分:0)
它不完全相同,使用时会出现问题 继承。
I.e。:
WebPage1
继承自Page
,而且这个也继承自Object
,所以如果你测试(new WebPage1()).GetType() == typeof(object)
它会返回false,因为类型不同,但是当你使用is
运算符进行测试时,这是真的。
((new WebPage1()) is object)
是正确的,因为(new WebPage1())
是WebPage1
类型的对象,还有Page
和object
。
类型可能不同,但is
会检查您是否可以安全地投射到
这种类型。