В чем разница между myCustomer.GetType () и typeof(Customer) в C#?


Я видел, как это делается в каком-то коде, который я поддерживаю, но не знаю разницы. Есть ли такой?

позвольте мне добавить, что myCustomer является экземпляром Customer

7 69

7 ответов:

результат точно такой же в вашем случае. Это будет ваш пользовательский тип, производный от System.Type. Единственное реальное различие здесь заключается в том, что когда вы хотите получить тип из экземпляра класса, вы используете GetType. Если у вас нет экземпляра, но вы знаете имя типа (и просто нужно фактическое System.Type чтобы проверить или сравнить), вы должны использовать typeof.

важным отличием

EDIT: позвольте мне добавить, что вызов GetType решается во время выполнения, в то время как typeof разрешена во время компиляции.

GetType () используется для поиска фактический тип ссылки на объект во время выполнения. Это может отличаться от типа переменной, которая ссылается на объект, из-за наследования. typeof () создает литерал типа, который имеет точно указанный тип и определяется во время компиляции.

Да, есть разница, если у вас есть наследственная типу от клиента.

class VipCustomer : Customer
{
  .....
}

static void Main()
{
   Customer c = new VipCustomer();
   c.GetType(); // returns typeof(VipCustomer)
}

typeof (foo) преобразуется в константу во время компиляции. foo.GetType () происходит во время выполнения.

typeof (foo) также преобразуется непосредственно в константу своего типа (т. е. foo), поэтому это не удастся:

public class foo
{
}

public class bar : foo
{
}

bar myBar = new bar();

// Would fail, even though bar is a child of foo.
if (myBar.getType == typeof(foo))

// However this Would work
if (myBar is foo)

для первого Вам нужен фактический экземпляр (т. е. myCustomer), для второго вы не

typeof выполняется во время компиляции, а GetType-во время выполнения. Вот что так отличается от этих двух методов. Вот почему, когда вы имеете дело с иерархией типов, вы можете узнать точное имя типа типа, просто запустив GetType.

public Type WhoAreYou(Base base)
{
   base.GetType();
}

оператор typeof принимает тип в качестве параметра. Он решается во время компиляции. Метод GetType вызывается для объекта и разрешается во время выполнения. Первый используется, когда вам нужно использовать известный тип, второй-чтобы получить тип объекта, когда вы не знаете, что это такое.

class BaseClass
{ }

class DerivedClass : BaseClass
{ }

class FinalClass
{
    static void RevealType(BaseClass baseCla)
    {
        Console.WriteLine(typeof(BaseClass));  // compile time
        Console.WriteLine(baseCla.GetType());  // run time
    }

    static void Main(string[] str)
    {
        RevealType(new BaseClass());

        Console.ReadLine();
    }
}
// *********  By Praveen Kumar Srivastava