2016-12-19 2 views
3

가 가끔과 같이 읽기 전용 멤버로 정의 된 클래스를 참조 읽기 전용 특성 :읽기 전용 필드 대

class Foo 
{ 
    public Foo(string bar) 
    { 
     Bar = bar; 
    } 

    public string Bar { get; private set; } 
} 

두 번째 예 :

class Foo 
{ 
    private readonly string bar; 

    public Foo(string bar) 
    { 
     this.bar = bar; 
    } 

    public string Bar => bar; 
} 

나는과 같이 읽기 전용 멤버로 정의 된 클래스를 참조하십시오 다른 시간 더 읽기 쉽거나 간결하게 보입니다.하지만 첫 번째 예제에 따라 readonly 뒷받침 필드를 명시 적으로 정의하는 합법적 인 이유가 있는지 궁금합니다.

CLR에서 두 가지 사례에 대한 심층적 인 분석을 통해 이상적인 내용을 다루고 있습니다.

+14

실제로 두 번째 버전은 매우 다릅니다. 동등한 버전은'public string Bar {get;}'일 것입니다. 당신이'public string Bar {get; 개인 집합; }'는 읽기 전용이 아니며 공개적으로 설정할 수 없습니다. –

+0

Scott, 귀하의 의견은 답변이어야합니다. 선생님. – Trey

+0

첫 번째 예가 나를 위해 컴파일되지 않습니다. – user1620220

답변

9

첫 번째는 게터는 모든 속성을의

class Foo 
{ 
    private readonly string bar; 
    public Foo(string bar) 
    { 
     this.bar = bar; 
    } 
    public string get_Bar() { return this.bar; } 
} 

를 작성하는 간단한 방법입니다; 그것은 getter 함수를 작성하는 짧은 방법 일뿐입니다.

두 번째는 어디에서 다시

class Foo 
{ 
    private string __bar; 
    public Foo(string bar) 
    { 
     this.set_Bar(bar); 
    } 
    public string get_Bar() { return this.__bar; } 
    private void set_Bar(string b) { this.__bar = b; } 
} 

를 작성하는 간단한 방법입니다, 속성은 뒤에서/수 설정 방법의 단지 한 쌍이다.

명시 적으로 읽기 전용 백업 필드를

어느 양식을 정의하기위한 합법적 인 이유가 있는지 궁금 해서요 완벽하게 합법적이다. 좋아하는 것을 골라주세요.

두 형식이 동일하지 않습니다. 첫 번째 경우 속성의 뒷받침 필드는 생성자에서만 변경할 수 있습니다. 후자의 경우, 부동산의 후원자 필드는 클래스의 어느 위치에서나 변경할 수 있습니다.

+0

반사가 둘 중 하나에 영향을 줍니까? – series0ne

+0

@ series0ne : 나는 그 질문을 이해하지 못한다. –

+0

아마도 첫 번째 예제에서는 setter를 호출 할 수 없으므로 아마도 읽기 전용이 아니어도 반영을하면 willy-nilly 값을 변경할 수 있습니까? – series0ne