C #에서 다음 코드는 유효합니다
interface I{
int property{get;set;}
}
나에게는 말이되지 않습니다. 이것은 인터페이스의 가장 중요한 원칙 중 하나 인 상태 부족 (즉, 필드 없음)을 위반하는 것 같습니다. 속성이 암시 적 개인 필드를 작성하지 않습니까? 인터페이스에 그렇게 나쁘지 않습니까?
C #에서 다음 코드는 유효합니다
interface I{
int property{get;set;}
}
나에게는 말이되지 않습니다. 이것은 인터페이스의 가장 중요한 원칙 중 하나 인 상태 부족 (즉, 필드 없음)을 위반하는 것 같습니다. 속성이 암시 적 개인 필드를 작성하지 않습니까? 인터페이스에 그렇게 나쁘지 않습니까?
답변:
혼란스러운 부분은 int Property { get; set; }
클래스 내부에 글을 쓰면 암시 적 뒷받침 필드가있는 자동 속성이라는 것입니다.
그러나 인터페이스에 정확히 같은 것을 쓰면 자동 속성이 아니며 속성이 인터페이스의 일부이며 인터페이스를 구현하는 모든 유형이 해당 속성을 자동 속성으로 포함해야 함을 선언합니다. )이지만 지원 입력란을 만들지는 않습니다.
차이점을 보는 한 가지 방법은 쓰는 것입니다 int Property { get; }
. 인터페이스에서 유효하며 게터 만 있지만 세터는없는 속성을 선언합니다. 그러나 자동 속성에는 setter가 있어야하기 때문에 C # 6.0을 사용하지 않는 한 클래스에서 컴파일되지 않습니다.
당신이 보여준대로 속성을 정의하는 방법을 정의하는 것과 동일 int GetProperty()
하고 void SetProperty(int i)
. C #에서는 속성이 강력합니다.
C #에서 속성은 암시 적으로 개인 필드를 만들지 않습니다. auto-property
예를 들어, 기본 구현입니다. public string MyString { get; set;}
그러나 get
메서드 에서 사용자 지정 논리를 정의하는 속성 은 암시 적 개인 필드를 생성하지 않습니다.
마지막으로, 인터페이스가 퍼블릭 API 와 관련되어 있으므로 인터페이스 속성의 구현이 개인 필드에 의존하는 경우 (암시 적 또는 다른 방식) 무엇이 중요할까요? 그것은 인터페이스의 소비자들과 상관없이 숨겨져 있습니다.
속성 은 방법입니다! 인터페이스 를 구현 하는 백킹 필드가 클래스에 추가됩니다 (수동 또는 자동 속성을 통해).