Полное руководство. С# 4.0
Шрифт:
Выполнение этой программы приводит к следующему результату. Число: 1908 Число словами: один девять нуль восемь
В данной программе использован массив строк digits для хранения словесных обозначений цифр от 0 до 9. По ходу выполнения программы целое число преобразу ется в слова. Для этого сначала получаются отдельные цифры числа, а затем они сохра няются в обратном порядке следования в массиве n типа int. После этого выполняется циклический опрос массива n в обратном порядке. При этом каждое целое значение из массива п служит в качестве индекса, указывающего на слова, соответствующие по лученным цифрам числа и
Как ни странно, содержимое объекта типа string не подлежит изменению. Это означает, что однажды созданную последовательность символов изменить нельзя. Но данное ограничение способствует более эффективной реализации символьных строк. Поэтому этот, на первый взгляд, очевидный недостаток на самом деле превращается в преимущество. Так, если требуется строка в качестве разновидности уже имеющейся строки, то для этой цели следует создать новую строку, содержащую все необходимые изменения. А поскольку неиспользуемые строковые объекты автоматически собирают ся в "мусор", то о дальнейшей судьбе ненужных строк можно даже не беспокоиться.
Следует, однако, подчеркнуть, что переменные ссылки на строки (т.е. объекты типа string) подлежат изменению, а следовательно, они могут ссылаться на другой объект. Но содержимое самого объекта типа string не меняется после его создания.
Для того чтобы стало понятнее, почему неизменяемые строки не являются помехой, воспользуемся еще одним методом обращения со строками: Substring. Этот метод возвращает новую строку, содержащую часть вызывающей строки. В итоге создает ся новый строковый объект, содержащий выбранную подстроку, тогда как исходная строка не меняется, а следовательно, соблюдается принцип постоянства строк. Ниже приведена рассматриваемая здесь форма метода Substring: string Substring(int индекс_начала, int длина)
где индекс_начала обозначает начальный индекс исходной строки, а длина — длину выбираемой подстроки.
Ниже приведена программа, в которой принцип постоянства строк демонстри руется на примере использования метода Substring. // Применить метод Substring. using System; class SubStr { static void Main { string orgstr = "В C# упрощается обращение со строками."; // сформировать подстроку string substr = orgstr.Substring(5, 20); Console.WriteLine("orgstr: " + orgstr); Console.WriteLine("substr: " + substr); } }
Вот к какому результату приводит выполнение этой программы. orgstr: В C# упрощается обращение со строками. substr: упрощается обращение
Как видите, исходная строка из переменной orgstr не меняется, а выбранная из нее подстрока содержится в переменной substr.
И последнее замечание: несмотря на то, что постоянство строк обычно не являет ся ни ограничением, ни помехой для программирования на С#, иногда оказывается полезно иметь возможность видоизменять строки. Для этой цели в C# имеется класс StringBuilder, который определен в пространстве имен System.Text. Этот класс позволяет создавать строковые объекты, которые можно изменять. Но, как правило, в программировании на C# используется тип string, а не класс StringBuilder. Применение строк в операторах switch
Объекты типа string могут использоваться для управления оператором switch. Это единственный нецелочисленный тип данных, который допускается применять в операторе switch. Благодаря
При выполнении этой программы получается следующий результат. 12321
ГЛАВА 8. Подробнее о методах и классах
В данной главе возобновляется рассмотрение классов и методов. Оно начинается с пояснения механизма управления доступом к членам класса. А затем об суждаются такие вопросы, как передача и возврат объек тов, перегрузка методов, различные формы метода Main, рекурсия и применение ключевого слова static. Управление доступом к членам класса
Поддержка свойства инкапсуляции в классе дает два главных преимущества. Во-первых, класс связывает данные с кодом. Это преимущество использовалось в предыдущих примерах программ, начиная с главы 6. И во-вторых, класс предоставляет средства для управления доступом к его чле нам. Именно эта, вторая преимущественная особенность и будет рассмотрена ниже.
В языке С#, по существу, имеются два типа членов клас са: открытые и закрытые, хотя в действительности дело об стоит немного сложнее. Доступ к открытому члену свобод но осуществляется из кода, определенного за пределами класса. Именно этот тип члена класса использовался в рас сматривавшихся до сих пор примерах программ. А закры тый член класса доступен только методам, определенным в самом классе. С помощью закрытых членов и организует ся управление доступом.
Ограничение доступа к членам класса является осно вополагающим этапом объектно-ориентированного про граммирования, поскольку позволяет исключить невер ное использование объекта. Разрешая доступ к закрытым данным только с помощью строго определенного ряда методов, можно предупредить присваивание неверных значений этим данным, выполняя, например, проверку диа пазона представления чисел. Для закрытого члена класса нельзя задать значение непо средственно в коде за пределами класса. Но в то же время можно полностью управлять тем, как и когда данные используются в объекте. Следовательно, правильно реализо ванный класс образует некий "черный ящик", которым можно пользоваться, но вну тренний механизм его действия закрыт для вмешательства извне. Модификаторы доступа
Управление доступом в языке C# организуется с помощью четырех модификаторов доступа: public, private, protected и internal. В этой главе основное внимание уделяется модификаторам доступа public и private. Модификатор protected при меняется только в тех случаях, которые связаны с наследованием, и поэтому речь о нем пойдет в главе 11. А модификатор internal служит в основном для сборки, которая в широком смысле означает в C# разворачиваемую программу или библиотеку, и поэ тому данный модификатор подробнее рассматривается в главе 16.