класса такого рода, например, члены для возвращения длины символьных данных, поиска подстрок в текущей строке и преобразования символов между верхним и нижним регистрами. В табл. 3.5 перечислены некоторые интересные члены этого класса.
Выполнение базовых манипуляций со строками
Работа с членами System.String
выглядит вполне ожидаемо. Просто объявите переменную string
и задействуйте предлагаемую типом функциональность через операцию точки. Не следует забывать, что несколько членов System.String
являются статическими и потому должны вызываться на уровне класса (а не объекта).
Создайте новый проект консольного приложения по имени FunWithStrings
и добавьте его в свое решение. Замените существующий код следующим кодом:
using System;
using System.Text;
BasicStringFunctionality();
static void BasicStringFunctionality()
{
Console.WriteLine("=> Basic String functionality:");
string firstName = "Freddy";
// Вывод значения firstName.
Console.WriteLine("Value of firstName: {0}", firstName);
// Вывод длины firstname.
Console.WriteLine("firstName has {0} characters.", firstName.Length);
// Вывод firstName в верхнем регистре.
Console.WriteLine("firstName in uppercase: {0}", firstName.ToUpper());
// Вывод firstName в нижнем регистре.
Console.WriteLine("firstName in lowercase: {0}", firstName.ToLower());
// Содержит ли firstName букву у?
Console.WriteLine("firstName contains the letter y?: {0}",
firstName.Contains("y"));
// Вывод firstName после замены.
Console.WriteLine("New first name: {0}", firstName.Replace("dy", ""));
Console.WriteLine();
}
Здесь объяснять особо нечего: метод просто вызывает разнообразные члены, такие как ToUpper()
и Contains()
, на локальной переменной string
, чтобы получить разные форматы и трансформации. Ниже приведен вывод:
***** Fun with Strings *****
=> Basic String functionality:
Value of firstName: Freddy
firstName has 6 characters.
firstName in uppercase: FREDDY
firstName in lowercase: freddy
firstName contains the letter y?: True
firstName after replace: Fred
Несмотря на то что вывод не выглядит особо неожиданным, вывод, полученный в результате вызова метода Replace()
, может вводить в заблуждение. В действительности переменная firstName
вообще не изменяется; взамен получается новая переменная string
в модифицированном формате. Чуть позже мы еще вернемся к обсуждению неизменяемой природы строк.
Выполнение конкатенации строк
Переменные string
могут соединяться вместе для построения строк большего размера с помощью операции +
языка С#. Как вам должно быть известно, такой прием формально называется конкатенацией строк. Рассмотрим следующую вспомогательную функцию:
static void StringConcatenation()
{
Console.WriteLine("=> String concatenation:");
string s1 = "Programming the ";
string s2 = "PsychoDrill (PTP)";
string s3 = s1 + s2;
Console.WriteLine(s3);
Console.WriteLine();
}
Интересно отметить, что при обработке символа +
компилятор C# выпускает вызов статического метода String.Concat()
. В результате конкатенацию строк можно также выполнять, вызывая метод String.Concat()
напрямую (хотя фактически это не дает никаких преимуществ, а лишь увеличивает объем набираемого кода):
static void StringConcatenation()
{
Console.WriteLine("=> String concatenation:");
string s1 = "Programming the ";
string s2 = "PsychoDrill (PTP)";
string s3 = String.Concat(s1, s2);
Console.WriteLine(s3);
Console.WriteLine();
}
Использование управляющих последовательностей
Подобно другим языкам, основанным на С, строковые литералы C# могут содержать разнообразные управляющие последовательности, которые позволяют уточнять то, как символьные данные должны быть представлены в потоке вывода. Каждая управляющая последовательность начинается с символа обратной косой черты, за которым следует специфический знак. В табл. 3.6 перечислены наиболее распространенные управляющие последовательности.
Например, чтобы вывести строку, которая содержит символ табуляции после каждого слова, можно задействовать управляющую последовательность t
. Или предположим, что нужно создать один строковый литерал с символами кавычек внутри, второй — с определением пути к каталогу и третий — со вставкой трех пустых строк после вывода символьных данных. Для этого можно применять управляющие последовательности "
, \
и n
. Кроме того, ниже приведен еще один пример, в котором для привлечения внимания каждый строковый литерал сопровождается звуковым сигналом:
static void EscapeChars()
{
Console.WriteLine("=> Escape characters:a");
string strWithTabs = "ModeltColortSpeedtPet Namea ";
Console.WriteLine(strWithTabs);
Console.WriteLine("Everyone loves "Hello World"a ");
Console.WriteLine("C:\MyApp\bin\Debuga ");
// Добавить четыре пустых строки и снова выдать звуковой сигнал.
Console.WriteLine("All finished.nnna ");
Console.WriteLine();
}
Выполнение интерполяции строк
Синтаксис с фигурными скобками, продемонстрированный ранее в главе ({0}, {1}
и т.д.), существовал в рамках платформы .NET еще со времен версии 1.0. Начиная с выхода версии C# 6, при построении строковых литералов, содержащих заполнители для переменных, программисты на C# могут использовать альтернативный синтаксис. Формально он называется интерполяцией строк. Несмотря на то что выходные данные операции идентичны выходным данным, получаемым с помощью традиционного синтаксиса форматирования строк, новый подход позволяет напрямую внедрять сами переменные, а не помещать их в список с разделителями-запятыми.
Взгляните на показанный ниже дополнительный метод в нашем классе Program(StringInterpolation()
), который строит переменную типа string
с применением обоих подходов:
static void StringInterpolation()
{
Console.WriteLine("=> String interpolation:a");
// Некоторые локальные переменные будут включены в крупную строку.
int age = 4;
string name = "Soren";
// Использование синтаксиса с фигурными скобками.
string greeting = string.Format("Hello {0} you are {1} years old.",
name, age);
Console.WriteLine(greeting);
// Использование интерполяции строк.
string greeting2 = $"Hello {name} you are {age} years old.";
Console.WriteLine(greeting2);
}
В переменной greeting2
легко заметить, что конструируемая строка начинается с префикса $
. Кроме того, фигурные скобки по-прежнему используются для пометки заполнителя под переменную; тем не менее, вместо применения числовой метки имеется возможность указывать непосредственно переменную. Предполагаемое преимущество заключается в том, что новый синтаксис несколько легче читать в линейной манере (слева направо) с учетом того, что не требуется "перескакивать в конец" для просмотра списка значений, подлежащих вставке во время выполнения.
С новым синтаксисом связан еще один