Объекты типа string могут использоваться для управления оператором switch. Это единственный нецелочисленный тип данных, который допускается применять в операторе switch. Благодаря такому применению строк в некоторых сложных си туациях удается найти более простой выход из положения, чем может показаться на первый взгляд. Например, в приведенной ниже программе выводятся отдельные циф ры, соответствующие словам "один", "два" и "три". // Продемонстрировать управление оператором switch посредством строк. using System; class StringSwitch { static void Main { string[] strs = { "один", "два", "три", "два", "один" }; foreach(string s in strs) { switch(s) { case "один": Console.Write(1); break; case "два": Console.Write(2); break; case "три": Console.Write(3); break; } } Console.WriteLine; } }
При выполнении этой программы получается следующий результат. 12321
ГЛАВА 8. Подробнее о методах и классах
В данной главе возобновляется рассмотрение классов и методов. Оно начинается с пояснения механизма управления доступом к членам класса. А затем об суждаются такие вопросы, как передача и возврат объек тов, перегрузка методов, различные формы метода Main, рекурсия и применение ключевого слова static. Управление доступом к членам класса
Поддержка свойства инкапсуляции в классе дает два главных преимущества. Во-первых, класс связывает данные с кодом. Это преимущество использовалось в предыдущих примерах программ, начиная с главы 6. И во-вторых, класс предоставляет средства для управления доступом к его чле нам. Именно эта, вторая преимущественная особенность и будет рассмотрена ниже.
В языке С#, по существу, имеются два типа членов клас са: открытые и закрытые, хотя в действительности дело об стоит немного сложнее. Доступ к открытому члену свобод но осуществляется из кода, определенного за пределами класса. Именно этот тип члена класса использовался в рас сматривавшихся до сих пор примерах программ. А закры тый член класса доступен только методам, определенным в самом классе. С помощью закрытых членов и организует ся управление доступом.
Ограничение доступа к членам класса является осно вополагающим этапом объектно-ориентированного про граммирования, поскольку позволяет исключить невер ное использование объекта. Разрешая доступ к закрытым данным только с помощью строго определенного ряда методов, можно предупредить присваивание неверных значений этим данным, выполняя, например, проверку диа пазона представления чисел. Для закрытого члена класса нельзя задать значение непо средственно в коде за пределами класса. Но в то же время можно полностью управлять тем, как и когда данные используются в объекте. Следовательно, правильно реализо ванный класс образует некий "черный ящик", которым можно пользоваться, но вну тренний механизм его действия закрыт для вмешательства извне. Модификаторы доступа
Управление доступом в языке C# организуется с помощью четырех модификаторов доступа: public, private, protected и internal. В этой главе основное внимание уделяется модификаторам доступа public и private. Модификатор protected при меняется только в тех случаях, которые связаны с наследованием, и поэтому речь о нем пойдет в главе 11. А модификатор internal служит в основном для сборки, которая в широком смысле означает в C# разворачиваемую программу или библиотеку, и поэ тому данный модификатор подробнее рассматривается в главе 16.
Когда член класса обозначается спецификатором public, он становится доступ ным из любого другого кода в программе, включая и методы, определенные в других классах. Когда же член класса обозначается спецификатором private, он может быть доступен только другим членам этого класса. Следовательно, методы из других классов не имеют доступа к закрытому члену (private) данного класса. Как пояснялось в главе 6, если ни один из спецификаторов доступа не указан, член класса считается закры тым для своего класса по умолчанию. Поэтому при создании закрытых членов класса спецификатор private указывать для них необязательно.
Спецификатор доступа указывается перед остальной частью описания типа отдель ного члена. Это означает, что именно с него должен начинаться оператор объявления члена класса. Ниже приведены соответствующие примеры. public string errMsg; private double bal; private bool isError(byte status) { // ...