Perbedaan antara is dan as kata kunci

121

Tolong beri tahu apa perbedaan antara isdan askata kunci di C #

Seorang pria
sumber
3
Jika Anda tertarik dengan subjek ini, Anda mungkin juga ingin tahu apa perbedaan antara operator "as" dan "cast": blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert
7
Apakah Anda ingin menandai jawaban diterima? Ini akan membantu orang lain mencari jawaban serupa.
KMån

Jawaban:

151

adalah

The isOperator memeriksa apakah sebuah objek dapat dilemparkan ke jenis tertentu.

Contoh:

if (someObject is StringBuilder) ...

sebagai

The asOperator upaya untuk melemparkan objek untuk jenis tertentu, dan kembali nol jika gagal.

Contoh:

StringBuilder b = someObject as StringBuilder;
if (b != null) ...

Juga terkait:

Pengecoran

The cast operator upaya untuk melemparkan objek untuk jenis tertentu, dan melempar exeption jika gagal.

Contoh:

StringBuilder b = (StringBuilder)someObject.
Guffa
sumber
4
Ini tidak benar. istidak memeriksa apakah suatu objek dapat dilemparkan ke tipe tertentu. Integer menghasilkan denda panjang tetapi 10 is longsalah.
Martin Smith
9
@MartinSmith: Anda mencampurkan konversi tipe dengan casting. Sebuah integer dapat diubah menjadi panjang, tetapi tidak dapat dicor menjadi panjang karena tidak panjang.
Guffa
2
Anda memberi tahu saya bahwa bilangan bulat tidak dapat dilemparkan terlalu lama? Itu (long)some_integerakan gagal? Saya cukup yakin kita berdua tahu itu tidak benar bahkan tanpa menjalankannya jadi tolong jelaskan apa yang Anda maksud.
Martin Smith
12
@MartinSmith: Anda masih bingung antara casting dengan konversi. Anda tidak mentransmisikan bilangan bulat menjadi panjang, Anda mengubah bilangan bulat menjadi panjang. Meskipun mereka menggunakan sintaks yang sama, referensi dicor dan nilai diubah.
Guffa
2
Catatan tentangis : " Perhatikan bahwa operator is hanya mempertimbangkan konversi referensi, konversi boxing, dan konversi unboxing. Konversi lain, seperti konversi yang ditentukan pengguna, tidak dipertimbangkan. " (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Aboutas : " Perhatikan bahwa operator as hanya melakukan konversi referensi, konversi nullable, dan konversi tinju. Operator as tidak dapat melakukan konversi lain, seperti konversi yang ditentukan pengguna, yang seharusnya dilakukan dengan menggunakan ekspresi cast. " ( Msdn .microsoft.com / en-us / library / cscsdfbt.aspx )
user1234567
33

Perbedaan antara IS dan As adalah ..

IS - Operator Is digunakan untuk memeriksa Kompatibilitas Objek dengan Jenis yang diberikan dan mengembalikan hasil sebagai Boolean (Benar Atau Salah).

AS - Sebagai Operator digunakan untuk Casting Objek ke Jenis atau Kelas tertentu.

Ex.

Student s = obj as Student;

setara dengan:

Student s = obj is Student ? (Student)obj : (Student)null;
Prem Ranjan Jha
sumber
1
Persamaan itu dengan jelas menunjukkan mana di antara keduanya yang lebih primitif dan mendasari hubungan mereka dengan elegan! Terima kasih atas kesetaraannya!
Musa Al-hassy
1
@ MusaAl-hassy Sebenarnya ini tidak menunjukkan mana yang lebih primitif. isbisa diekspresikan dengan asdan asbisa diekspresikan dengan is. Berikut ini cara membuat isdengan askata kunci. Bool b = obj is Student; setara dengan: Bool b = (obj as Student) != null; Lebih lanjut tentang ini di sini
Alex Telon
8

Keduanya isdan askata kunci digunakan untuk jenis casting di C #.

Saat Anda melihat kode IL dari penggunaan kedua kata kunci, Anda akan mendapatkan perbedaannya dengan mudah.

C # Kode:

BaseClass baseclassInstance = new DerivedClass();
DerivedClass derivedclassInstance;

if (baseclassInstance is DerivedClass)
{
   derivedclassInstance = (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}


derivedclassInstance = baseclassInstance as DerivedClass;

if (derivedclassInstance != null)
{
   // do something on derivedclassInstance
}

Kode IL (untuk kode C # di atas ada pada gambar terlampir):

Kode IL untuk kode C # di atas Kode IL untuk ispenggunaan kata kunci berisi instruksi IL baik isinstadan castclass.
Tetapi kode IL untuk aspenggunaan kata kunci hanya memiliki isinsta.

Dalam penggunaan yang disebutkan di atas, dua typecast akan terjadi di mana iskata kunci digunakan dan hanya satu typecast di mana askata kunci digunakan.

Catatan: Jika Anda menggunakan iskata kunci untuk memeriksa suatu kondisi dan tidak tertarik dengan hasil typecast, maka typecast hanya akan ada satu, yaitu

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}

isdan askata kunci akan digunakan berdasarkan kebutuhan.

Abhilash NK
sumber
6

Kata kunci is memeriksa apakah nilai di sisi kirinya adalah turunan dari jenis di sisi kanan. Sebagai contoh:

if(obj is string)
{
     ...
}

Perhatikan bahwa dalam kasus ini Anda harus menggunakan cast ekstra eksplisit untuk mendapatkan obj sebagai string.

Kata kunci as digunakan untuk mentransmisikan tipe nullable. Jika nilai yang ditentukan bukan turunan dari tipe yang ditentukan, null dikembalikan. Sebagai contoh:

string str = obj as string;
if(str != null)
{
     ...
}
ShdNx
sumber
+1 untuk "Kata kunci as digunakan untuk mentransmisikan jenis nullable."
pengguna2330678
3

Saya akan mengatakan: baca MSDN online, tetapi ini dia:

Operator is memeriksa apakah suatu objek kompatibel dengan tipe tertentu, dan hasil evaluasi adalah Boolean: true atau false.

Operator as tidak akan pernah mengeluarkan pengecualian.

Patrick Peters
sumber
Operator "sebagai" juga tidak akan mengeluarkan pengecualian, itu hanya akan mengembalikan nol.
Pinte Dani
Memperbaiki kesalahan ketik terkait 'is' dan 'as'
Patrick Peters
2

Is operator, a cast, mengembalikan nilai true jika berhasil. Ini mengembalikan false jika gips gagal. Dengan itu, Anda tidak dapat menangkap variabel yang dikonversi. Operator ini paling berguna saat memeriksa tipe dalam pernyataan dan ekspresi if. Is-cast hanya ideal jika variabel yang dihasilkan tidak akan diperlukan untuk penggunaan lebih lanjut

Seperti para pemeran. Dengan itu, kami mendapatkan performa dan menghindari pengecualian saat cast tidak valid. Null dikembalikan ketika cast tidak memungkinkan. Untuk tipe referensi, disarankan menggunakan as-cast. Ini cepat dan aman. Kita dapat menguji variabel yang dihasilkan terhadap null dan kemudian menggunakannya. Ini menghilangkan gips ekstra

Pankaj Ikhar
sumber
2

is OPERATOR Operator is di C # digunakan untuk memeriksa tipe objek dan mengembalikan nilai bool: true jika objek adalah tipe yang sama dan false jika tidak. atau juga Operator “is” digunakan untuk memeriksa apakah tipe run-time suatu objek kompatibel dengan tipe tertentu atau tidak. Untuk objek null, ia mengembalikan false misalnya

if(obj is AnimalObject)
{
 //Then Work
}

sebagai OPERATOR

Operator as melakukan pekerjaan yang sama dengan operator is tetapi perbedaannya adalah alih-alih bool, ia mengembalikan objek jika kompatibel dengan tipe itu, jika tidak ia mengembalikan null. Dengan kata lain, operator 'as' digunakan untuk melakukan konversi antara yang kompatibel jenis.

misalnya

Type obj = Object as Type;

Keuntungan dari as over is Dalam kasus operator, untuk mengetik cor, kita perlu melakukan dua langkah:

Check the Type using is
If its true then Type cast

Sebenarnya ini mempengaruhi kinerja karena setiap kali CLR akan melalui hierarki pewarisan, memeriksa setiap jenis dasar terhadap jenis yang ditentukan.

Untuk menghindarinya, gunakan sebagai, ini akan melakukannya dalam satu langkah. Hanya untuk mengecek type kita harus menggunakan operator is.

Faizan Butt
sumber
Menjawab pertanyaan berusia 8 tahun yang sudah memiliki banyak jawaban valid bukanlah cara terbaik untuk menggunakan Stack Overflow.
Claus Jørgensen
1

Operator As mirip dengan cast, tetapi mengembalikan null sebagai ganti pengecualian jika gagal.

Dan operator Is digunakan untuk memeriksa apakah satu objek kompatibel dengan tipe tertentu. Biasanya digunakan dalam pernyataan If.

Harry
sumber
1

is: Operator is digunakan untuk memeriksa apakah tipe run-time suatu objek kompatibel dengan tipe yang diberikan

as: Operator as digunakan untuk melakukan konversi antara tipe yang kompatibel.

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;
KMån
sumber
2
Jawaban Anda benar, tetapi kode sampel Anda adalah anti-pola. Ini mahal untuk melakukan ismaka as: itu unboxes dua kali. Untuk jenis referensi, Anda harus melakukannya as, lalu periksa null untuk melihat apakah berfungsi.
Steven Sudit
1

Lihat video youtube di bawah ini yang menjelaskan perbedaannya dengan cara yang lebih demonstratif dan visual: -

https://www.youtube.com/watch?v=IKmRtJcRX_I

Di bawah ini adalah jawaban panjang dengan penjelasan kode.

Kata kunci "IS" berguna untuk memeriksa apakah objek kompatibel dengan suatu tipe. Misalnya pada kode di bawah ini kami memeriksa apakah objek "ocust" adalah jenis kelas "Pelanggan".

object ocust = new Customer();

if (ocust is Customer)
{ 

Kata kunci “AS” membantu melakukan konversi dari satu jenis ke jenis lainnya. Misalnya dalam kode di bawah ini kami mengubah objek menjadi tipe data string. Jika kata kunci "AS" tidak dapat mengetik cast, ia mengembalikan NULL.

object o = "somestring";
string str = o as string;
Shivprasad Koirala
sumber
1
MyClass myObject = (MyClass) obj;

vs.

MyClass myObject = obj as MyClass;

Yang kedua akan mengembalikan null jika obj bukan MyClass, daripada membuang pengecualian cast kelas.

adalah hanya akan mengembalikan true atau false

vzades
sumber
1

Baik IS dan AS digunakan untuk Safe Type Casting

IS Keyword -> memeriksa apakah tipe dari objek yang diberikan sesuai dengan tipe objek baru. Itu Tidak Pernah Melempar pengecualian. Ini adalah tipe Boolean..mengembalikan benar atau salah

`student stud = new student(){}
if(stud is student){} // It returns true // let say boys as derived class
if(stud is boys){}// It returns false since stud is not boys type
 //this returns true when,
student stud = new boys() // this return true for both if conditions.`

Kata kunci AS: memeriksa apakah tipe objek yang diberikan kompatibel dengan tipe objek baru. Ia mengembalikan non-null jika objek yang diberikan kompatibel dengan yang baru, jika tidak null .. Ini melempar pengecualian.

`student stud = new student(){}
 // let say boys as derived class
boys boy = stud as boys;//this returns null since we cant convert stud type from base class to derived class
student stud = new boys()
boys boy = stud as boys;// this returns not null since the obj is pointing to derived class`
Sandeep Reddy
sumber
1

Kedua operator digunakan untuk pengecoran tipe aman.

SEBAGAI Operator:

Operator AS juga memeriksa apakah tipe objek yang diberikan kompatibel dengan tipe objek baru. Kata kunci ini akan memeriksa apakah tipe objek yang diberikan kompatibel dengan tipe objek baru. Jika tidak kompatibel dengan yang baru maka itu akan mengembalikan NULL.

Operator IS:

Operator ini memeriksa apakah tipe suatu objek kompatibel dengan objek baru. Jika itu kompatibel itu mengembalikan true jika tidak salah.

Tukaram
sumber
Tidakkah menurutmu ini sedikit terlambat seperti 4 tahun?
Soner Gönül
Ohh ya ... Maaf .... Saya baru mengenal stackoverflow sehingga sedikit keluar ... Tidak memperhatikan tanggal diposting ...
Tukaram
Kontribusi adalah kontribusi! Terima kasih telah menunjukkan kata kunci "Typecasting aman"! :-)
Musa Al-hassy