Выбрать главу

static void BinaryLiterals()

{

  // Обновление в версии 7.2: двоичное значение может начинаться с символа _

  Console.WriteLine("=> Use Binary Literals:");

  Console.WriteLine("Sixteen: {0}",0b_0001_0000);      // 16

  Console.WriteLine("Thirty Two: {0}",0b_0010_0000);   // 32

  Console.WriteLine("Sixty Four: {0}",0b_0100_0000);   // 64

}

Работа со строковыми данными

Класс System.String предоставляет набор членов, вполне ожидаемый от служебного класса такого рода, например, члены для возвращения длины символьных данных, поиска подстрок в текущей строке и преобразования символов между верхним и нижним регистрами. В табл. 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 перечислены наиболее распространенные управляющие последовательности.