Catatan kecil: gunakan "adalah" jika Anda tidak ingin menggunakan hasil pemeran dan gunakan "sebagai" jika Anda mau.
Aviram Fireberger
14
Dengan C # 7 Anda dapat menggabungkan isdan asdengan pencocokan pola:if (x is TForm tf) {…
Richard
39
if(c isTFrom){// Do Stuff}
atau jika Anda berencana menggunakan csebagai TForm, gunakan contoh berikut:
var tForm = c asTForm;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}
Memeriksa apakah suatu objek kompatibel dengan jenis yang diberikan. Misalnya, dapat ditentukan apakah suatu objek kompatibel dengan tipe string seperti ini:
"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. "
ini juga favorit pribadi saya. typeof(Class).IsAssignableFrom(object.getType())mirip dengan instanceofoperator Java .
SkidRunner
Apakah itu salah jika mereka tidak berada di cabang yang sama dari hierarki warisan tetapi operator konversi ada?
Paul Stelian
Pertanyaan bagus @PaulStelian. Saya tidak yakin dari atas kepala saya tetapi dugaan saya akan mengembalikan kesalahan dalam situasi itu. Setidaknya itu akan menjadi perilaku saya yang diharapkan. Mungkin jika ada konversi tersirat itu mungkin kembali benar tetapi itu akan aneh.
Brad Cunningham
Adakah yang sudah menginstal Visual Studio untuk mencobanya?
Paul Stelian
1
@ PaulStelian - ini mengembalikan false. Ini dapat dilihat dengan mengikuti tautan dokumen, dan mengamati tidak ada penyebutan konversi. Cara lain untuk memikirkannya adalah T1.IsAssignableFrom(T2)pengembalian truedalam situasi di mana asoperator mengembalikan nilai non-nol, dengan memberikan contoh jenis-jenis tersebut.
ToolmakerSteve
9
Sedikit lebih ringkas daripada jawaban lain jika Anda ingin menggunakan c sebagai TForm:
IMHO: Saya akan menghindari belas kasih langsung (mis. ==). 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.
instanceof
dan C #is
adalah cara yang lebih baik untuk melakukannya.Jawaban:
Perbedaan jawaban di sini memiliki dua arti berbeda.
Jika Anda ingin memeriksa apakah instance adalah tipe yang tepat, maka
adalah cara untuk pergi.
Jika Anda ingin tahu apakah
c
turunan dariTForm
atau subkelas maka gunakanis
/as
:atau
Sebaiknya jelas dalam benak Anda tentang perilaku mana yang sebenarnya Anda inginkan.
sumber
is
danas
dengan pencocokan pola:if (x is TForm tf) {…
atau jika Anda berencana menggunakan
c
sebagaiTForm
, gunakan contoh berikut:Contoh kedua hanya perlu memeriksa untuk melihat apakah
c
bertipeTForm
sekali. Dimana jika Anda memeriksa jika melihat apakahc
bertipeTForm
kemudian melemparkannya, CLR mengalami pemeriksaan tambahan. Ini referensi .Sunting: Dicuri dari Jon Skeet
Jika Anda ingin memastikan
c
dariTForm
dan bukan kelas mana pun yang mewarisiTForm
, maka gunakansumber
Ya, kata kunci "is":
Lihat detail di MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
sumber
Juga, agak dalam nada yang sama
Dari sini: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
sumber
typeof(Class).IsAssignableFrom(object.getType())
mirip denganinstanceof
operator Java .T1.IsAssignableFrom(T2)
pengembaliantrue
dalam situasi di manaas
operator mengembalikan nilai non-nol, dengan memberikan contoh jenis-jenis tersebut.Sedikit lebih ringkas daripada jawaban lain jika Anda ingin menggunakan c sebagai TForm:
sumber
Coba yang berikut ini
sumber
Seperti yang telah disebutkan orang lain, kata kunci "adalah". Namun, jika nanti Anda akan melemparkannya ke jenis itu, mis.
Maka Anda harus menggunakan kata kunci "sebagai".
misalnya
TForm t = c as TForm.
Maka Anda dapat memeriksa
Jangan gabungkan dengan karena ini adalah pemeriksaan duplikat.
sumber
Atau
sumber
atau lebih sederhana
sumber
==
). Dalam bahasa berorientasi objek atau mendukung warisan kecuali Anda tahu bahwa Jenis spesifik Anda tidak akan pernah diwarisi dari misalnyasealed
Kelas. Juga: penggunaan operator ternary yang mengembalikan nilai-nilai boolean (statis / konstan) mengganggu saya, saya tidak akan terlalu terganggu jika itu adalahswitch
pernyataan.