Jawaban:
Perbedaan jawaban di sini memiliki dua arti berbeda.
Jika Anda ingin memeriksa apakah instance adalah tipe yang tepat, maka
if (c.GetType() == typeof(TForm))
adalah cara untuk pergi.
Jika Anda ingin tahu apakah cturunan dari TForm atau subkelas maka gunakan is/ as:
if (c is TForm)
atau
TForm form = c as TForm;
if (form != null)
Sebaiknya jelas dalam benak Anda tentang perilaku mana yang sebenarnya Anda inginkan.
isdan asdengan pencocokan pola:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
atau jika Anda berencana menggunakan csebagai TForm, gunakan contoh berikut:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
Contoh kedua hanya perlu memeriksa untuk melihat apakah cbertipe TFormsekali. Dimana jika Anda memeriksa jika melihat apakah cbertipe TFormkemudian melemparkannya, CLR mengalami pemeriksaan tambahan. Ini referensi .
Sunting: Dicuri dari Jon Skeet
Jika Anda ingin memastikan cdari TFormdan bukan kelas mana pun yang mewarisi TForm, maka gunakan
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
Ya, kata kunci "is":
if (c is TForm)
{
...
}
Lihat detail di MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
Memeriksa apakah suatu objek kompatibel dengan jenis yang diberikan. Misalnya, dapat ditentukan apakah suatu objek kompatibel dengan tipe string seperti ini:
Juga, agak dalam nada yang sama
Type.IsAssignableFrom(Type c)
"Benar jika c dan Tipe saat ini mewakili tipe yang sama, atau jika Tipe saat ini ada dalam hierarki warisan c, atau jika Tipe saat ini adalah antarmuka yang mengimplementasikan c, atau jika c adalah parameter tipe generik dan Tipe saat ini merupakan salah satu kendala c. "
Dari sini: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())mirip dengan instanceofoperator Java .
T1.IsAssignableFrom(T2)pengembalian truedalam situasi di mana asoperator mengembalikan nilai non-nol, dengan memberikan contoh jenis-jenis tersebut.
Sedikit lebih ringkas daripada jawaban lain jika Anda ingin menggunakan c sebagai TForm:
if(c is TForm form){
form.DoStuff();
}
Seperti yang telah disebutkan orang lain, kata kunci "adalah". Namun, jika nanti Anda akan melemparkannya ke jenis itu, mis.
TForm t = (TForm)c;
Maka Anda harus menggunakan kata kunci "sebagai".
misalnya TForm t = c as TForm.
Maka Anda dapat memeriksa
if(t != null)
{
// put TForm specific stuff here
}
Jangan gabungkan dengan karena ini adalah pemeriksaan duplikat.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
atau lebih sederhana
bool isValid = c.GetType() == typeof(TForm);
==). Dalam bahasa berorientasi objek atau mendukung warisan kecuali Anda tahu bahwa Jenis spesifik Anda tidak akan pernah diwarisi dari misalnya sealedKelas. Juga: penggunaan operator ternary yang mengembalikan nilai-nilai boolean (statis / konstan) mengganggu saya, saya tidak akan terlalu terganggu jika itu adalah switchpernyataan.
instanceofdan C #isadalah cara yang lebih baik untuk melakukannya.