is와 as 키워드의 차이점


121

C #에서 isas키워드 의 차이점을 알려주세요 .


7
있는 그대로입니까 아니면있는 그대로입니까? blogs.msdn.com/b/ericlippert/archive/2010/09/16/…
LukeH

3
이 주제에 관심이 있다면 "as"와 "cast"연산자의 차이점을 알고 싶을 것입니다. blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert

7
답변을 수락으로 표시 하시겠습니까? 비슷한 대답을 찾는 다른 사람들에게 도움이 될 것입니다.
KMån

답변:


151

이다

is운영자 점검 목적은 특정 형태로 전송할 수있는 경우.

예:

if (someObject is StringBuilder) ...

같이

as운영자 시도는 특정 유형에 개체를 캐스팅하고, 실패하면 NULL을 반환합니다.

예:

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

관련 항목 :

주조

캐스트 연산자의 시도는 특정 유형에 개체를 캐스팅하고 실패 할 경우 exeption를 throw합니다.

예:

StringBuilder b = (StringBuilder)someObject.

4
이것은 올바르지 않습니다. is개체를 특정 유형으로 캐스팅 할 수 있는지 확인하지 않습니다. 정수는 긴 벌금으로 캐스트되지만 10 is long거짓입니다.
Martin Smith

9
@MartinSmith : 유형 변환과 캐스팅을 혼합하고 있습니다. 정수는 long으로 변환 할 수 있지만 long이 아니기 때문에 long으로 캐스트 할 수 없습니다.
Guffa

2
정수를 long으로 캐스트 할 수 없다고 말하는 건가요? 즉 (long)some_integer실패? 나는 그것을 실행하지 않고서는 그것이 사실이 아니라는 것을 우리 둘 다 알고 있다고 확신하므로 당신이 의미하는 바를 설명하십시오.
Martin Smith

12
@MartinSmith : 여전히 캐스팅과 변환을 혼동하고 있습니다. 정수를 long으로 캐스트하지 않고 정수를 long으로 변환합니다. 동일한 구문을 사용하지만 참조가 캐스트되고 값이 변환됩니다.
Guffa

2
에 대해is " (가) 있습니다 입니다 . 운영자는 참조 변환, 권투 변환 및 언 박싱 변환을 고려 등이 고려되지 않은 사용자 정의 변환과 같은 다른 변환. "(msdn.microsoft.com/en-us/library/scekt9xw .aspx). 정보as " 참고 그 뿐만 .. 운영자만을 수행 기준 전환 널 전환 복싱 전환 같은 대신 캐스트 식을 사용하여 수행되어야하는 사용자 정의 변환과 같은 다른 변환을 수행 할 수 연산자로 "( MSDN .microsoft.com / en-us / library / cscsdfbt.aspx )
user1234567

33

ISAs 의 차이점은 ..

IS -Is 연산자는 지정된 유형을 가진 객체의 호환성을 확인하는 데 사용되며 결과를 부울 (True 또는 False)로 반환합니다.

AS -As 연산자는 객체를 주어진 유형 또는 클래스로 캐스팅하는 데 사용됩니다.

전의.

Student s = obj as Student;

다음과 같습니다.

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

1
동등성은 둘 중 어느 것이 더 원시적이며 우아하게 그들의 관계를 뒷받침하는지 명확하게 보여줍니다! 동등 해 주셔서 감사합니다!
Musa Al-hassy

1
@ MusaAl-hassy 실제로 이것은 더 원시적 인 것을 보여주지 않습니다. is로 표현 될 수 asas함께 표현 될 수있다 is. 여기를 만드는 방법입니다 isas키워드. Bool b = obj is Student; :에 해당 Bool b = (obj as Student) != null; 이에 대한 자세한 여기
알렉스 Telon

8

isas키워드는 모두 C #의 형식 캐스팅에 사용됩니다.

두 키워드의 IL 코드를 살펴보면 쉽게 차이를 알 수 있습니다.

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
}

IL 코드 (위의 C # 코드는 첨부 된 이미지에 있음) :

위의 C # 코드에 대한 IL 코드is키워드 사용을 위한 IL 코드 에는 isinstacastclass.
그러나 as키워드 사용을 위한 IL 코드 에는 isinsta.

위에서 언급 한 사용법에서 is키워드가 사용되는 곳에서는 두 번의 타입 캐스트가 발생하고 키워드가 사용되는 곳에서는 하나의 타입 캐스트 만 발생 as합니다.

참고 : is키워드를 사용하여 일부 조건을 확인하고 typecast 결과에 관심이없는 경우 typecast가 하나만 있습니다.

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

is그리고 as키워드는 필요에 따라 사용됩니다.


6

is 키워드는 왼쪽에있는 값이 오른쪽에있는 유형의 인스턴스인지 확인합니다. 예를 들면 :

if(obj is string)
{
     ...
}

이 경우 obj를 문자열로 가져 오려면 추가 명시 적 캐스트를 사용해야합니다.

as 키워드는 nullable 형식을 캐스팅하는 데 사용됩니다. 지정된 값이 지정된 유형의 인스턴스가 아닌 경우 null이 반환됩니다. 예를 들면 :

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

"as 키워드는 nullable 유형을 캐스팅하는 데 사용됩니다."에 대한 +1
user2330678 2014-07-23

3

나는 말하고 싶다 : MSDN 온라인을 읽으십시오.

is 연산자는 객체가 주어진 유형과 호환되는지 여부를 확인하고 평가 결과는 부울 (true 또는 false)입니다.

as 연산자는 예외를 발생시키지 않습니다.


"as"연산자도 예외를 throw하지 않고 null을 반환합니다.
Pinte Dani

'is'및 'as'관련 오타 수정
Patrick Peters

2

캐스트 인 Is operator는 성공하면 true를 반환합니다. 캐스트가 실패하면 false를 반환합니다. 그것으로 변환 된 변수를 캡처 할 수 없습니다. 이 연산자는 if 문과 표현식에서 유형을 확인할 때 가장 유용합니다. is-cast는 결과 변수가 더 이상 사용되지 않는 경우에만 이상적입니다.

캐스트 그대로입니다. 이를 통해 성능을 얻고 캐스트가 유효하지 않을 때 예외를 피할 수 있습니다. 캐스트가 불가능한 경우 Null이 반환됩니다. 참조 유형의 경우 캐스트가 권장됩니다. 빠르고 안전하며 결과 변수를 null에 대해 테스트 한 다음 사용할 수 있습니다. 이것은 여분의 캐스트를 제거합니다



2

is OPERATOR C #의 is 연산자는 개체 유형을 확인하는 데 사용되며 bool 값을 반환합니다. 개체가 동일한 유형이면 true이고 그렇지 않으면 false입니다. 또는 "is"연산자는 개체의 런타임 유형이 주어진 유형과 호환되는지 여부를 확인하는 데 사용됩니다. null 객체의 경우 false를 반환합니다.

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

운영자로서

as 연산자는 is 연산자와 동일한 작업을 수행하지만 차이점은 bool 대신 해당 형식과 호환되는 경우 개체를 반환하고 그렇지 않으면 null을 반환합니다. 다른 말로 'as'연산자는 호환되는 항목 간의 변환을 수행하는 데 사용됩니다. 유형.

예 :

Type obj = Object as Type;

is over is 연산자의 경우 형변환을 위해 두 단계를 수행해야합니다.

Check the Type using is
If its true then Type cast

실제로 이것은 CLR이 상속 계층 구조를 통과 할 때마다 지정된 유형에 대해 각 기본 유형을 확인하므로 성능에 영향을 미칩니다.

이를 방지하려면 as를 사용하십시오. 한 단계로 수행됩니다. 유형 확인을 위해서만 is 연산자를 사용해야합니다.


이미 많은 유효한 답변이있는 8 년 된 질문에 답변하는 것은 Stack Overflow를 사용하는 가장 좋은 방법이 아닙니다.
Claus Jørgensen

1

As 연산자는 캐스트와 비슷하지만 실패하면 예외 대신 null을 반환합니다.

그리고 Is 연산자는 하나의 객체가 특정 유형과 호환되는지 확인하는 데 사용됩니다. 일반적으로 If 문에서 사용됩니다.


1

is: is 연산자는 객체의 런타임 유형이 주어진 유형과 호환되는지 확인하는 데 사용됩니다.

as: as 연산자는 호환 가능한 유형 간의 변환을 수행하는 데 사용됩니다.

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

2
귀하의 대답은 정확하지만 샘플 코드는 안티 패턴입니다. 그것은 할 비싸고 is다음 as: 그것은 두 배의 박싱. 참조 유형의 경우을 수행 as한 다음 null이 작동하는지 확인해야합니다.
Steven Sudit

1

보다 실증적이고 시각적 인 방법으로 차이점을 설명하는 아래의 YouTube 비디오를 살펴보십시오.

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

아래는 코드 설명과 함께 긴 답변입니다.

"IS"키워드는 객체가 유형과 호환되는지 확인하는 데 유용합니다. 예를 들어 아래 코드에서 "ocust"개체가 "Customer"클래스 유형인지 확인합니다.

object ocust = new Customer();

if (ocust is Customer)
{ 

"AS"키워드는 한 유형에서 다른 유형으로 변환하는 데 도움이됩니다. 예를 들어 아래 코드에서는 객체를 문자열 데이터 유형으로 변환합니다. "AS"키워드가 형변환 할 수 없으면 NULL을 반환합니다.

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

1
MyClass myObject = (MyClass) obj;

vs

MyClass myObject = obj as MyClass;

두 번째는 obj가 MyClass가 아닌 경우 클래스 캐스트 예외를 throw하는 대신 null을 반환합니다.

true 또는 false 만 반환합니다.


1

IS와 AS 모두 Safe Type Casting에 사용됩니다.

IS 키워드->는 주어진 객체의 유형이 새로운 객체 유형과 호환되는지 확인합니다. 예외를 던지지 않습니다. 부울 유형입니다. true 또는 false를 반환합니다.

`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 키워드 : 주어진 개체의 유형이 새 개체 유형과 호환되는지 확인합니다. 주어진 객체가 새로운 객체와 호환되면 null이 아닌 것을 반환하고 그렇지 않으면 null을 반환합니다. 예외가 발생합니다.

`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

두 연산자 모두 안전한 유형 주조에 사용됩니다.

AS 연산자 :

AS 연산자는 주어진 개체의 유형이 새 개체 유형과 호환되는지 여부도 확인합니다. 이 키워드는 주어진 개체의 유형이 새 개체 유형과 호환되는지 여부를 확인합니다. 새로운 것과 호환되지 않으면 NULL을 반환합니다.

IS 운영자 :

이 연산자는 개체의 유형이 새 개체와 호환되는지 여부를 확인합니다. 호환 가능하면 true를 반환하고 그렇지 않으면 false를 반환합니다.


4 년처럼 조금 늦었다 고 생각하지 않습니까?
Soner Gönül 2015 년

오 예 ... 죄송합니다 .... 저는 stackoverflow를 처음 사용하여 조금 종료했습니다 ... 게시 된 날짜를 알아 차리지 못했습니다 ...
Tukaram

기부는 기부입니다! "안전한 형변환"이라는 키워드를 알려 주셔서 감사합니다! :-)
Musa Al-hassy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.