Odpowiedzi:
Różne odpowiedzi tutaj mają dwa różne znaczenia.
Jeśli chcesz sprawdzić, czy instancja jest tego samego typu, to
if (c.GetType() == typeof(TForm))
jest droga.
Jeśli chcesz wiedzieć, czy cjest instancją TForm czy podklasą, użyj is/ as:
if (c is TForm)
lub
TForm form = c as TForm;
if (form != null)
Warto jasno powiedzieć, które z tych zachowań naprawdę chcesz.
isi asdopasowywać wzory:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
lub jeśli planujesz używać cjako a TForm, skorzystaj z następującego przykładu:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
Drugi przykład wymaga tylko sprawdzenia, czy cjest typu TFormjeden raz. Gdzie, jeśli sprawdzisz, czy cjest typu, TForma następnie rzucisz go, CLR przechodzi dodatkową kontrolę. Oto odniesienie .
Edycja: Skradziony od Jona Skeeta
Jeśli chcesz się upewnić, cma TFormi nie każda klasa dziedziczy TForm, a następnie użyć
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
Tak, słowo kluczowe „is”:
if (c is TForm)
{
...
}
Zobacz szczegóły na MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
Sprawdza, czy obiekt jest zgodny z danym typem. Na przykład można ustalić, czy obiekt jest zgodny z typem ciągu:
Również nieco w tym samym stylu
Type.IsAssignableFrom(Type c)
„Prawda, jeśli c i bieżący typ reprezentują ten sam typ, lub jeśli bieżący typ znajduje się w hierarchii dziedziczenia c, lub jeśli bieżący typ jest interfejsem implementowanym przez c lub jeśli c jest parametrem typu ogólnego i bieżącym typem reprezentuje jedno z ograniczeń c. ”
Stąd: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())podobny do instanceofoperatora Java .
T1.IsAssignableFrom(T2)zwracanie truew sytuacjach, w których asoperator zwraca wartość inną niż null, biorąc pod uwagę instancje tego typu.
Trochę bardziej kompaktowy niż inne odpowiedzi, jeśli chcesz użyć c jako TForm:
if(c is TForm form){
form.DoStuff();
}
Jak wspomnieli inni, słowo kluczowe „jest”. Jeśli jednak zamierzasz później rzucić go na ten typ, np.
TForm t = (TForm)c;
Następnie powinieneś użyć słowa kluczowego „as”.
na przykład TForm t = c as TForm.
Następnie możesz sprawdzić
if(t != null)
{
// put TForm specific stuff here
}
Nie łącz tak jak z, ponieważ jest to duplikat czeku.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
lub prościej
bool isValid = c.GetType() == typeof(TForm);
==). W językach obiektowych lub zorientowanych obsługujących dziedziczenie, chyba że wiesz, że określony typ nigdy nie zostanie odziedziczony na przykład z sealedklasy. Także: korzystanie z trójskładnikowego operatora zwracającego (statyczne / stałe) wartości logiczne przeszkadza mi, mniej bym się martwił, gdyby to była switchinstrukcja.
instanceofi C #isto znacznie lepsze sposoby na zrobienie tego.