Строчный тип (System.String) определяет и поддерживает символьные строки. В С# строки являются объектами. Следовательно, тип string относится к числу ссылочных.
Самый простой способ построить символьную строку — воспользоваться строковым литералом. Например, в следующей строке кода переменной ссылки на строку str присваивается ссылка на строковый литерал.
string str = "Строки в С# весьма эффективны.";
В данном случае переменная str инициализируется последовательностью символов "Строки в С# весьма эффективны."
Объект типа string можно также создать из массива типа char. Например:
char[] charray = {'t', 'е', 's', 't'} ;
string str = new string(charray);
Как только объект типа string будет создан, его можно использовать везде, где только требуется строка текста, заключенного в кавычки.
В System. String предоставляется набор методов для определения длины символьных данных, поиска подстроки в текущей строке, преобразования символов из верхнего регистра в нижний и наоборот, и т.д. В табл. 4 перечислены некоторые наиболее интересные члены этого класса.
Таблица 4
Некоторые члены класса System.String
Член |
Описание |
Length |
Свойство, которое возвращает длину текущей строки |
Compare() |
Статический метод, который позволяет сравнить две строки |
Contains() |
Метод, который позволяет определить, содержится ли в строке определенная подстрока |
Equals() |
Метод, который позволяет проверить, содержатся ли в двух строковых объектах идентичные символьные данные |
Insert() |
Метод, который позволяет вставить строку внутрь другой определенной строки |
PadLeft() |
Методы, которые позволяют дополнить строку какими-то символами, соответственно, справа или слева |
PadRight() |
|
Remove() |
Методы, которые позволяют получить копию строки с соответствующими изменениями (удалением или заменой символов) |
Replace() |
|
Split() |
Метод, возвращающий массив string с присутствующими в данном экземпляре подстроками внутри, которые отделяются друг от друга элементами из указанного массива char или string |
Trim() |
Метод, который позволяет удалять все вхождения определенного набора символов с начала и конца текущей строки |
ToUpper() |
Методы, которые позволяют создавать копию текущей строки в формате, соответственно, верхнего или нижнего регистра |
ToLower() |
Переменные string могут сцепляться вместе для создания строк большего размера с помощью такой поддерживаемой в С# операции, как +. Как известно, подобный прием называется конкатенацией строк.
Как и в других языках на базе С, в С# строковые литералы могут содержать различные управляющие последовательности символов (escape characters), которые позволяют уточнять то, как символьные данные должны выводиться в выходном потоке. Начинается каждая такая управляющая последовательность с символа обратной косой черты, за которым следует интерпретируемый знак:
jgd[2][1] = 10;
Ступенчатые массивы представляют собой массивы массивов, и поэтому они не обязательно должны состоять из одномерных массивов.
Присваивание значения одной переменной ссылки на массив другой переменной, по существу, означает, что обе переменные ссылаются на один и тот же массив, и в этом отношении массивы ничем не отличаются от любых других объектов. Такое присваивание не приводит ни к созданию копии массива, ни к копированию содержимого одного массива в другой.
Реализация в С# массивов в виде объектов дает целый ряд преимуществ. Одно из них заключается в том, что с каждым массивом связано свойство Length, содержащее число элементов, из которых может состоять массив. Следовательно, у каждого массива имеется специальное свойство, позволяющее определить его длину. длине. Следует, однако, иметь в виду, что значение свойства Length никак не отражает число элементов, которые в нем используются на самом деле. Свойство Length содержит лишь число элементов, из которых может состоять массив. В случае применения данного свойства к ступенчатому массиву можно получить длину каждого массива, составляющего ступенчатый массив.
В C#, начиная с версии 3.0, можно создавать неявно типизированные массивы.
Неявно типизированный массив объявляется с помощью ключевого слова var, но без последующих квадратных скобок []. Кроме того, неявно типизированный массив должен быть непременно инициализирован, поскольку по типу инициализаторов определяется тип элементов данного массива. Все инициализаторы должны быть одного и того же согласованного типа. Ниже приведен пример объявления неявно типизированного массива.
var vals = new[] { 1, 2, 3, 4, 5 };
В данном примере создается массив типа int, состоящий из пяти элементов. Ссылка на этот массив присваивается переменной vals. Следовательно, тип этой переменной соответствует типу int массива, состоящего из пяти элементов. Обратите внимание на то, что в левой части приведенного выше выражения отсутствуют квадратные скобки []. А в правой части этого выражения, где происходит инициализация массива, квадратные скобки присутствуют. В данном контексте они обязательны.
\' - вставляет в строковый литерал символ одинарной кавычки;
\" - вставляет в строковый литерал символ двойной кавычки;
\\ - вставляет в строковый литерал символ обратной косой черты. Может быть полезной при определении путей к файлам и сетевым ресурсам;
\a - заставляет систему выдавать звуковой сигнал, который в консольных приложениях может служить своего рода звуковой подсказкой пользователю;
\n - вставляет символ новой строки;
\r - вставляет символ возврата каретки;
\t - вставляет в строковый литерал символ горизонтальной табуляции.
За счет добавления к строковому литералу префикса @ можно создавать так называемые дословные строки (verabtim string). Дословные строки позволяют отключать обработку управляющих последовательностей в литералах и выводить объекты string в том виде, в каком они есть. Эта возможность наиболее полезна при работе со строками, представляющими пути к каталогам и сетевым ресурсам. Таким образом, вместо использования управляющей последовательности \\ можно написать следующий код:
Console.WriteLine(@"C:\MyApp\bin\Debug");
Для представления строк в среде исполнения .NET используется класс System.String, и при любом изменении строки в программе создается новый экземпляр System.String, старый отбрасывается и в дальнейшем подвергается сборщику мусора.
Данное ограничение способствует более эффективной реализации символьных строк. Так, если требуется строка в качестве разновидности уже имеющейся строки, то для этой цели следует создать новую строку, содержащую все необходимые изменения. А поскольку неиспользуемые строковые объекты автоматически собираются в "мусор", то о дальнейшей судьбе ненужных строк можно даже не беспокоиться.
Следует, однако, подчеркнуть, что переменные ссылки на строки (т.е. объекты типа string) подлежат изменению, а следовательно, они могут ссылаться на другой объект. Но содержимое самого объекта типа string не меняется после его создания.
Для того чтобы стало понятнее, почему неизменяемые строки не являются помехой, воспользуемся еще одним методом обращения со строками: Substring(). Этот метод возвращает новую строку, содержащую часть вызывающей строки. В итоге создается новый строковый объект, содержащий выбранную подстроку, тогда как исходная строка не меняется, а следовательно, соблюдается принцип постоянства строк. Ниже приведена рассматриваемая здесь форма метола Substring():
string Substring(int индекс_начала, int длина)
где индекс_начала обозначает начальный индекс исходной строки, а длина — длину выбираемой подстроки.
Ниже приведена программа, в которой принцип постоянства строк демонстрируется на примере использования метода Substring().
// Применить метод Substring().
using System;
class SubStr {
static void Main() {
string orgstr = "В С# упрощается обращение со строками.";
// сформировать подстроку
string substr = orgstr.SubstringE, 20);
Console.WriteLine("orgstr: " + orgstr);
Console.WriteLine("substr: " + substr);
}
}
Вот к какому результату приводит выполнение этой программы.
orgstr: В С# упрощается обращение со строками,
substr: упрощается обращение
Как видите, исходная строка из переменной orgstr не меняется, а выбранная из нее подстрока содержится в переменной substr.
И последнее замечание: несмотря на то, что постоянство строк обычно не является ни ограничением, ни помехой для программирования на С#, иногда оказывается полезно иметь возможность видоизменять строки. Для этой цели в С# имеется класс StringBuilder, который определен в пространстве имен System.Text. Этот класс позволяет создавать строковые объекты, которые можно изменять. Но, как правило, в программировании на С# используется тип string, а не класс StringBuilder.
.NET Framework представляет собой программную платформу для создания приложений на базе семейства операционных систем Windows, а также многочисленных операционных систем производства не Microsoft, таких как Mac OS X и различные дистрибутивы Unix и Linux. Для начала не помешает привести краткий перечень некоторых базовых функциональных возможностей, которыми обладает .NET:
- Возможность обеспечения взаимодействия с существующим программным кодом.
- Поддержка для многочисленных языков программирования. Приложения .NET можно создавать с помощью любого множества языков программирования (С#, Visual Basic, F#, S# и т.д.).
- Общий исполняющий механизм, используемый всеми поддерживающими .NET языками. Одним из аспектов этого механизма является наличие хорошо определенного набора типов, которые способен понимать каждый поддерживающий .NET язык.
- Полная и тотальная интеграция языков. В .NET поддерживается межъязыковое наследование, межъязыковая обработка исключений и межъязыковая отладка кода.
- Обширная библиотека базовых классов. Эта библиотека позволяет избегать сложностей, связанных с выполнением прямых вызовов к API-интерфейсу, и предлагает согласованную объектную модель, которую могут использовать все поддерживающие .NET языки.
Тремя ключевыми (и связанными между собой) сущностями, которые и делают предоставление этих преимуществ возможным, являются: CLR, CTS и CLS.
С точки зрения программиста .NET представляет собой исполняющую среду и обширную библиотеку базовых классов. Уровень исполняющей среды называется общеязыковой исполняющей средой (Common Language Runtime) или, сокращенно, средой CLR. Главной задачей CLR является автоматическое обнаружение, загрузка и управление типами .NET (вместо программиста). Кроме того, среда CLR заботится о ряде низкоуровневых деталей, таких как управление памятью, обслуживание приложения, обработка потоков и выполнение различных проверок, связанных с безопасностью.
С точки зрения программирования под термином исполняющая среда может пониматься коллекция внешних служб, которые требуются для выполнения скомпилированной единицы программного кода. Исполняющая среда .NET обеспечивает единый четко определенный уровень выполнения, который способны использовать все совместимые с .NET языки и платформы.
Основной механизм CLR физически имеет вид библиотеки под названием mscoree.dll (и также называется общим механизмом выполнения исполняемого кода объектов — Common Object Runtime Execution Engine). При добавлении ссылки на сборку для ее использования загрузка библиотеки mscoree.dll осуществляется автоматически и затем, в свою очередь, приводит к загрузке требуемой сборки в память.
Механизм исполняющей среды отвечает за выполнение целого ряда задач:
1) определение места расположения сборки;
2) обнаружение запрашиваемого типа в двоичном файле;
3) размещение типа в памяти;
4) преобразование CIL-кода в соответствующие платформе инструкции;
5) произведение необходимых проверок безопасности
6) непосредственное выполнение самого запрашиваемого кода.
Помимо загрузки пользовательских сборок и создания пользовательских типов, механизм CLR при необходимости будет взаимодействовать и с типами, содержащимися в библиотеках базовых классов .NET. Хотя вся библиотека базовых классов поделена на ряд отдельных сборок, главной среди них является сборка mscorlib.dll. В этой сборке содержится большое количество базовых типов, охватывающих широкий спектр типичных задач программирования, а также базовых типов данных, применяемых во всех языках .NET. При построении .NET-решений доступ к этой конкретной сборке будет предоставляться автоматически.
Другим составляющим компонентом платформы .NET является общая система типов (Common Type System) или, сокращенно, система CTS. В спецификации CTS представлено полное описание всех возможных типов данных и программных конструкций, поддерживаемых исполняющей средой, того, как эти сущности могут взаимодействовать друг с другом, и того, как они могут представляться в формате метаданных .NET.
Важно понимать, что любая из определенных в CTS функциональных возможностей может не поддерживаться в отдельно взятом языке, совместимом с .NET. Поэтому существует еще общеязыковая спецификация (Common Language Specification) или, сокращенно, спецификация CLS, в которой описано лишь то подмножество общих типов и программных конструкций, каковое способны воспринимать абсолютно все поддерживающие .NET языки программирования. Следовательно, в случае построения типов .NET только с функциональными возможностями, которые предусмотрены в CLS, можно оставаться полностью уверенным в том, что все совместимые с .NET языки смогут их использовать. И, наоборот, в случае применения такого типа данных или конструкции программирования, которой нет в CLS, рассчитывать на то, что каждый язык программирования .NET сможет взаимодействовать с подобной библиотекой кода .NET, нельзя.
CLS представляет собой набор правил, которые во всех подробностях описывают минимальный и полный комплект функциональных возможностей, которые должен обязательно поддерживать каждый отдельно взятый .NET-компилятор для того, чтобы генерировать такой программный код, который мог бы обслуживаться CLR и к которому в то же время могли бы единообразным образом получать доступ все языки, ориентированные на платформу .NET. Во многих отношениях CLS может считаться просто подмножеством всех функциональных возможностей, определенных в CTS.
В конечном итоге CLS является своего рода набором правил, которых должны придерживаться создатели компиляторов при желании, чтобы их продукты могли без проблем функционировать в мире .NET. Каждое из этих правил имеет простое название (например, "Правило CLS номер 6") и описывает, каким образом его действие касается тех, кто создает компиляторы, и тех, кто (каким-либо образом) будет взаимодействовать с ними. Самым главным в CLS является правило 1, гласящее, что правила CLS касаются только тех частей типа, которые делаются доступными за пределами сборки, в которой они определены.