Pergunta

Eu sei que ao usar propriedades automáticas, o compilador cria seu próprio campo de apoio atrás da tela.No entanto, em muitos programas que leio para aprender, vejo pessoas escreverem explicitamente

private int _backingField;

public int Property { get { return _backingField; } }

Qual é a diferença entre acima e abaixo?

public int Property { get; private set; }

Entendo que é óbvio usar a propriedade quando você realmente tem efeitos colaterais no getter ou no setter, mas geralmente não é o caso.Além disso, entendo que você deve usar explicitamente o campo de apoio no caso de estruturas; não é possível acessar seus membros por meio de propriedades.

A única diferença que consegui encontrar é que a forma de chamar o valor é diferente dentro da classe em que está definido.É então uma preferência simples ou há algo mais em chamar um valor através de sua propriedade ou acessando diretamente o campo?Convenções simples?

Foi útil?

Solução

Não há muita diferença entre esses dois trechos – você não pode passar uma propriedade por referência, por exemplo, mas isso raramente é um problema.Porém, se você quiser que o campo seja somente leitura, assim:

private readonly int _backingField;    
public int Property { get { return _backingField; } }

então há uma diferença.O código que escrevi acima evita que o valor seja alterado em outro lugar da classe, deixando claro que isso realmente deve ser imutável.Eu realmente gostaria de poder declarar um campo somente leitura com uma propriedade de implementação automática somente leitura, configurável apenas dentro do construtor - mas isso não está disponível no momento.

A propósito, isso é bastante confuso:

Além disso, entendo que você deve usar explicitamente o campo de apoio no caso de estruturas; não é possível acessar seus membros por meio de propriedades.

O que você quer dizer?Definitivamente, você pode usar propriedades dentro de estruturas.Você está falando sobre campos de apoio que são estruturas mutáveis, ou seja,a diferença entre:

foo.someField.X = 10;

e

foo.SomeProperty.X = 10;

?Nesse caso, normalmente evito que isso seja um problema, tornando minhas estruturas imutáveis ​​para começar :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top