Відповіді:
Тут різні відповіді мають два різних значення.
Якщо ви хочете , щоб перевірити , є чи екземпляр має точного типу , то
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(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 проходить додаткову перевірку. Ось довідка .
Редагувати: Вкрадено у Джона Скіта
Якщо ви хочете, щоб переконатися, що 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 являють собою один і той же тип, або якщо поточний Type знаходиться в ієрархії спадкування c, або якщо поточний Type - це інтерфейс, який реалізує c, або якщо c - параметр загального типу та поточний тип являє собою одне з обмежень c ".
Звідси: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())схожий на instanceofоператора Java .
T1.IsAssignableFrom(T2)повернення trueв ситуаціях, коли asоператор повертає ненулеве значення, враховуючи екземпляри цих типів.
Трохи більш компактний, ніж інші відповіді, якщо ви хочете використовувати c як TForm:
if(c is TForm form){
form.DoStuff();
}
Як уже згадували інші, ключове слово "є". Однак якщо ви збираєтесь пізніше передати це типу, наприклад,
TForm t = (TForm)c;
Тоді слід використовувати ключове слово "як".
напр TForm t = c as TForm.
Потім ви можете перевірити
if(t != null)
{
// put TForm specific stuff here
}
Не поєднуйте так, як це, тому що це дублікат чека.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
або простіше
bool isValid = c.GetType() == typeof(TForm);
==). На об'єктних або орієнтованих мовах, що підтримують успадкування, якщо ви не знаєте, що ваш конкретний тип ніколи не буде успадкований, наприклад, від sealedкласу. Також: мене турбує використання потрійного оператора, що повертає (статичні / постійні) булеві значення, я б менше турбував, якби це було switchтвердженням.
instanceofта C # 'isє набагато кращі способи зробити це.