2011-02-09 2 views
18

C#에서는 정적 멤버에 인스턴스 멤버로 액세스 할 수 없도록되어 기쁩니다. 그것은 당신이 파생 된 형식 '을 통해'정적 멤버에 액세스 할 수 않습니다, 다른 한편으로상속 된 유형을 통해 정적 멤버에 액세스하는 것이 유용한 이유는 무엇입니까?

Thread t = new Thread(..); 
t.sleep(..); //Probably doesn't do what the programmer intended. 

: 이것은 자바의 일반적인 버그를 방지 할 수 있습니다. 운영자 (캐스트 작성에서 당신을 구하는 곳) 이외에, 이것이 실제로 도움이되는 어떤 경우도 생각할 수 없습니다. 사실, 적극적으로 같은 실수를 장려 :

// Nasty surprises ahead - won't throw; does something unintended: 
// Creates a HttpWebRequest instead. 
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com"); 

// Something seriously wrong here. 
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2); 
나는 개인적으로 내가 익숙하지 않은 API를 (I 표현 나무로 떨어져 시작하는 기억을 통해 자신의 길을 찾고 있어요 때 반복 유사한 오류를 범 유지

, 나는 편집기에서 BinaryExpression. 충돌 왜 지구상에서 IntelliSense가 옵션으로 MakeUnary을 제공하고 있는지 궁금해하고있었습니다.) 내 (근시)의 의견으로

,이 기능 :

  1. 상세 감소하지 않는다; 프로그래머는 어떤 식 으로든 type-name을 지정해야합니다 (현재 형식의 상속 정적 멤버에 액세스 할 때 연산자와 사례 제외).
  2. 위와 같은 버그/오도 된 코드를 권장합니다.
  3. 프로그래머에게 C#의 정적 메서드가 일종의 '다형성'을 제시한다고 제안 할 수도 있습니다.
  4. (보조) 재 컴파일시 의도하지 않은 리 바인딩 가능성을 '자동'으로 도입합니다.

(IMO, 사업자가 자신의 토론을 보증 특별한 경우이다.)

C#을 일반적으로 언어는 "성공의 구덩이"는 것을 감안할 때, 왜이 기능이 존재 하는가? 나는 (IDE에서 항상 해결할 수있는 '발견 가능성'을 제외하고) 그 이점을 볼 수는 없지만 많은 문제점을 보았다.

+3

또는 더 나쁜 경우 'UTF8Encoding.ASCII'. – SLaks

+1

약간 혼동을 줄 수 있다는 것에 동의하지만 * 상속 된 멤버가 파생 된 유형 *의 멤버로 취급된다는 원칙과 일치합니다.우리가 명시 적으로 * 제한된 유형의 매개 변수에 대해이 패턴을 허용하지는 않는다는 점에 유의하십시오. 그 이유는 실제로 잠재적으로 오도 된 것일 수 있기 때문입니다. 자세한 내용은 http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx 을 참조하십시오. –

답변

7

본인은 잘못된 것임에 동의합니다.

ASCIIEncoding.ASCII 

등 ... 실행의 측면에서 무해한 동안 코드를 읽기의 측면에서 오해의 소지가되는 : 나는 스택 오버플로 사람의 코드를 게시 빈도를 알 수 없습니다.

분명히이 "기능"을 제거하기에는 너무 늦었습니다. C# 팀이이 문제와 다른 스타일 문제에 대해 매우 자세한 경고 모드를 도입 할 수 있다고 생각합니다.

아마 C#의 후임은 ...

+0

사실, 나는 단지 한 번 (http://stackoverflow.com/questions/4252426/webclient-unicode-which-utf8)을 보았다. – SLaks

+0

StyleCop이이를 잡으려고 할 수 있습니다. – SLaks

+3

@SLaks와 마찬가지로,'UTF8Encoding.ASCII'가 더 악합니다. – digEmAll

2

이 윈폼에 유용 물건이 향상됩니다.

모든 컨트롤 또는 양식에

, 당신은 MousePosition, MouseButtons, 또는 ModifierKeysstatic 회원 Control에서 상속 사용하여 작성할 수 있습니다.

좋은 결정인지는 여전히 논쟁의 여지가 있습니다.

+1

클래스를 작성하는 암시 적 컨텍스트를 통해 "상속 된"정적 멤버에 대한 액세스 권한을 가질 수는 있지만 클래스 이름에 액세스 할 수는 없습니다 * 오른쪽 이외에. –

+0

참. 내가 그 용도를 생각할 수 있을지 확신 할 수 없다. – SLaks

+0

나는 Jon과 동의한다.이 두 가지는 다소 직각이다. 침묵하는 리바 인딩 문제는 여전히 있지만, WinForms에서 사소하게 발생하지는 않습니다. – Ani

관련 문제