Одним из важных принципов объектно-ориентированного подхода к программированию является инкапсуляция данных: считается, что внутреннее устройство класса и конкретная реализация его методов должны быть неизвестны внешним потребителям. Для выражения различных уровней доступности элементов программы в C# существует обширный набор модификаторов, позволяющий утверждать, что на данный момент C# обладает наиболее развитыми средствами поддержки инкапсуляции. Например, поля могут быть описаны следующим образом:
public (данный элемент класса доступен всем внешним потребителям)
protected (к такому элементу класса могут обращаться только классы, унаследованные от данного)
private (элемент недоступен за пределами описания класса, т.е. недоступен даже потомкам данного класса; этот модификатор ставится по умолчанию)
internal (элемент доступен только для классов, определенных в той же сборке, что и данный класс)
Кроме того, существуют модификаторы, изменяющие поведение элементов класса:
const (свидетельствует, что данная переменная не может быть изменена)
event (указывает, что данный элемент описывает событие; о событиях см. ниже)
extern (обычно описывает метод с внешней реализацией, чаще всего, импортированный из Win32)
override (используется в случае новой реализации виртуального метода)
readonly (описывает переменные, которые могут получить значение только при самом описании или в конструкторе класса)
static (указывает, что данный элемент принадлежит типу объекта, а не конкретному экземпляру)
virtual (описывает метод, который может быть переопределен в потомках класса)
Наконец, класс в целом может иметь следующие дополнительные модификаторы:
abstract (обозначает, что данный класс не может быть использован самостоятельно, а является только базой для классов-потомков)
sealed (от таких классов нельзя наследовать; кстати, по очевидным соображениям комбинация модификаторов abstract sealed запрещена)