2013-08-15 4 views
4

나는이 인터페이스를 가지고 :캐스팅하는 적절한 방법은 무엇입니까?

public interface IEntity 
{ 
    int Id{get;set;} 
} 

클래스 :

public class Customer: IEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

이 내 사용이다 : 라인 # 1, 라인 # 2 : 가장 좋은 방법으로 간주됩니다

void Main() 
{ 
    List<Customer> list = new List<Customer>(); 
    IEntity obj = null; 
    obj = new Customer() {Id = 4, Name="Jenny", Age =41}; 
    list.Add(obj as Customer); /*Line #1*/  
    list.Add((Customer)obj); /*Line #2*/   
} 

?

+2

두 가지 모두 허용됩니다. 물체가 100 %라는 것을 알고 있다면() T를 사용할 수 있습니다. 당신이 확실하지 않은 경우 T로 사용하고 NULL을 확인하십시오. 그러므로, 그것은 내가 생각하는 맥락에 달려있다. 부수적 인 메모. 검색을 수행했다면 Stack Overflow에 대한 답을 찾을 수있을 것이라고 확신합니다. – dreza

+0

코드 이해에 대한 질문은 SR에 관한 주제와 관련이 없습니다. 귀하의 두 번째 질문은 유효하지만 :) –

+0

나는 이것이 좋은 질문이라고 생각합니다. 나는 주제의 맥락을 주제로 바꾼다. –

답변

12

캐스트 연산자는 대상을 대상 유형으로 캐스트 할 수없는 경우 예외 (InvalidCastException)를 발생시킵니다. as 연산자는 캐스트를 완료 할 수없는 경우 결과 변수를 null으로 설정합니다.

3

당신의 사용 예제는 아마도 다소 단순화되어 있습니다 만, 나는 당신이 실생활에서 그런 것을해야한다면, 가치있는 것이라고 생각합니다. 그러면 당신은 아마 disign 문제가있을 것입니다. 실제 구현에 대한 인터페이스를 구현하는 것은 나쁜 습관이며 가능한 한 많이 피하는 것이 좋습니다 (종종 가능할 수도 있음).

절대적으로 캐스팅해야하는 경우 : 귀하의 경우에는 () 연산자를 사용해야합니다. 로직에 오류가있는 경우 as을 사용하면이 코드가 숨겨져 나중에 NullReferenceException이 표시되어 잘못된 캐스팅보다 추적하기가 더 어렵습니다.

+0

+1. "실제 구현에 대한 인터페이스의 캐스팅"- 코드의 거의 모든 부분에서 코드의 냄새가납니다. 그리고 특히 인스턴스화와 목록 작성에 불법적 인 일이 발생했습니다. 이것은 a) 디자인 또는 b) 참조의 유형이 객체 유형의 수퍼 유형 일 때 어떻게 작동하는지 이해하는 문제를 제시합니다. – radarbob

0

자신이하는 일을 알고있을 때만 캐스트해야합니다. 노골적인 캐스트를 사용하면»안녕하세요! 나는 Object의 타입이 x임을 알지만, 실제로 y입니다. 그래서 변형은 아무런 해를 입히지 않을 것입니다«. 따라서 나는 눈이 더 쉽기 때문에 as에 투표 할 것입니다. C#은 시끄러운 얼버무 리는 언어입니다.

브래킷과 함께 전통적인 캐스트 연산자를 사용하여 추측이 잘못되었을 때 예외를 던지면 - 실제로 그렇게 알지 못한다면, 실제로 알지도 못했지만, 무엇을하고 있었는지 말하는 것 같은 느낌이 들지 않습니다.»안녕하세요 보이, 알아요. 내가하고있는 일은 ... 오 ... 하하하, 나는 단지 꼬마 야. "

캐스팅을 원할 때 은 남성처럼!

관련 문제