is와 as 키워드의 차이점


121

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


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

IS 와 As 의 차이점은 ..

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로 표현 될 수 as와 as함께 표현 될 수있다 is. 여기를 만드는 방법입니다 is와 as키워드. Bool b = obj is Student; :에 해당 Bool b = (obj as Student) != null; 이에 대한 자세한 여기
— 알렉스 Telon

8

is및 as키워드는 모두 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 코드 에는 isinsta및 castclass.
그러나 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 it’s 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.