Development Tip

C #에서 "As"키워드의 요점은 무엇입니까?

yourdevel 2021. 1. 6. 20:32
반응형

C #에서 "As"키워드의 요점은 무엇입니까?


문서에서 :

as 연산자는 예외를 발생시키는 대신 변환 실패시 null을 생성한다는 점을 제외하면 캐스트와 같습니다. 보다 공식적으로 다음과 같은 형식의 표현입니다.

   expression as type

다음과 같습니다.

  expression is type ? (type)expression : (type) null

식이 한 번만 평가된다는 점을 제외하고.

그러니 왜 당신은 어떤 방식 으로든 선택하지 않겠습니까? 왜 두 가지 주조 시스템이 있습니까?


그들은 두 가지 캐스팅 시스템이 아닙니다. 두 사람의 행동은 비슷하지만 의미는 매우 다릅니다. "as"는 "이 개체 실제로 다른 유형일 있다고 생각합니다 . 그렇지 않은 경우 null을 제공합니다."를 의미합니다. 캐스트는 다음 두 가지 중 하나를 의미합니다.

  • 나는이 물체가 실제로 다른 유형이라는 것을 확실히 알고 있습니다. 그렇게하고 내가 틀렸다면 프로그램을 중단하십시오.

  • 이 객체가 다른 유형이 아니라는 것을 확실히 알고 있지만 현재 유형의 값을 원하는 유형으로 변환하는 잘 알려진 방법이 있습니다. (예를 들어, int를 short로 캐스팅합니다.) 그렇게 만들고 변환이 실제로 작동하지 않으면 프로그램을 중단합니다.

자세한 내용은 주제에 대한 내 기사를 참조하십시오.

http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx


때로는 예상 한대로 캐스트 할 수없는 경우 작업이 실패하기를 원하고, 다른 경우에는 상관하지 않고 캐스트 할 수없는 경우 주어진 객체를 버리고 싶기 때문입니다.

기본적으로 try 블록에 래핑 된 일반 캐스트의 더 빠른 버전입니다. 그러나 As훨씬 더 읽기 쉽고 타이핑도 절약됩니다.


효율성 및 성능

캐스트 수행의 일부는 통합 된 유형 검사입니다. 따라서 실제 캐스트 앞에 명시적인 유형 검사를 붙이는 것은 중복됩니다 (유형 검사는 두 번 발생). as키워드를 사용 하면 하나의 유형 검사 만 수행됩니다. "하지만 두 번째 유형 검사 대신 널 검사를 수행해야합니다"라고 생각할 수 있지만 널 검사는 유형 검사에 비해 매우 효율적이고 성능이 뛰어납니다.

if (x is SomeType )
{
  SomeType y = (SomeType )x;
  // Do something
}

2x 검사를하는 반면

SomeType y = x as SomeType;
if (y != null)
{
  // Do something
}

make 1x-null 검사는 유형 검사에 비해 매우 저렴합니다.


이는 메시지 기반 상속 트리를 처리하는 데 필요할 수있는 try / cast 오버 헤드없이 빠른 검사를 허용합니다.

나는 그것을 꽤 많이 사용합니다 (메시지를 받고 특정 하위 유형에 반응). Try / cast wouuld는 상당히 느립니다 (전달되는 모든 메시지에서 많은 try / catch 프레임). 여기서는 초당 200.000 개의 메시지를 처리하는 것에 대해 이야기합니다.


나는 일반적으로 코드의 의미에 따라 하나 또는 다른 것을 선택합니다.

예를 들어, 당신이있는 경우에 object당신은이 있어야한다는 알고 string후 사용 (string)이 표현하는 코드를 작성하는 사람이 객체가이 있는지이라고 때문에 string그것이 아니라면 우리는 이미 런타임 캐스트 예외가있는 것보다 더 큰 문제가보다 던져진다.

사용 as은하지 않도록 객체가 특정 유형의 것이어야하지만이 경우에 대한 논리를 갖고 싶어합니다. is연산자 뒤에 캐스트를 사용할 수 있지만 as연산자가 더 효율적입니다.


둘 다 사용하는 실제 시나리오를 보여 드리겠습니다.

public class Foo
{
  private int m_Member;

  public override bool Equals(object obj)
  {
    // We use 'as' because we are not certain of the type.
    var that = obj as Foo;
    if (that != null)
    {
      return this.m_Member == that.m_Member;
    }
    return false;   
  }
}

과...

public class Program
{
  public static void Main()
  {
    var form = new Form();
    form.Load += Form_Load;
    Application.Run(form);
  }

  private static void Form_Load(object sender, EventArgs args)
  {
    // We use an explicit cast here because we are certain of the type
    // and we want an exception to be thrown if someone attempts to use
    // this method in context where sender is not a Form.
    var form = (Form)sender;

  }
}

아마도 예가 도움이 될 것입니다.

// Regular casting
Class1 x = new Class1();
Class2 y = (Class2)x; // Throws exception if x doesn't implement or derive from Class2

// Casting with as
Class2 y = x as Class2; // Sets y to null if it can't be casted.  Does not work with int to short, for example.

if (y != null)
{
  // We can use y
}

// Casting but checking before.
// Only works when boxing/unboxing or casting to base classes/interfaces
if (x is Class2)
{
  y = (Class2)x; // Won't fail since we already checked it
  // Use y
}

// Casting with try/catch
// Works with int to short, for example.  Same as "as"
try
{
  y = (Class2)x;
  // Use y
}
catch (InvalidCastException ex)
{
  // Failed cast
}

참조 URL : https://stackoverflow.com/questions/3160127/whats-the-point-of-as-keyword-in-c-sharp

반응형