/ / Por que posso alterar um campo estático privado somente de leitura, mas não o público? - c #, construtor, somente leitura, estático-construtor

Por que posso alterar um campo de somente leitura estático privado, mas não público? - c #, construtor, somente leitura, estático-construtor

tendo código como este:

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

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

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

Por que posso alterar um campo estático privado somente de leitura, mas não o público?

PS: claro que estou usando propriedades.

Respostas:

11 para resposta № 1

No seu primeiro exemplo, você o está alterando no construtor estático, o que é permitido. Se você o tiver alterado em qualquer outro método / propriedade estático, seria um erro do compilador.

No seu segundo exemplo, você está tentando alterar um static readonly membro em um construtor não estático, o que não é permitido.

Você só pode mudar static readonly membros do static construtor. Pense desta maneira, o static O construtor é executado uma vez e, depois disso, para cada instância, o construtor da instância é chamado. A propriedade não seria muito readonly se toda instância pudesse mudar isso.

Você pode, é claro, alterar nãostatic readonly membros da instância no construtor:

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;
}

Além disso, estou confuso com o seu "PS: claro que estou usando propriedades". As propriedades não podem ser declaradas readonly, se você quiser que essas sejam propriedades e sejam readonly-ish, você precisaria fazê-los private set - a menos que você esteja usando um campo de apoio. A principal razão para trazer isso à tona é porque o uso de uma propriedade com um conjunto privado permitiria que você fizesse o que seu código está tentando fazer, pois a própria classe pode alterar a propriedade (estática ou instância) em qualquer método ou construtor, mas o código fora da classe não pode.

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

2 para resposta № 2

Não tem nada a ver com público versus privado, mas sim com construtores estáticos versus não estáticos.

Se você tentar definir um item estático somente leitura em um construtor não estático (como no seu segundo caso), o compilador reclamará:

Um campo estático somente leitura não pode ser atribuído a (exceto em um campo estático construtor ou inicializador de variável)

Isso ocorre porque membros estáticos são inicializados emprimeiro acesso do tipo, que poderia ser antes mesmo de qualquer construtor regular ser chamado. Não faz sentido ter membros estáticos somente de leitura modificáveis ​​a partir de construtores de instância; portanto, o compilador se protege contra ele.

Simplesmente torne o membro relevante não estático ou coloque a inicialização no construtor estático.


1 para resposta № 3

MaximumRecipientsReached é apenas estático e você está tentando configurá-lo a partir de um construtor não estático. Você só pode configurá-lo dentro do seu construtor estático.


0 para a resposta № 4

Isso porque construtores estáticos podem ser usados ​​apenascom outros membros estáticos e os não estáticos precisam que o objeto seja instanciado. Portanto, se você instanciar a classe, mas a classe tiver um construtor estático, o construtor nunca será chamado.