readonly vs. propriedade somente getter privada em C # 6

5

C # 6 adicionou inicializadores de propriedade automática e assim podemos fazer

private List<LinearLayout> layouts1 { get; } = new List<LinearLayout>();

Isso é melhor ou pior que

private readonly List<LinearLayout> layouts2 = new List<LinearLayout>();

(NB isso está relacionado à pergunta de 2011 Propriedades do .NET - Usar Conjunto Privado ou Propriedade ReadOnly? , mas isso inclui um getter público ao lado de um setter privado. Aqui eu só tenho um getter privado.)

    
por dumbledad 12.06.2018 / 15:57
fonte

2 respostas

8

Se você der uma olhada aqui , você verá que o seguinte código:

class Example
{
   private List<LinearLayout> layouts1 { get; } = new List<LinearLayout>();
}

É diminuído pelo compilador para:

internal class Example
{
    private readonly List<LinearLayout> <layouts1>k__BackingField = new List<LinearLayout>();

    private List<LinearLayout> layouts1
    {
        get
        {
            return <layouts1>k__BackingField;
        }
    }
}

ea propriedade fica ainda mais reduzida para uma % co_de método%.

Em outras palavras, os inicializadores de propriedade automática são puro açúcar sintático. Eles fornecem um meio de usar propriedades automáticas, enquanto ainda permitem que o campo de apoio seja inicializado.

Então, do ponto de vista da mutabilidade, não há diferença entre eles. Ambos fornecem acesso somente leitura a uma lista que é inicializada quando uma instância da classe é criada.

É possível que ele crie uma pequena sobrecarga de desempenho, já que o método deve ser chamado para obter a referência da lista, mas é provável que o CLR JIT otimize o método e apenas acesse o campo diretamente.

O uso mais óbvio para propriedades privadas é para fins de carregamento lento / execução diferida . Existem outros usos, mas como orientação, eles são muitas vezes inúteis "ruído". Eu não iria tão longe a ponto de dizer que usar uma propriedade privada é pior do que apenas usar um campo, mas eu aconselho apenas usar um campo somente leitura para a maioria dos casos.

    
por 13.06.2018 / 09:45
fonte
-1

Nesse caso, eles funcionariam quase de forma idêntica. Há uma sutileza que tornaria a propriedade privada menos que ideal:

  • O bytecode acessaria o List<LinearLayout> por meio de uma função getter. No entanto, assim que o bytecode é recompilado para o seu ambiente (que o C # fez por um longo tempo), a função getter seria otimizada, então não é um problema real.

Se eles forem usados de maneira idêntica, não haverá diferença prática.

    
por 12.06.2018 / 16:29
fonte