Is ve as keyword arasındaki fark


121

Lütfen C # isile asanahtar kelime arasındaki farkın ne olduğunu söyleyin


7
Olduğu gibi mi, olduğu gibi mi? blogs.msdn.com/b/ericlippert/archive/2010/09/16/...
LukeH

3
Bu konuyla ilgileniyorsanız, muhtemelen "as" ve "cast" operatörleri arasındaki farkın ne olduğunu da bilmek istersiniz: blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert

7
Cevabı kabul edildi olarak işaretlemek ister misiniz? Benzer bir cevap arayan başkalarına yardımcı olur.
KMån

Yanıtlar:


151

dır-dir

isOperatör kontrol bir amacı, belirli bir tür için döküm eğer.

Misal:

if (someObject is StringBuilder) ...

gibi

asOperatör girişimleri belirli bir tür için bir nesne artığını, ve başarısız olursa geri döner boş.

Misal:

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

Ayrıca ilgili:

Döküm

Yayın operatörü , bir nesneyi belirli bir türe dönüştürmeye çalışır ve başarısız olursa bir istisna atar.

Misal:

StringBuilder b = (StringBuilder)someObject.

4
Bu doğru değil. isbir nesnenin belirli bir türe dönüştürülüp dönüştürülemeyeceğini kontrol etmez. Bir tamsayı uzun bir para cezasına çevirir ancak 10 is longyanlıştır.
Martin Smith

9
@MartinSmith: Tür dönüşümünü döküm ile karıştırıyorsunuz. Bir tam sayı uzuna çevrilebilir, ancak uzun olmadığı için uzun çevirilemez.
Guffa

2
Bana bir tamsayının uzun süre kullanılamayacağını mı söylüyorsun? Bu (long)some_integerbaşarısız olur mu? Eminim ikimiz de çalıştırmadan bunun doğru olmadığını biliyoruz, bu yüzden lütfen ne demek istediğinizi açıklayın.
Martin Smith

12
@MartinSmith: Oyuncu seçimi ile dönüşüm arasında hala kafa karıştırıyorsunuz. Bir tamsayıyı uzun bir sayıya çevirmiyorsunuz, bir tamsayıyı uzun bir sayıya çeviriyorsunuz. Aynı sözdizimini kullansalar da başvurular dönüştürülür ve değerler dönüştürülür.
Guffa

2
Not yaklaşıkis " o Not olup . Operatörü sadece referans dönüşümleri, boks dönüşümleri ve kutudan çıkarma dönüşüm görmesi durumunda bu, kabul edilmez kullanıcı tanımlı dönüşüm olarak diğer dönüşümler. " (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Hakkındaas " Not bu şekilde .. Operatör gerçekleştirir tek referans dönüşümleri, null dönüşüm ve boks dönüşüm gibi yerine döküm ifadeleri kullanılarak yapılmalıdır kullanıcı tanımlı dönüşüm gibi diğer dönüşümleri, gerçekleştiremez operatör " ( msdn .microsoft.com / en-us / library / cscsdfbt.aspx )
user1234567

33

IS ve As arasındaki fark şudur :

IS - Is Operatörü, belirli bir Türe sahip bir Nesnenin Uyumluluğunu Kontrol etmek için kullanılır ve sonucu bir Boole (Doğru veya Yanlış) olarak döndürür.

AS - Operatör olarak, Nesnenin belirli bir Türe veya bir Sınıfa Yayınlanması için kullanılır.

Ör.

Student s = obj as Student;

eşdeğerdir:

Student s = obj is Student ? (Student)obj : (Student)null;

1
Eşdeğerlik, hangisinin daha ilkel olduğunu ve ilişkilerinin zarif bir şekilde altında yattığını açıkça gösterir! Denklik için teşekkürler!
Musa Al-hassy

1
@ MusaAl-hassy Aslında bu hangisinin daha ilkel olduğunu göstermiyor. isile ifade edilebilir asve asifade edilebilir is. Anahtar kelime isile nasıl yapılacağı aşağıda açıklanmıştır as. Bool b = obj is Student; eşdeğerdir: Bool b = (obj as Student) != null; Bu konuda daha fazla bilgi burada
Alex Telon

8

Hem isve hem de asanahtar sözcükler, C #'da tür çevirimi için kullanılır.

Her iki anahtar kelimenin IL kodlarına baktığınızda farkı kolayca anlayacaksınız.

C # Kodu:

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
}

IL kodu (yukarıdaki C # kodu için ekli resimdedir):

Yukarıdaki C # kodu için IL koduisAnahtar kelime kullanımı için IL kodu, hem isinstave hem de IL talimatlarını içerir castclass.
Ancak asanahtar kelime kullanımı için IL kodu yalnızca vardır isinsta.

Yukarıda belirtilen kullanımda, isanahtar kelimenin kullanıldığı iki typecast ve anahtar kelimenin kullanıldığı yalnızca bir typecast gerçekleşecektir as.

Not: isBazı koşulları kontrol etmek için anahtar kelime kullanıyorsanız ve typecast sonucuyla herhangi bir ilginiz yoksa, o zaman yalnızca bir typecast olacaktır, yani

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

isve asanahtar kelimeler ihtiyaca göre kullanılacaktır.


6

İs anahtar sözcüğü, sol tarafındaki değerin sağ taraftaki türün bir örneği olup olmadığını kontrol eder. Örneğin:

if(obj is string)
{
     ...
}

Bu durumda nesneyi dize olarak almak için fazladan açık bir çevirme kullanmanız gerekeceğini unutmayın.

As anahtar sözcüğü, boş değer atanabilir türleri yayınlamak için kullanılır. Belirtilen değer, belirtilen türün bir örneği değilse, null döndürülür. Örneğin:

string str = obj as string;
if(str != null)
{
     ...
}

"As anahtar sözcüğü, boş değer atanabilir türleri yayınlamak için kullanılır." İçin +1.
user2330678

3

Şunu söyleyebilirim: Çevrimiçi MSDN'yi okuyun, ancak işte burada:

İs operatörü, bir nesnenin belirli bir türle uyumlu olup olmadığını ve değerlendirmenin sonucunun bir Boolean: true veya false olup olmadığını kontrol eder.

As operatörü asla bir istisna oluşturmaz.


"As" operatörü de bir istisna oluşturmaz, sadece boş döndürür.
Pinte Dani

'Eşittir' ve 'as' ile ilgili yazım hatası düzeltildi
Patrick Peters

2

İs operatörü, bir cast, başarılı olursa true döndürür. Oyuncular başarısız olursa yanlış döndürür. Bununla, dönüştürülen değişkeni yakalayamazsınız. Bu işleç en çok if-ifadelerindeki ve ifadelerdeki türleri kontrol ederken kullanışlıdır. İs-cast, yalnızca ortaya çıkan değişken daha fazla kullanım için gerekli olmayacaksa idealdir.

Oyuncular gibi. Bununla, performans kazanıyor ve bir atma geçersiz olduğunda istisnalardan kaçınıyoruz. Kullanmak imkansız olduğunda Null döndürülür. Referans türleri için as-cast önerilir. Hem hızlı hem de güvenlidir. Elde edilen değişkeni null değerine karşı test edebilir ve sonra kullanabiliriz. Bu fazladan yayınları ortadan kaldırır



2

is OPERATOR C # 'daki is operatörü, nesne tipini kontrol etmek için kullanılır ve bir bool değeri döndürür: nesne aynı tipse true, değilse false. ya da "eşittir" operatörü, bir nesnenin çalışma zamanı tipinin belirli bir türle uyumlu olup olmadığını kontrol etmek için kullanılır. Boş nesneler için yanlış döndürür, örn.

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

OPERATÖR olarak

As operatörü is operatörü ile aynı işi yapar, ancak fark bool yerine nesneyi döndürür, bu türle uyumluysa nesneyi döndürür, aksi takdirde null döndürür.Başka bir deyişle, 'as' operatörü, uyumlu türleri.

Örneğin

Type obj = Object as Type;

Üzerinde olduğu gibi avantajları is operatörü durumunda, cast yazmak için iki adım yapmamız gerekir:

Check the Type using is
If its true then Type cast

Aslında bu, CLR her seferinde miras hiyerarşisinden geçeceği ve her bir temel türü belirtilen türe göre kontrol edeceği için performansı etkiler.

Bunu önlemek için olarak kullanın, tek adımda yapacaktır. Yalnızca türü kontrol etmek için is operatörünü kullanmalıyız.


Zaten çok sayıda geçerli yanıtı olan 8 yıllık soruları yanıtlamak, Stack Overflow'u kullanmanın en iyi yolu değildir.
Claus Jørgensen

1

As operatörü bir çevrim işlemine benzer, ancak başarısız olursa istisna yerine null döndürür.

Ve Is operatörü, bir nesnenin belirli bir türle uyumlu olup olmadığını kontrol etmek için kullanılır. Genellikle If ifadelerinde kullanılır.


1

is: İs operatörü, bir nesnenin çalışma zamanı türünün belirli bir türle uyumlu olup olmadığını kontrol etmek için kullanılır

as: As operatörü, uyumlu türler arasında dönüşüm gerçekleştirmek için kullanılır.

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;

2
Cevabınız doğru, ancak örnek kodunuz bir anti-modeldir. O iszaman yapmak pahalıdır as: iki kez açılır. Başvuru türleri için, sadece yapmalı as, sonra işe yarayıp yaramadığını görmek için null olup olmadığını kontrol etmelisiniz.
Steven Sudit

1

Farkı daha açıklayıcı ve görsel bir şekilde açıklayan aşağıdaki youtube videosuna bir göz atın: -

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

Aşağıda, kod açıklamasıyla birlikte uzun yanıt verilmektedir.

"IS" anahtar sözcüğü, nesnelerin bir türle uyumlu olup olmadığını kontrol etmek için kullanışlıdır. Örneğin aşağıdaki kodda “ocust” nesnesinin bir “Customer” sınıfı türü olup olmadığını kontrol ediyoruz.

object ocust = new Customer();

if (ocust is Customer)
{ 

"AS" anahtar kelimesi, bir türden diğerine dönüştürme yapmaya yardımcı olur. Örneğin aşağıdaki kodda nesneyi bir dizgi veri türüne dönüştürüyoruz. "AS" anahtar sözcüğü cast yazamazsa, NULL döndürür.

object o = "somestring";
string str = o as string;

1
MyClass myObject = (MyClass) obj;

vs

MyClass myObject = obj as MyClass;

İkincisi, eğer obj bir Sınıfım değilse, sınıf atma istisnası atmak yerine null döndürür.

sadece doğru mu yanlış mı döndürür


1

Güvenli Tip Döküm için hem IS hem de AS kullanılır

IS Anahtar Kelime -> belirli bir nesnenin türünün yeni nesne türüyle uyumlu olup olmadığını kontrol eder. Asla bir istisna atmaz. Bu bir Boole türüdür .. doğru veya yanlış döndürür

`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.`

AS Anahtar Kelime: belirli bir nesnenin türünün yeni nesne türü ile uyumlu olup olmadığını kontrol eder. Verilen nesne yenisiyle uyumluysa boş olmayan döndürür, aksi takdirde boş .. Bu bir istisna atar.

`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`

1

Her iki operatör de güvenli tip döküm için kullanılır.

Operatör AS:

AS operatörü, belirli bir nesnenin türünün yeni nesne türüyle uyumlu olup olmadığını da kontrol eder. Bu anahtar sözcük, belirli bir nesnenin türünün yeni nesne türü ile uyumlu olup olmadığını kontrol edecektir. Yenisiyle uyumlu değilse NULL döndürür.

IS Operatörü:

Bu Operatör, bir nesnenin türünün yeni nesne ile uyumlu olup olmadığını kontrol eder. Uyumlu ise true, aksi takdirde false döndürür.


4 yıl gibi biraz geç olduğunu düşünmüyor musun?
Soner Gönül

Ohh evet ... Üzgünüm .... Stackoverflow konusunda yeniyim, bu yüzden biraz çıktım ... Yayınlanan tarihi fark etmedim ...
Tukaram

Katkı, katkıdır! "Güvenli tip yayınlama" anahtar kelimelerini işaret ettiğiniz için teşekkür ederiz! :-)
Musa Al-hassy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.