2010-08-03 2 views
4

내부 패턴을 생성하여 계약 패턴을 구성합니다. 개발자는이를 사용하는 갈 때같음 및 참조 동일 않음 숨기기

using System; 
using System.Runtime.Serialization; 

namespace DCS2000.Common35.Core 
{ 
    public class Assertion 
    { 
    public static void Ensure(bool test) 
    { 
     if (!test) 
     { 
      throw new PreconditionException("Precondition test failed"); 
     } 
    } 

    public static void Ensure(object obj) 
    { 
     if (obj == null) 
     { 
      throw new PreconditionException("Precondition null object failed"); 
     } 
    } 

    public static void Require(bool test) 
    { 
     if (!test) 
     { 
      throw new PostconditionException("Postcondition test failed"); 
     } 
    } 

    public static void Require(object obj) 
    { 
     if (obj == null) 
     { 
      throw new PostconditionException("Postcondition null object failed"); 
     } 
    } 
    } 
} 

그들은 인텔리에 옵션으로이 표시됩니다

  • 이는

입니다 필요

  • ReferenceEquals 같음 확인 혼란스럽고 나는 Equals 및 ReferenceEquals를 숨기는 방법.

    참고 : 이미 이것을 시도했다, 그러나 그것은 나를 위해 작동하지 않았다

    [EditorBrowsable(EditorBrowsableState.Never)] 
        public override bool Equals(object obj) 
        { 
         return base.Equals(obj); 
        } 
    
  • 답변

    2

    사용 :

    [EditorBrowsable(EditorBrowsableState.Never)] 
        public override bool Equals(object obj) 
        { 
         throw new Exception("Assertion does not implement Equals, use Ensure or Require"); 
        } 
    
        [EditorBrowsable(EditorBrowsableState.Never)] 
        public new bool ReferenceEquals(object objA, object objB) 
        { 
         throw new Exception("Assertion does not implement ReferenceEquals, use Ensure or Require"); 
        } 
    

    이 슬프게도 실행 시간 동안, 그들은 부적절 같음 또는 ReferenceEquals를 사용하는 개발자,해야, 개발자가 설정 설정 VS 적절한 경우 멤버를 숨 깁니다, 즉시 통지합니다 실수로 코드베이스에서 사용합니다.

    +0

    이것은 아름답게 작동합니다! 고맙습니다. 유창한 인터페이스를 사용하는 경우 가장 일반적으로 사용되는 객체에서 사용하지 않는 메소드를 찾는 것이 매우 유용하다는 것을 알게되었습니다. – smdrager

    -2

    는 솔직히 말해서, 내가 생각 .NET 개발자가 주위 방법을 데 사용되어야 자신을 호출하는 사람과 필요하지 않을 때 그들을 무시.

    정말로 숨기고 싶다면 두 가지 모두를 무시할 수 있다면 (ReferenceEquals은 사용하지 않았기 때문에 잊어 버린다) private override으로 무시할 수 있습니다.

    그래, 작동하지 않습니다. 이제 내가 보니 private override은 의미가 없습니다. protected override도 허용되지 않으며 private newprotected new은 기본 클래스 메서드에 계속 액세스 할 수 있지만 새 메서드를 만듭니다. 나는 당신이 접근 수정 자 (access modifiers)로 그들을 숨길 수 있다고 생각하지 않는다.

    그리고 모든 것이 정적 인 방법에 관한 것으로 보입니다. 이런, 나는 정말로 이것을 실패했다.

    +0

    개인 재정의? 나는 너를 맹세 할 수 있었다 *은 오버라이드에 보호 수준을 바꿀 수 없다. –

    +1

    'private new ...' –

    +0

    @Kirk : 정말요? C++을 생각하고 있었습니까? 확인해 보겠습니다. –

    4

    Matti의 답변에 EditorBrowsableState.Never을 추가하려면 옵션, 텍스트 편집기, C#, 일반에있는 사용자의 Visual Studio 설정에 따라 달라집니다.

    사용자가 '고급 구성원 숨기기'를 설정 한 경우에만 적용됩니다. Visual Studio는 기본적으로 모든 구성원을 표시합니다.

    +0

    그리고 이것을 사용하는 어셈블리를 솔루션에로드 할 수 없습니다 - 컴파일 된 DLL을 참조해야합니다. – smdrager