Różnica między słowami kluczowymi is i as

121

Powiedz, jaka jest różnica między słowem kluczowym isa asw języku C #

Mężczyzna
źródło
7
Jest tak, czy jest, jak jest? blogs.msdn.com/b/ericlippert/archive/2010/09/16/…
LukeH
3
Jeśli interesuje Cię ten temat, prawdopodobnie chcesz również wiedzieć, jaka jest różnica między operatorami „as” i „cast”: blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert
7
Czy chcesz oznaczyć odpowiedź jako zaakceptowaną? Pomogłoby to innym szukającym podobnej odpowiedzi.
KMån

Odpowiedzi:

151

jest

W isoperator sprawdza, czy obiekt może być oddane do określonego typu.

Przykład:

if (someObject is StringBuilder) ...

tak jak

Do asoperatora próby do oddania obiektu do określonego rodzaju i zwraca NULL jeśli to się nie powiedzie.

Przykład:

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

Powiązane również:

Odlew

Do napędu odlew próby do oddania obiektu do określonego rodzaju i zgłasza exeption jeśli to się nie powiedzie.

Przykład:

StringBuilder b = (StringBuilder)someObject.
Guffa
źródło
4
To nie jest poprawne. isnie sprawdza, czy obiekt może być rzutowany na określony typ. Liczba całkowita rzutuje na długą grzywnę, ale 10 is longjest fałszywa.
Martin Smith
9
@MartinSmith: Mylisz konwersję typu z rzutowaniem. Liczbę całkowitą można przekształcić w długość, ale nie można jej rzutować na długość, ponieważ nie jest ona długa.
Guffa
2
Mówisz mi, że liczby całkowitej nie można rzutować na długi? To (long)some_integersię nie powiedzie? Jestem prawie pewien, że oboje wiemy, że to nieprawda, nawet jeśli go nie uruchomiliśmy, więc wyjaśnij, co masz na myśli.
Martin Smith
12
@MartinSmith: Nadal mylisz casting z konwersją. Nie rzutujesz liczby całkowitej na long, konwertujesz liczbę całkowitą na long. Chociaż używają tej samej składni, rzutowane są odwołania, a wartości są konwertowane.
Guffa
2
Uwaga dotyczącais : „ Pamiętaj, że operator is bierze pod uwagę tylko konwersje referencyjne, konwersje typu boxing i konwersje po rozpakowaniu. Inne konwersje, takie jak konwersje zdefiniowane przez użytkownika, nie są brane pod uwagę. ” (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Informacjeas : „ Zauważ, że operator as wykonuje tylko konwersje odwołań, konwersje dopuszczające wartość null i konwersje typu boxing. Operator as nie może wykonywać innych konwersji, takich jak konwersje zdefiniowane przez użytkownika, które zamiast tego powinny być wykonywane przy użyciu wyrażeń rzutowania. ” ( Msdn .microsoft.com / en-us / library / cscsdfbt.aspx )
user1234567
33

Różnica między IS i A jest taka ...

IS - Is Operator służy do sprawdzania zgodności obiektu z danym typem i zwraca wynik jako wartość logiczną (prawda lub fałsz).

AS - As Operator służy do rzutowania obiektu na dany typ lub klasę.

Dawny.

Student s = obj as Student;

jest równa:

Student s = obj is Student ? (Student)obj : (Student)null;
Prem Ranjan Jha
źródło
1
Równoważność wyraźnie pokazuje, który z nich jest bardziej prymitywny i elegancko leży u podstaw ich związku! Dzięki za równoważność!
Musa Al-hassy
1
@ MusaAl-hassy Właściwie to nie pokazuje, który jest bardziej prymitywny. ismożna wyrazić za pomocą asi asmożna wyrazić za pomocą is. Oto jak zrobić isze assłowem kluczowym. Bool b = obj is Student; jest odpowiednikiem: Bool b = (obj as Student) != null; Więcej na ten temat tutaj
Alex Telon
8

Oba isi assłowa kluczowe są używane do rzutowania typów w C #.

Kiedy spojrzysz na kod IL użycia obu słów kluczowych, łatwo zauważysz różnicę.

Kod C #:

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
}

Kod IL (dla powyższego kodu C # znajduje się na załączonym obrazku):

Kod IL dla powyższego kodu C # Kod IL do isużycia słowa kluczowego zawiera instrukcje IL zarówno isinstai castclass.
Ale kod IL do asużycia słów kluczowych ma tylko isinsta.

W wyżej wymienionym użyciu, dwa typy będą miały miejsce, gdy isużywane jest słowo kluczowe, i tylko jedno typowanie, gdy asużywane jest słowo kluczowe.

Uwaga: Jeśli używasz issłowa kluczowego do sprawdzenia jakiegoś warunku i nie interesuje cię wynik rzutowania, to będzie tylko jedno rzutowanie, tj.

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

isa assłowa kluczowe będą używane w zależności od konieczności.

Abhilash NK
źródło
6

Słowo kluczowe is sprawdza, czy wartość po jego lewej stronie jest wystąpieniem typu po prawej stronie. Na przykład:

if(obj is string)
{
     ...
}

Zauważ, że w tym przypadku będziesz musiał użyć dodatkowego jawnego rzutowania, aby otrzymać obj jako łańcuch.

Słowo kluczowe as jest używane do rzutowania typów dopuszczających wartość null. Jeśli określona wartość nie jest wystąpieniem określonego typu, zwracana jest wartość null. Na przykład:

string str = obj as string;
if(str != null)
{
     ...
}
ShdNx
źródło
+1 dla „Słowo kluczowe as służy do rzutowania typów dopuszczających wartość null”.
user2330678
3

Powiedziałbym: czytaj MSDN online, ale oto jest:

Operator is sprawdza, czy obiekt jest zgodny z danym typem, a wynikiem oceny jest wartość logiczna: prawda lub fałsz.

Operator as nigdy nie zgłosi wyjątku.

Patrick Peters
źródło
Operator „as” również nie zgłosi wyjątku, po prostu zwróci wartość null.
Pinte Dani
Poprawiono literówkę dotyczącą „jest” i „jako”
Patrick Peters
2

Operator Is, rzut, zwraca wartość true, jeśli się powiedzie. Zwraca false, jeśli rzutowanie się nie powiedzie. Dzięki niemu nie możesz przechwycić przekonwertowanej zmiennej. Ten operator jest najbardziej przydatny podczas sprawdzania typów w instrukcjach if i wyrażeniach. Is-cast jest idealny tylko wtedy, gdy zmienna wynikowa nie będzie potrzebna do dalszego użycia

Jak obsada. Dzięki niemu zyskujemy wydajność i unikamy wyjątków, gdy rzut jest nieprawidłowy. Null jest zwracane, gdy rzucanie jest niemożliwe. W przypadku typów referencyjnych zaleca się rzutowanie w postaci. Jest szybki i bezpieczny - możemy przetestować wynikową zmienną pod kątem wartości null, a następnie jej użyć. Eliminuje to dodatkowe rzuty

Pankaj Ikhar
źródło
2

is OPERATOR Operator is w C # służy do sprawdzania typu obiektu i zwraca wartość bool: true, jeśli obiekt jest tego samego typu i false, jeśli nie. lub także Operator „is” służy do sprawdzania, czy wykonywany typ obiektu jest zgodny z danym typem, czy nie. Dla obiektów null zwraca false, np

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

jako OPERATOR

Operator as wykonuje to samo zadanie co operator is, ale różnica polega na tym, że zamiast typu bool zwraca obiekt, jeśli są one zgodne z tym typem, w przeciwnym razie zwraca wartość null.W innych słowach operator `` as '' służy do wykonywania konwersji między zgodnymi rodzaje.

na przykład

Type obj = Object as Type;

Zalety as over is W przypadku operatora is, aby wpisać rzutowanie, musimy wykonać dwa kroki:

Check the Type using is
If its true then Type cast

W rzeczywistości wpływa to na wydajność, ponieważ za każdym razem środowisko CLR przejdzie przez hierarchię dziedziczenia, sprawdzając każdy typ podstawowy pod kątem określonego typu.

Aby tego uniknąć, użyj as, zrobi to w jednym kroku. Tylko do sprawdzenia typu używamy operatora is.

Faizan Butt
źródło
Odpowiadanie na pytania od 8-latka, które już mają wiele prawidłowych odpowiedzi, nie jest najlepszym sposobem korzystania z przepełnienia stosu.
Claus Jørgensen
1

Operator As jest podobny do rzutowania, ale zwraca wartość null zamiast wyjątku, jeśli się nie powiedzie.

Operator Is służy do sprawdzania, czy jeden obiekt jest zgodny z określonym typem. Zwykle jest używany w instrukcjach If.

Złupić
źródło
1

is: Operator is służy do sprawdzania, czy typ wykonawczy obiektu jest zgodny z danym typem

as: Operator as jest używany do wykonywania konwersji między zgodnymi typami.

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;
KMån
źródło
2
Twoja odpowiedź jest prawidłowa, ale Twój przykładowy kod jest anty-wzorcem. Jest to kosztowne zrobić iswtedy as: to unboxes dwukrotnie. W przypadku typów referencyjnych należy po prostu to zrobić as, a następnie sprawdzić, czy nie ma wartości null, aby zobaczyć, czy zadziałało.
Steven Sudit
1

Spójrz na poniższy film z YouTube, który wyjaśnia różnicę w bardziej demonstracyjny i wizualny sposób: -

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

Poniżej znajduje się długa odpowiedź z objaśnieniem kodu.

Słowo kluczowe „IS” jest przydatne do sprawdzania, czy obiekty są zgodne z typem. Na przykład w poniższym kodzie sprawdzamy, czy obiekt „ocust” jest typem klasy „Customer”.

object ocust = new Customer();

if (ocust is Customer)
{ 

Słowo kluczowe „JAK” pomaga w konwersji z jednego typu na inny. Na przykład w poniższym kodzie konwertujemy obiekt na typ danych string. Jeśli słowo kluczowe „AS” nie może wpisać typu rzutowania, zwraca NULL.

object o = "somestring";
string str = o as string;
Shivprasad Koirala
źródło
1
MyClass myObject = (MyClass) obj;

vs

MyClass myObject = obj as MyClass;

Drugi zwróci wartość null, jeśli obj nie jest MyClass, zamiast zgłosić wyjątek rzutowania klasy.

funkcja zwróci tylko wartość true lub false

vzades
źródło
1

Zarówno IS, jak i AS są używane do bezpiecznego odlewania typu

IS Keyword -> sprawdza, czy typ danego obiektu jest zgodny z nowym typem obiektu. To nigdy nie zgłasza wyjątku. To jest typ boolowski… zwraca prawdę lub fałsz

`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 Keyword: sprawdza, czy typ danego obiektu jest zgodny z nowym typem obiektu. Zwraca wartość różną od null, jeśli dany obiekt jest zgodny z nowym, w przeciwnym razie null .. To zgłasza wyjątek.

`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
źródło
1

Oba operatory są używane do bezpiecznego odlewania typu.

Operator AS:

Operator AS sprawdza również, czy typ danego obiektu jest zgodny z nowym typem obiektu. To słowo kluczowe sprawdzi, czy typ danego obiektu jest zgodny z nowym typem obiektu. Jeśli nie jest kompatybilny z nowym, zwróci NULL.

Operator IS:

Ten operator sprawdza, czy typ obiektu jest zgodny z nowym obiektem. Jeśli jest zgodny, zwraca true, w przeciwnym razie false.

Tukaram
źródło
Czy nie sądzisz, że jest trochę za późno, jak 4 lata?
Soner Gönül
O tak ... Przepraszam ... Jestem nowy w stackoverflow, więc trochę wyszedłem ... Nie zauważyłem opublikowanej daty ...
Tukaram
Datek to datek! Dziękujemy za wskazanie słów kluczowych „Bezpieczne typowanie”! :-)
Musa Al-hassy