2010-12-02 2 views
7

왜 C#에 "is not"키워드가 없습니까?

내 생각에 약간 번거롭기 때문에 어떤 것이 좋을까요?

 if(this is not X) 
{ 
    //Do my thing 
} 
+0

'X '가'this.GetType()'의 하위 유형 인 경우 기능적으로 동일하지 않습니다. –

답변

20

다른 사람들도 지적했듯이 is은 객체 클래스가 어떤 클래스로부터 상속 받았는지 또는 약간의 인터페이스를 구현하는지 확인하는 데에도 사용됩니다. 이는 다소 GetType()과 다릅니다.

CodeInChaosStriplingWarrior은 모두 C#에 not 키워드가없는 이유에 대한 합리적인 설명이 있습니다.

+1

'not'키워드를 만들 필요는 없습니다. 'yield returns'와 비슷한 키워드를 만드는 것만으로도 충분할 것입니다. 대부분의 C# 프로그래머는 두 단어 키워드에 익숙하지 않기 때문에 조금 혼란 스러울 수도 있습니다. (또는 내가 keyphrases라고해야합니까?) 따라서 IMO가보기 흉한'isnot'을 사용해야 할 것입니다. – CodesInChaos

+1

"보고 싶습니다!" 명확한 의미를 지니지 만 현재는 합법적이지 않은 C 특수한 경우에 허용됩니다. 하나의 경우는 if, while 등의 경우 괄호 밖일 수 있습니다.(그러한 상황에서는 운영자 과부하에 관계없이 엄격하게 조건을 반전해야합니다). 또 다른 경우는 좋을 수도 있습니다 : 여분의 괄호를 피하기 위해 "this! is is x"를 허용하십시오. – supercat

4

를 사용하여 좋은 똑똑한 '쾅 기호 : 그것은뿐만 아니라 잎 파생 클래스 만의 전체 계층 구조, 인터페이스 및 클래스를 모두 잡는다 때문에

if (!(pero is Human)) 
{ 

} 

BTW, is는 다르다.

그래서

class Human: ICanSpeak, Mamal 
{ 
... 
} 

Human h; 

if (h is Human) { will be true } 
if (h is ICanSpeak) { will be true } 
if (h is Mamal) { will also be true } 
5

참고 그 this.GetType()! = 이것으로부터 유도되는 경우 거짓 (또는 구현하는 인터페이스 타입의 경우)뿐만 X에 동일하지 않은, this is X true를 반환 반면 typeof(X) 복귀한다.

그리고 !(a is X)을 사용할 수있는 이유는 무엇입니까? 그것은 약간의 이득으로 언어를 부 풀리는 것입니다. 에릭 리 퍼트 (Eric Lippert)는 모든 새로운 언어 기능이 코딩, 문서화, 테스트 및 물론 언어의 복잡성 증가를 보상 할 수있는 충분한 이점을 제공해야한다고 강조했습니다. 그리고 not is 운영자는 충분히 제공하지 않습니다. 복잡성을 추가

public static bool IsNot<T>(this object obj) 
{ 
    return !(obj is T); 
} 
+4

객체에 대한 확장 메소드가 의심스러운 프로그래밍 실습이라는 사실 외에도 사실은 거기에 나쁜 확장 메소드가 아닙니다. 나는 그것을 사용하겠다는 말은 아니지만 꽤 합리적이라고 생각합니다. –

+0

@ 에릭 : 저는 C#에 연산자 이외에도 "not"가 있었으면 좋겠다고 생각했습니다. 이것은 쓸모가 없다고 말할 수도 있지만! "if (vector.IsNormalized)"가 "if! (vector.IsNormalized)"보다 시각적으로 파싱하기가 훨씬 쉽지만 코드에서 C#을 사용하면 C++ 사람들을 멀리하지 못하게 할 수 있습니다. , 권리? –

+2

@ Eric, 왜 객체 확장 방법이 나쁜 습관으로 여겨지는지 물어봐도 될까요? – dexter

9

는 언어에 키워드를 추가 :

당신은 확장 메서드를 구현할 수 있습니다,하지만 난 그 바보 같아요. 초기 지정 후 언어에 키워드를 추가하면 업그레이드하는 사람들에게 변경 사항이 적용될 수 있습니다. 키워드는 일반적으로 키워드가 매우 중요한 경우에만 추가됩니다.

if (!(pero is Human)) ... 

... 일반적인 C#을 (/ C/C++/자바) 개발자가 "그렇지 않으면 읽을 것 (: 다른 답변 지적이 경우, 강타 연산자를 사용하는 것은 매우 간단합니다 페로는 인간이다). " 따라서 특수 키워드에 대한 정당성은 그다지 높지 않습니다.

+1

예를 들어, C#에는'yield' 키워드가 없습니다. 반면에'yield return x'는 이전에 불법적 인 문법 이었기 때문에 변화가 없습니다. – CodesInChaos

+1

@CodeInChaos : 그렇습니다. 그러나'is not' 키워드는 기술적으로'yield return'과 같은 범주에 속할 수 있습니다. 차이점은 'yield return'을 에뮬레이션하는 데 많은 작업이 필요하지만 'bang 연산자'와 '괄호'는 'is not'를 에뮬레이트하기에 충분하다는 것입니다. – StriplingWarrior

+0

'isnot' 연산자 (공백 없음)는 구현하기가 매우 쉽고 안전하다고 믿습니다. 확실히 C# 구문의 일부가되도록 투표 할 것입니다. 코딩을하는 동안 여러 번 그렇게 거의 썼습니다. 매우 자연 스럽습니다. 그것은 또한 인텔리 센스 (intellisense)를 가지며, 대괄호와 부정 연산자의 타이핑을 모두 줄여줍니다. 요컨대 그것은 편리했을 것입니다. – GDS

관련 문제