C #에서 "As"키워드의 요점은 무엇입니까?
문서에서 :
as 연산자는 예외를 발생시키는 대신 변환 실패시 null을 생성한다는 점을 제외하면 캐스트와 같습니다. 보다 공식적으로 다음과 같은 형식의 표현입니다.
expression as type
다음과 같습니다.
expression is type ? (type)expression : (type) null
식이 한 번만 평가된다는 점을 제외하고.
그러니 왜 당신은 어떤 방식 으로든 선택하지 않겠습니까? 왜 두 가지 주조 시스템이 있습니까?
그들은 두 가지 캐스팅 시스템이 아닙니다. 두 사람의 행동은 비슷하지만 의미는 매우 다릅니다. "as"는 "이 개체 가 실제로 다른 유형일 수 있다고 생각합니다 . 그렇지 않은 경우 null을 제공합니다."를 의미합니다. 캐스트는 다음 두 가지 중 하나를 의미합니다.
나는이 물체가 실제로 다른 유형이라는 것을 확실히 알고 있습니다. 그렇게하고 내가 틀렸다면 프로그램을 중단하십시오.
이 객체가 다른 유형이 아니라는 것을 확실히 알고 있지만 현재 유형의 값을 원하는 유형으로 변환하는 잘 알려진 방법이 있습니다. (예를 들어, int를 short로 캐스팅합니다.) 그렇게 만들고 변환이 실제로 작동하지 않으면 프로그램을 중단합니다.
자세한 내용은 주제에 대한 내 기사를 참조하십시오.
때로는 예상 한대로 캐스트 할 수없는 경우 작업이 실패하기를 원하고, 다른 경우에는 상관하지 않고 캐스트 할 수없는 경우 주어진 객체를 버리고 싶기 때문입니다.
기본적으로 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
'Development Tip' 카테고리의 다른 글
POM의 Maven 업데이트 종속성 (0) | 2021.01.07 |
---|---|
"bool"과 "bool"의 차이점은 무엇입니까? (0) | 2021.01.06 |
생성기 rspec : install을 찾을 수 없습니다. (0) | 2021.01.06 |
Ruby on Rails 애플리케이션 이름을 변경하는 방법은 무엇입니까? (0) | 2021.01.06 |
Gradle로 제품 버전 서명 (0) | 2021.01.06 |