Кто может получить доступ к классу, объявленному как public?

«Кто может получить доступ к классу, объявленному как public?» — вопрос из категории ООП, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Класс с модификатором доступа public имеет наивысший уровень доступности. Это означает:

  • Внутри той же сборки (assembly): К нему можно обращаться из любого другого кода.
  • Из других сборок: Если на сборку, содержащую public класс, есть ссылка, то этот класс также доступен.
// AssemblyA.dll
namespace AssemblyA
{
    public class PublicLogger // Доступен отовсюду
    {
        public void Log(string message) => Console.WriteLine(message);
    }

    internal class InternalHelper // Доступен только внутри AssemblyA
    {
    }
}

// AssemblyB.csproj (имеет ссылку на AssemblyA)
using AssemblyA;

class ProgramInAssemblyB
{
    static void Main()
    {
        var logger = new PublicLogger(); // OK: класс public
        logger.Log("Hello from another assembly!");

        // var helper = new InternalHelper(); // ОШИБКА КОМПИЛЯЦИИ: InternalHelper internal
    }
}

Важные нюансы:

  1. Вложенные классы: Доступность вложенного класса ограничена областью видимости содержащего его класса. public вложенный класс будет доступен только если доступен его внешний класс.
  2. public vs internal: В рамках одной сборки поведение public и internal классов идентично. Ключевое различие проявляется при межсборочном доступе. internal — это стандартный выбор для служебных классов, которые не должны быть частью публичного API библиотеки.
  3. Доступ к членам класса: Даже если класс public, доступ к его полям, свойствам и методам регулируется их собственными модификаторами доступа (private, protected, internal, public).