2009-11-11 8 views
2

의 속성을 실수로 수정하는 것을 방지했습니다. 이전에는 알지 못했던 C# 메서드 해결 기능을 발견했습니다. 즉, 내가 setter를 지원하는 인터페이스를 명시 적으로 구현하고 암시 적 인터페이스가 보호 된 세트만을 제공하면 컴파일러는이를 호출 할 때 보호 된 세트를 현명하게 연기합니다. 따라서 자동 구현 된 속성의 편리함을 최대한 활용할 수 있지만 변경하지 않아야하는 클라이언트가 실수로 필드를 수정하는 것을 방지 할 수 있습니다. 예를 들어 명시 적 인터페이스를 사용하여 C#

,
virtual public DateTime CreatedOn { get; protected set; } 
virtual public DateTime? ModifiedOn { get; protected set; } 
#region IHaveUpdateDateFields Members 

DateTime IHaveUpdateDateFields.CreatedOn 
{ 
    get 
    { 
     return this.CreatedOn; 
    } 
    set 
    { 
     this.CreatedOn = value; 
    } 
} 

DateTime? IHaveUpdateDateFields.ModifiedOn 
{ 
    get 
    { 
     return this.ModifiedOn; 
    } 
    set 
    { 
     this.ModifiedOn = value; 
    } 
} 

그런 다음 내 모델 바인딩 코드가 실수로 날짜를 설정하지 않습니다,하지만 내 ORM 이벤트 리스너가 IHaveUpdateDateFields를 구현하고 내 엔티티를 지속 할 때 날짜를 설정 실체를 확인할 수 있습니다. 나는 정의의 행동에 의존

  1. 건가요, 아니면 모든 C# 컴파일러는 방법이 방법으로 해결할 수 있다고 보장하고있다 :

    내 질문은? 저는 C# 표준이 이런 종류의 메서드 결정이 정의되지 않았다고 말하고 싶지 않습니다. 예를 들어 Mono를 빌드 할 때 실수로 엄청난 스택 오버플로가 발생합니다.

  2. 이것을 수행하는 데 더 좋은 (이상적으로 더 간결한) 방법이 있습니까? 컨트롤러에 전달하는 ModelBinder 안전 인터페이스를 가질 수는 있지만 코드를 저장하지 않는 것처럼 보이고 속성의 실수로 인한 수정을 최소화하는 투명성있는 접근 방식을 제공하지 않을 것이라고 생각합니다.

답변

3

완벽하게 정의되어 있습니다. 명시 적 인터페이스 구현은 인터페이스를 사용할 때 우선 순위를 가지며 일반 속성은 그렇지 않으면 얻을 수 있습니다 (get/set 본문 내에서 포함). 이 정돈 ... 내가 제공 할 수있는 최고의 그것이 덜 장황하게 다시 포맷하는 것입니다 만들기에 관해서는

...

DateTime IHaveUpdateDateFields.CreatedOn 
{ 
    get { return CreatedOn; } 
    set { CreatedOn = value; } 
} 

합니다 (this 암시하고 중복 된 것이 주)

안전은 안전함에 불과하며 보증은 아닙니다 ... 외부 발신자는 여전히 인터페이스를 사용할 수 있으며 일반적으로 반사를 사용하여 protected과 같은 단순한 항목으로 건너 뛰거나 입력란을 직접 설정 할 수도 있습니다.

+0

네, 저의 목표입니다 ... 대부분의 OO 구조와 마찬가지로 사기가 아니라 실수를 막기 위해 노력하고 있습니다. protected set idiom은 우리 시스템의 ID에 사용되고, 물론 NHibernate는 리플렉션을 사용하여 작동합니다. – JasonTrue

관련 문제