Любая используемая в программе сущность вводится объявлением.
Объявлению подлежат:
§ классы и структуры. Класс (структура) может содержать вложенные объявления других классов и структур,
§ перечисления,
§ объекты - переменные и константы, представляющие классы и структуры. Корректное объявление объекта предполагает, что информация, содержащая характеристики объявляемого объекта доступна транслятору.
§ элементы перечислений – объекты, представляющие перечисления,
§ конструкторы классов и методы (функции) – члены классов (в том числе и специальные).
Объявляемой сущности присваивается имя. Обращение к ранее объявленным сущностям в программе обеспечивается различными вариантами имён. Имена в программе повсюду и главная проблема заключается в том, чтобы не допустить неоднозначности при обращении из разных мест программы к классам, членам классов, перечислениям, переменным и константам.
Конфликта имён (проблемы с обращением к одноименным объектам) позволяет избежать принятая в языке дисциплина именования. В каждом языке программирования она своя.
Избежать конфликта имён в C# позволяет такая синтаксическая конструкция как блок операторов. Блок – это (возможно пустое) множество предложений, заключённое в фигурные скобки.
Различается несколько категорий блоков:
§ тело класса (структуры). Место объявления членов класса,
§ тело метода. Место расположения операторов метода,
§ блок в теле метода.
Переменные можно объявлять в любом месте блока. Точка объявления переменной в буквальном смысле соответствует месту её создания. Обращение к объявляемой сущности (переменной или константе) “выше” точки её объявления лишено смысла.
Новый блок – новая область видимости. Объекты, объявляемые во внутренних блоках не видны во внешних блоках. Объекты, объявленные в методе и во внешних блоках видны и во внутренних блоках. Одноимённые объекты во вложенных областях конфликтуют.
Объекты, объявляемые в блоках одного уровня вложенности в методе не видны друг для друга. Конфликта имён не происходит.
В теле класса не допускается объявления одноимённых данных-членов. Нарушение этого правила приводит к неоднозначности.
В теле класса не допускается объявления одноимённых функций-членов (методов класса) с пустыми списками параметров и с совпадающим порядком расположения типа параметра в списках параметров (с сигнатурой метода). Здесь не важны имена параметров. Важно, что выражение вызова метода в этом случае будет неоднозначным.
Имена данных-членов класса не конфликтуют с одноименными переменными, объявляемыми в теле методов, поскольку в теле метода обращение к членам класса обеспечивается выражениями с операцией доступа и никакого конфликта в принципе быть не может.
Ниже приводится простой программный код, отражающий особенности принятой в C# концепции областей видимости.