Подтвердить что ты не робот

Защищенные классы в .NET.

Можно ли защитить класс в .NET?
Почему это возможно?

4b9b3361

Ответ 1

Да, вы просто не можете сделать их классами верхнего уровня, они должны быть внутренними классами

public class Outer
{
    protected class Foo
    {
    }
}

Это хорошо, это означает, что только классы, разрешенные для просмотра Foo, являются подклассами Outer

class X 
{
    // 'Outer.Foo' is inaccessible due to its protection level
    private void Flibble(Outer.Foo foo)
    {
    }
}

class X : Outer
{
    // fine
    private void Flibble(Outer.Foo foo)
    {
    }
}

Обратите внимание: вы не можете объявить какой-либо внешний класс как закрытый, защищенный (или защищенный внутренний) в С#, поскольку модификатор доступа для классов внешнего уровня определяет их видимость по отношению к другим сборкам. Специально видимый только в сборке (или для друзей через InternalsVisibleTo) или вне сборки.

Таким образом, хотя общедоступные/внутренние идентификаторы используются здесь для согласованности, действительно, состояние в IL является просто "Public" или "NonPublic" (как Reflection.Emit флаги показывают)

Ответ 2

protected видимость используется для обозначения "видимых для производных классов". Это имеет смысл в вещах внутри класса, но обычно не имеет смысла на уровне класса.

Единственным исключением из этого является внутренний класс, где защищенная видимость означает, что производные классы будут иметь доступ к внутреннему классу.

Ответ 3

Да, мы просто не можем сделать их классами верхнего уровня, они должны быть внутренними классами