문제

C#에서는 다른 언어보다 간단한 방식으로 게터/세터를 만들 수 있습니다.

public int FooBar { get; set; }

이것은 외부 속성 'foobar'와 함께 직접 해결할 수없는 내부 개인 변수를 생성합니다.

내 질문은 - 이것을 얼마나 자주 학대하는 것을 보십니까? 캡슐화 베스트 팩터를 자주 위반할 수있는 잠재력이 높은 것 같습니다. 내가 잘못 이해하지 말고, 읽기 전용 쓰기 전용 유형의 속성을 위해 적절하고 부분적으로 변형을 사용하지만 코드 기반의 다른 저자로부터의 불쾌한 경험은 무엇입니까?

설명 : 남용의 의도 된 정의는 개인 변수가 적절할 때 실제로 그러한 속성을 창출하는 것입니다.

도움이 되었습니까?

해결책

나는 그것이 학대를 보았다 (내 의견으로는). 특히 개발자가 할 때 보통 쓰다:

private readonly int foo;
public int Foo
{ 
    get 
    { 
        return foo;
    }
}

그들은 때때로 쓸 것입니다 :

public int Foo { get; private set; }

예, 더 짧습니다. 예, 클래스 외부에서는 동일한 모양을 가지고 있습니다. 그러나 후자의 형태는 동일한 클래스의 다른 곳에 속성을 설정할 수 있기 때문에 이것을 같은 것으로 보지 않습니다. 또한 속성이 생성자에 설정되지 않은 경우 경고가 없으며 CLR의 필드가 읽기가 아닙니다. 이것들은 미묘한 차이이지만, 두 번째 형태는 더 간단하고 차이를 무시하는 것은 미미하더라도 나에게 남용처럼 느껴지 기 때문에 단지 두 번째 형태로가는 것입니다.

다행히도 이것은 C# 6 기준으로 제공됩니다.

// Foo can only be set in the constructor, which corresponds to a direct field set
public int Foo { get; }

다른 팁

단순히 필드를 수동으로 쓰지 않는 경우에는 "남용"이 없습니다. 그리고 어쨌든 부동산을 통해 모든 접근을 장려하는 것이 좋습니다.

내가 아는 가장 큰 문제는 이진 직렬화, 버전과 호환되지 않으면 서 일반 필드로 다시 변경하는 것이 약간 까다로워 지지만 ... 다른 시리얼 라이저를 사용하십시오; P를 사용하십시오.

"적절한"readonly 변형이 있었다면 좋을 것입니다. :this() 구조에 대한 CTOR- 사슬이지만 .... Meh!

나는 그것의 학대를 보지 못했습니다. 그리고 솔직히 말해서, 나는이 구문이 어떻게 남용 될 수 있는지 알 수 없기 때문에 당신이 의미하는 바를 실제로 보지 못합니다.

캡슐화와 관련하여 자동 속성이 일반 속성보다 나쁘다고 생각하지 않습니다.

일부 개발자가 개인 필드 대신 공공 자동 속성을 사용한다는 것을 의미한다면 이것은 물론 잘못되고 캡슐화를 중단합니다 ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top