Esse é o 17º post da série sobre C# 7, e o terceiro sobre C# 7.2. Pra acompanhar a série você pode seguir a tag C#7 no blog ou voltar no post que agrega a série.

Lembrando que para utilizar as versões minor do C# (como a 7.1, ou 7.2) você precisa habilitá-la nos atributos do projeto. Veja neste post como fazê-lo e também como habilitar na solution inteira pra não ter que ficar configurando cada projeto individualmente.

Novidades do C# 7.2: Modificadores de acesso private protected

A partir da versão 7.2 poderemos criar membros de classes que só podem ser acessados em classes derivadas que estiverem no mesmo assembly.

Por exemplo, existindo a classe Base a seguir, com o campo f com os modificadores de acesso private protected, no assembly A:

namespace A
{
    class Base
    {
        private protected int f;
    }
}

Ao criarmos outra classe, no mesmo assembly, que deriva de Base, ela poderá acessar o campo f:

namespace A
{
    class DerivadaNoMesmoAssembly : Base
    {
        void M()
        {
            var x = base.f;
        }
    }
}

No entanto, caso fosse criada outra classe que deriva de Base em outro assembly (neste caso B), ela não poderia acessar o campo f:

namespace B
{
    class DerivadaEmOutroAssembly : Base
    {
        void M()
        {
            var x = base.f; //erro
        }
    }
}

É bastante comum imaginar que os modificadores protected internal tinham esta função, e isso é um engano. Esse engano acontece porque a pessoa imagina que o protected limita o acesso para apenas classes derivadas, e o internal limita ainda mais: para derivadas do mesmo assembly. Na verdade, eles se somam, amplicando o acesso inicial. Desta forma, protected internal significa que a classe é acessível de classes derivadas ou de qualquer outra classe do assembly. O ou é o ponto chave da questão, muita gente pensa ser um e, o que tornaria os modificadores mais restritivos.

Você consegue ler sobre mais sobre os modificadores private protected nos docs do Github sobre esta evolução.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.