2012-07-05 2 views
3

가진 코드 :공개 정적 읽기 전용 필드는 변경할 수 있지만 공용 필드는 변경할 수없는 이유는 무엇입니까? 이 같은

public static readonly bool MaximumRecipientsReached; 
    private static readonly IList<EmailAddress> Contacts; 

    static AdditionalRecipient() 
    { 
     Contacts = AnotherClass.Contacts; //works 
    } 

    public AdditionalRecipient() 
    { 
     MaximumRecipientsReached = true; //works not 
    } 

왜 나는 개인 정적 읽기 전용 필드가 아닌 공개를 변경할 수 있습니까?

추신 : 물론 나는 속성을 사용하고 있습니다.

+0

오류 메시지는 무엇입니까? – Servy

답변

11

첫 번째 예제에서는 정적 생성자에서 변경하는 중입니다. 다른 정적 메서드/속성에서 변경 한 경우 컴파일러 오류가 발생합니다.

두 번째 예에서는 비 정적 생성자에서 static readonly 멤버를 변경하려고했으나 허용되지 않습니다.

static 생성자에서 static readonly 멤버 만 변경할 수 있습니다. 이 방법으로 생각하면 static 생성자가 한 번 실행되고 각 인스턴스에 대해 인스턴스 생성자가 호출됩니다. 모든 인스턴스가 변경할 수있는 경우이 속성은 매우 readonly이 아닙니다.

당신은 물론, 생성자에서 비 staticreadonly 인스턴스 멤버를 변경할 수 있습니다

public static readonly bool MaximumRecipientsReached = false; 
public readonly bool MyInstanceReadonly = false; 

static AdditionalRecipient() 
{ 
    // static readonly can only be altered in static constructor 
    MaximumRecipientsReached = true; 
} 

public AdditionalRecipient() 
{ 
    // instance readonly can be altered in instance constructor 
    MyInstanceReadonly = true; 
} 

는 또한, 당신에 의해 혼란 스러워요 "PS : 나는 속성을 사용하고 물론". 속성을 readonly으로 선언 할 수 없으며, 속성이 readonly -ish가되도록하려면 private set으로 지정해야합니다. 물론 백킹 필드를 사용하는 경우는 예외입니다. 이 설정을하는 주된 이유는 private 세트가있는 속성을 사용하면 클래스 자체가 모든 메서드 나 생성자에서 속성 (정적 또는 인스턴스)을 변경할 수 있으므로 코드에서 수행하려는 작업을 수행 할 수 있기 때문입니다. 수업 외부에서는 할 수 없습니다.

// public getters, private setters... 
public static bool MaximumRecipientsReached { get; private set; } 
public static IList<EmailAddress> Contacts { get; private set; } 
+0

대단한 답변에 감사드립니다! – cfischer

+0

@ChristianFischer : 언제든지, 우리가 여기있는 이유입니다 .-) –

2

public 대 private과는 아무런 관련이 없으며 정적 또는 비 정적 생성자와는 관련이 없습니다. 당신이 (두 번째 경우에서와 같이) 비 정적 생성자 정적 읽기 전용 항목을 설정하려고하면

, 컴파일러는 불평 :

정적 읽기 전용 필드가 정적을 제외하고 (할당 할 수 없습니다 정적 멤버는 정규 생성자가도 호출되기 전에 할 수있는 유형의 첫 번째 액세스에서 초기화되기 때문에 생성자 또는 변수 초기화는)

이다. 정적 인 읽기 전용 멤버를 인스턴스 생성자에서 수정할 수 없으므로 컴파일러가이를 방지합니다.

관련 구성원을 비 정적으로 만들거나 초기화를 정적 생성자에 넣기 만하면됩니다.

1

MaximumRecipientsReached는 읽기 전용이며 정적이 아닌 생성자에서 설정하려고합니다. 정적 생성자 내에서만 설정할 수 있습니다.

0

왜냐하면 정적 생성자는 다른 정적 멤버에서만 사용할 수 있고 정적이 아닌 개체는 인스턴스화해야하기 때문입니다. 따라서 클래스를 인스턴스화했지만 클래스에 정적 생성자가 있으면 생성자가 호출되지 않습니다.

관련 문제