캡슐화는 객체의 상태가 정의 된 인터페이스를 통해서만 발생한다는 것을 의미하며, 이로 인해 클래스는이 상태가 항상 유효하고 클래스의 목적에 부합하는지 확인할 수 있습니다.
따라서 어떤 경우에는 필드를 공개적으로 노출하는 것만으로 캡슐화 원칙을 완벽하게 준수합니다. 필드에 대해 가능한 모든 값은 다른 모든 필드의 가능한 다른 모든 값과 함께 유효하므로 프로그래머는 필드를 허용하도록 적극적으로 결정할 수 있습니다. 외부 코드에 의해 자유롭게 조작 될 수 있습니다.
이러한 경우는 대부분 "일반 오래된 데이터"인 클래스로 제한됩니다. 그들은 또한 이와 관련하여별로 흥미롭지 않으므로 충분합니다.
다른 경우, 다른 언어에서는 int getId()값을 얻고 void setId(int val)업데이트 하는 것과 같은 getter 및 setter 메소드가 있습니다.
속성을 사용하면 필드를 읽고 쓰는 데 사용하는 것과 같은 메서드를 통해 읽고 쓰는 데 동일한 구문을 사용할 수 있습니다. 이것은 필수는 아니지만 좋은 구문상의 설탕입니다.
(사실 리플렉션이 작동하는 방식과 DataBinder.Eval필드가 잘 작동하는 경우에도 속성을 갖는 것이 편리 할 수 있기 때문에 이는 또 다른 문제입니다).
private setter가 도입 될 때까지 (실제로 C # 2에서 변경된 것은 동일한 블록에 private setter와 public 또는 protected getter를 갖는 구문입니다) private setter의 작업을 수행하는 private 메서드를 가질 수있었습니다. 개인 세터는 실제로 필요하지 않습니다. 그래도 편리하기 때문에 구문 상 설탕이지만 꽤 유용합니다.
캡슐화는 setter (또는 getter)가 공개, 비공개, 보호 또는 내부인지 여부가 아니라 적절한 지 여부의 문제입니다 . 모든 필드의 기본값으로 시작하여 (그리고 해당 문제에 대해 readonly) 필요에 따라 해당 필드를 변경하는 멤버 (속성 또는 메서드)를 추가하고 변경시 개체가 유효한지 확인합니다 . 이렇게하면 클래스의 불변성 이 유지됩니다. 즉, 해당 클래스 가있을 수있는 유효한 상태 집합을 설명하는 규칙이 깨지지 않습니다 (생성자는 이러한 유효한 상태에서 시작하도록하여 도움을줍니다).
마지막 질문에 대해 불변이라는 것은 클래스에 공개, 보호 또는 내부 setter 가 없으며 필드를 변경하는 공개, 보호 또는 내부 메서드가 없음을 의미합니다. 이 정도의 정도가 있으며 C #에서는 세 가지 정도가 가능합니다.
클래스의 모든 인스턴스 필드는 readonly이므로 개인 코드도 변경할 수 없습니다. 불변임이 보장되며 (변경하려는 모든 것은 컴파일되지 않음) 아마도 최적화는 이것의 뒷면에서 수행 될 수 있습니다.
public 멤버가 아무것도 변경하지 않기 때문에 클래스는 외부에서 변경할 수 없지만을 사용 readonly하여 내부에서 변경되지 않는다는 보장은 없습니다.
일부 상태는 구현 세부 사항으로 변경되지만 클래스는 외부에서 볼 때 변경할 수 없습니다. 예를 들어 필드를 메모 할 수 있으므로 외부에서 가져 오려는 시도는 동일한 값을 가져 오지만 첫 번째 시도는 실제로이를 계산 한 다음 후속 시도에서 검색을 위해 저장합니다.
private File settingsFile = null;다음과 같이 상수가 아닌 인스턴스 변수를 한 번에 선언하고 설정할 수 없습니다. 다음 생성자 중 하나에서 :if (settingsFile == null) { settingsFile = GetSettingsFile() };. 그런 코드를 리팩토링하면 가끔 울었습니다. :). 생성자 앞에 멤버를 설정할 수 있다고해서 생성자가 여러 개인 경우 논리를 따르기가 어렵 기 때문에 그렇게해야한다는 의미는 아닙니다. private setter는 생성자 내부 또는 이후에 값을 설정하도록합니다.