开发者

What is the difference of getting Type by using GetType() and typeof()? [duplicate]

开发者 https://www.devze.com 2023-02-01 21:04 出处:网络
This question already has answ开发者_如何学Goers here: Type Checking: typeof, GetType, or is? (15 answers)
This question already has answ开发者_如何学Goers here: Type Checking: typeof, GetType, or is? (15 answers) Closed 1 year ago.

Which one is the preferred way to get the type?


You can only use typeof() when you know that type at compile time, and you're trying to obtain the corresponding Type object. (Although the type could be a generic type parameter, e.g. typeof(T) within a class with a type parameter T.) There don't need to be any instances of that type available to use typeof. The operand for typeof is always the name of a type or type parameter. It can't be a variable or anything like that.

Now compare that with object.GetType(). That will get the actual type of the object it's called on. This means:

  • You don't need to know the type at compile time (and usually you don't)
  • You do need there to be an instance of the type (as otherwise you have nothing to call GetType on)
  • The actual type doesn't need to be accessible to your code - for example, it could be an internal type in a different assembly

One odd point: GetType will give unexpected answers on nullable value types due to the way that boxing works. A call to GetType will always involve boxing any value type, including a nullable value type, and the boxed value of a nullable value type is either a null reference or a reference to an instance of a non-nullable value type.


GetType() works at runtime, typeof() is a compile-time operator.

So,

// 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");

Will print System.String and System.Object.

See this question for a better example.


GetType is a virtual method on Object - this means given an instance of a class, you can retrieve the corresponding Type object.

typeof is a C# operator - this is used to perform a compile time lookup i.e. Given a Symbol representing a Class name, retrieve the Type object for it.

if (typeof(String) == "test".GetType())


It's not exactly the same, and the problem appears when you use inheritance.

I.e.:

WebPage1 inherits from Page, and this one inherits also from Object, so if you test for (new WebPage1()).GetType() == typeof(object) it'll return false because the types are diferent, but when you test using the is operator it's true.

((new WebPage1()) is object) is true because (new WebPage1()) is an object of type WebPage1, and also a Page and an object.

The types might be different, but is checks if you can cast safely to this type.

0

精彩评论

暂无评论...
验证码 换一张
取 消