as & is 키워드

as와 is

  • 형변환을 위한 예약어
  • 개발자에 의해서 의도적으로 downcasting하도록 도와주는 연산자
  • downcasting
    • 베이스 클래스가 파생 클래스로 캐스팅 되는 것
  • upcasting
    • 파생 클래스가 베이스 클래스로 캐스팅 되는 것
is as
* 형변환 여부를 bool 값으로 반환
* as로 직접 형변환을 시도하기 보다 is를 사용해 형변환 가능 여부를 먼저 사용
* 형변환이 가능하면 수행
* 불가능한 경우에는 null 반환
* 형변환에 대해 안정성을 지향
public class Parent
{
  // ...
}

public class Derived : Parent
{
  // ...
}

static void Main()
{
  Parent p1 = new Parent();
  Parent p2 = new Derived();

  // is를 이용해 형변환 가능 여부를 확인
  if (p1 is Derived)
  {
    // false
  }
  if (p2 is Derived)
  {
    // true
  }

  // as를 이용해 형변환
  Parent d1 = p1 as Derived();
  Derived d2 = p2 as Derived();
  
  if (d1 != null)
  {
    // false
  }
  if (d2 != null)
  {
    // true
  }
}

null checking

if (input is null)
{
    return;
}

if (result is not null)
{
    Console.WriteLine(result.ToString());
}
  • is는 null인지 여부를 확인할 때 쓸 수도 있다
    • C# 9.0부터 negation pattern도 확인 가능
int[] empty = { };
int[] one = { 1 };
int[] odd = { 1, 3, 5 };
int[] even = { 2, 4, 6 };
int[] fib = { 1, 1, 2, 3, 5 };

Console.WriteLine(odd is [1, _, 2, ..]);   // false
Console.WriteLine(fib is [1, _, 2, ..]);   // true
Console.WriteLine(fib is [_, 1, 2, 3, ..]);     // true
Console.WriteLine(fib is [.., 1, 2, 3, _ ]);     // true
Console.WriteLine(even is [2, _, 6]);     // true
Console.WriteLine(even is [2, .., 6]);    // true
Console.WriteLine(odd is [.., 3, 5]); // true
Console.WriteLine(even is [.., 3, 5]); // false
Console.WriteLine(fib is [.., 3, 5]); // true
  • C# 11부터는 list 패턴을 확인하는 키워드로도 사용한다
    • 별 걸 다 지원한다

출처

Categories: ,

Updated: