Главная страница
Навигация по странице:

  • Строки в C

  • Класс String

  • Поле, индексатор и свойство класса String

  • Операторы класса String

  • Методы класса String

  • Сравнение строк

  • Справочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией


    Скачать 5.05 Mb.
    НазваниеСправочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией
    АнкорC #.pdf
    Дата08.12.2017
    Размер5.05 Mb.
    Формат файлаpdf
    Имя файлаC #.pdf
    ТипСправочник
    #10795
    страница35 из 52
    1   ...   31   32   33   34   35   36   37   38   ...   52
    Глава 20
    Строки и форматирование

    542
    Часть II. Библиотека C# та глава посвящена классу string
    . Как известно каждому программисту, без обработки строк не обходится практически ни одна программа. Поэтому в классе string определено множество методов, свойств и полей, которые предлагают программисту богатую палитру инструментов, позволяющих создавать строки и манипулировать ими. С темой обработки строк тесно связана тема форматирования данных с целью приведения их к форме, удобной для восприятия человеком. Используя возможности соответствующей подсистемы, можно нужным образом форматировать числовые типы языка C#, дату и время, а также перечисления.
    Строки в C#
    Обзор средств обработки строк в C# был представлен в главе 7, и повторения
    “пройденного” здесь не предполагается. Но прежде чем перейти к рассмотрению класса string
    , имеет смысл поговорить об особенностях реализации строк в языке C#.
    Во всех языках программирования строка (string) представляет собой последовательность символов, но точная реализация такой последовательности меняется при переходе от одного языка к другому. В языке C++ строки реализованы в виде массивов символов, но в C# все обстоит иначе. Строки в C# — это объекты встроенного типа данных string
    . Поэтому string является ссылочным типом данных. Более того, string
    — это
    C#-имя стандартного строкового типа .NET-среды
    System.String
    . Таким образом, C#- строка имеет доступ ко всем методам, свойствам, полям и операторам, определенным в классе
    String
    В созданной строке последовательность составляющих ее символов изменить нельзя.
    Благодаря этому ограничению строки в C# (по сравнению с другими языками) реализованы более эффективно. И хотя это ограничение может показаться серьезным недостатком, на самом деле оно таковым не является. Если вам понадобится строка, которая представляет собой вариацию “на тему” другой, уже существующей строки, просто создайте новую строку, которая будет содержать желаемые изменения, а затем удалите исходный вариант, если он вам больше не нужен. Поскольку неиспользуемые строковые объекты автоматически удаляются подсистемой сбора мусора, можно не беспокоиться об исключенных “из обращения” строках. Однако вы должны четко понимать, что ссылочные переменные типа string
    , конечно же, могут менять объекты, на которые они ссылаются.
    А вот последовательность символов конкретного string
    -объекта после его создания изменить уже нельзя.
    Чтобы создать строку, которую можно изменять, в C# предусмотрен класс
    StringBuilder
    , определенный в пространстве имен
    System.Text
    . И все же в большинстве случаев лучше использовать тип string
    , а не класс
    StringBuilder
    Класс String
    Класс
    String определен в пространстве имен
    System
    . Он реализует интерфейсы
    IComparable
    ,
    ICloneable
    ,
    IConvertible и
    IEnumerable.String
    — это sealed
    -класс, т.е. из него нельзя создать производный класс. Класс
    String содержит C#- средства обработки строк. Он лежит в основе встроенного C#-типа string и является частью среды .NET Framework. Следующие разделы посвящены детальному рассмотрению класса
    String
    Э

    Глава 20. Строки и форматирование
    543
    Конструкторы класса String
    В классе
    String определено несколько конструкторов, которые позволяют создавать строки различными способами. Чтобы создать строку из символьного массива, используйте один из следующих конструкторов: public String(char[]
    chrs
    ) public String(char[]
    chrs
    , int
    start
    , int
    count
    )
    Первый формат предназначен для построения строки, которая будет состоять из символов, содержащихся в массиве
    chrs
    . Строка, создаваемая с помощью второго формата, будет состоять из
    count
    символов, взятых из массива
    chrs
    , начиная с символа, индекс которого задан параметром
    start
    Существует также возможность создать строку, содержащую заданный символ, повторенный нужное количество раз. Для этого используйте этот конструктор: public String(char
    ch
    , int
    count
    )
    Здесь параметр
    ch
    задает символ, который будет повторен
    count
    раз. Используя один из следующих конструкторов, можно создать строку, заданную указателем на символьный массив: unsafe public String(char*
    chrs
    ) unsafe public String(char*
    chrs
    , int
    start
    , int
    count
    )
    Конструктор первого формата предназначен для построения строки, содержащей символы, на которые указывает параметр
    chrs
    . При этом предполагается, что параметр
    chrs
    указывает на массив с завершающим нулем (символом конца строки). Строка, создаваемая с помощью конструктора второго формата, будет состоять из
    count
    символов, взятых из массива, адресуемого указателем
    chrs
    , начиная с символа, индекс которого задан параметром
    start
    Используя один из следующих конструкторов, можно создать строку, заданную указателем на массив байтов: unsafe public String(sbyte*
    chrs
    ) unsafe public String(sbyte*
    chrs
    , int
    start
    , int
    count
    ) unsafe public String(sbyte*
    chrs
    , int
    start
    , int
    count
    ,
    Encoding
    en
    )
    Конструктор первого формата предназначен для построения строки, содержащей байты, на которые указывает параметр
    chrs
    . При этом предполагается, что параметр
    chrs
    указывает на массив с завершающим нулем (символом конца строки). Строка, создаваемая с помощью конструктора второго формата, будет состоять из
    count
    байтов, взятых из массива, адресуемого указателем
    chrs
    , начиная с байта, индекс которого задан параметром
    start
    . Третий формат конструктора позволяет указать тип кодирования байтов. По умолчанию используется тип
    ASCIIEncoding
    . Класс
    Encoding определен в пространстве имен
    System.Text
    Строковый литерал создает строковый объект автоматически. Поэтому строковый объект часто инициализируется присваиванием ему строкового литерала. Вот пример: string str = "новая строка";
    Поле, индексатор и свойство класса String
    В классе string определено только одно поле: public static readonly string Empty
    Поле
    Empty определяет пустую строку, т.е. строку, которая не содержит символов.
    Не следует путать ее с нулевой (пустой) ссылкой типа
    String
    , которая просто ссылается на несуществующий объект.

    544
    Часть II. Библиотека C#
    В классе
    String определен единственный индексатор, предназначенный только для чтения: public char this[int
    idx
    ] { get; }
    Этот индексатор позволяет получить символ по заданному индексу. Подобно массивам, индексация в строках начинается с нуля. Поскольку объекты
    String не подлежат изменению, в том, что класс
    String поддерживает индексатор, предназначенный только для чтения, есть здравый смысл.
    В классе
    String определено единственное свойство, предназначенное только для чтения: public int Length { get; }
    Свойство
    Length возвращает количество символов, содержащихся в строке.
    Операторы класса String
    В классе
    String реализована перегрузка двух операторов: “
    ==
    ” и “
    !=
    ”. Чтобы узнать, равны ли две строки, используйте оператор “
    ==
    ”. Если оператор “
    ==
    ” применяется к объектным ссылкам, то он определяет, ссылаются ли они обе на один и тот же объект. Но если оператор “
    ==
    ” применяется к двум ссылкам типа
    String
    , то сравнивается содержимое самих строк. То же справедливо и для оператора “
    !=
    ”: при сравнении
    String
    - объектов сравнивается содержимое строк. Но что касается других операторов отношений
    (например, “
    <
    ” или “
    >=
    ”), то они сравнивают ссылки точно так же, как объекты любых других типов. Чтобы узнать, например, больше (меньше) ли одна строка другой, используйте метод
    Compare()
    , определенный в классе
    String
    Методы класса String
    В классе
    String определено множество различных методов. При этом многие из них имеют два или больше перегруженных форматов. Поэтому вместо бессмысленного их перечисления, рассмотрим лишь наиболее употребимые методы и продемонстрируем их использование на конкретных примерах.
    Сравнение строк
    Из всех операций обработки строк, возможно, чаще всего используется операция сравнения одной строки с другой. Поэтому в классе
    String предусмотрен широкий выбор методов сравнения, которые перечислены в табл. 20.1. Самый универсальный из них — метод
    Compare()
    . Он может сравнивать две строки целиком или по частям, причем с учетом (или без) прописного или строчного варианта букв (т.е. регистра клавиатуры). В общем случае при сравнении строк, т.е. при определении того, больше ли одна строка другой, меньше или они равны, используется лексикографический порядок. При этом можно также задать специальную информацию (форматы данных, присущие естественному языку, диалекту или территориальному образованию), которая может повлиять на результат сравнения.
    Использование нескольких версий метода
    Compare()
    демонстрируется в следующей программе:
    // Сравнение строк. using System; class CompareDemo { public static void Main() { string str1 = "один"; string str2 = "один";

    Глава 20. Строки и форматирование
    545 string str3 = "ОДИН"; string str4 = "два"; string str5 = "один, два"; if(String.Compare(str1, str2) == 0)
    Console.WriteLine(str1
    +
    " и " + str2 + " равны."); else
    Console.WriteLine(str1
    +
    " и " + str2 + " не равны."); if(String.Compare(str1, str3) == 0)
    Console.WriteLine(str1
    +
    " и " + str3 + " равны."); else
    Console.WriteLine(str1
    +
    " и " + str3 + " не равны."); if(String.Compare(str1, str3, true) == 0)
    Console.WriteLine(str1
    +
    " и " + str3 +
    " равны без учета регистра."); else
    Console.WriteLine(str1
    +
    " и " + str3 +
    " не равны без учета регистра."); if(String.Compare(str1, str5) == 0)
    Console.WriteLine(str1
    +
    " и " + str5 + " равны."); else
    Console.WriteLine(str1
    +
    " и " + str5 + " не равны."); if(String.Compare(str1, 0, str5, 0, 3) == 0)
    Console.WriteLine("Первая часть строки " + str1 + " и " + str5
    +
    " равны."); else
    Console.WriteLine("Первая часть строки " + str1 + " и " + str5
    +
    " не равны."); int result = String.Compare(str1, str4); if(result < 0)
    Console.WriteLine(str1
    +
    " меньше " + str4); else if(result > 0)
    Console.WriteLine(str1
    +
    " больше " + str4); else
    Console.WriteLine(str1
    +
    " равно " + str4);
    }
    }
    Результаты выполнения этой программы таковы: один и один равны. один и ОДИН не равны. один и ОДИН равны без учета регистра. один и один, два не равны.
    Первая часть строки один и один, два равны. один больше два

    546
    Часть II. Библиотека C#
    Таблица 20.1. Методы сравнения, определенные в классе String
    Метод
    Описание
    public static int
    Compare( string
    str1
    , string
    str2
    )
    Сравнивает строку, адресуемую параметром
    str1
    , со строкой, адресуемой параметром
    str2
    . Возвращает положительное число, если строга
    str1
    больше
    str2
    , отрицательное число, если
    str1
    меньше
    str2
    , и нуль, если строки
    str1
    и
    str2
    равны public static int
    Compare( string
    str1
    , string
    str2
    , bool
    ignoreCase
    )
    Сравнивает строку, адресуемую параметром
    str1
    , со строкой, адресуемой параметром
    str2
    . Возвращает положительное число, если строка
    str1
    больше
    str2
    , отрицательное число, если
    str1
    меньше
    str2
    , и нуль, если строки
    str1
    и
    str2
    равны.
    Если параметр
    ignoreCase
    равен значению true
    , при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются public static int
    Compare( string
    str1
    , string
    str2
    , bool
    ignoreCase
    ,
    CultureInfo
    ci
    )
    Сравнивает строку, адресуемую параметром
    str1
    , со строкой, адресуемой параметром
    str2
    , с использованием специальной информации (связанной с конкретным естественным языком, диалектом или территориальным образованием), переданной в параметре
    ci
    . Возвращает положительное число, если строка
    str1
    больше
    str2
    , отрицательное число, если
    str1
    меньше
    str2
    , и нуль, если строки
    str1
    и
    str2
    равны. Если параметр
    ignoreCase
    равен значению true
    , при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Класс
    CultureInfo определен в пространстве имен
    System.Globalization public static int
    Compare( string
    str1
    , int
    start1
    , string
    str2
    , int
    start2
    , int
    count
    )
    Сравнивает части строк, заданных параметрами
    str1
    и
    str2
    Сравнение начинается со строковых элементов
    str1[start1]
    и
    str2[start2]
    и включает
    count
    символов. Метод возвращает положительное число, если часть строки
    str1
    больше части строки
    str2
    , отрицательное число, если
    str1
    - часть меньше
    str2
    -части, и нуль, если сравниваемые части строк
    str1
    и
    str2
    равны public static int
    Compare( string
    str1
    , int
    start1
    , string
    str2
    , int
    start2
    , int
    count
    , bool
    ignoreCase
    )
    Сравнивает части строк, заданных параметрами
    str1
    и
    str2
    Сравнение начинается со строковых элементов
    str1[start1]
    и
    str2[start2]
    и включает
    count
    символов. Метод возвращает положительное число, если часть строки
    str1
    больше части строки
    str2
    , отрицательное число, если
    str1
    -часть меньше
    srtr2
    -части, и нуль, если сравниваемые части строк
    str1
    и
    str2
    равны. Если параметр
    ignoreCase
    равен значению true
    , при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются public static int
    Compare( string
    str1
    , int
    start1
    , string
    stx2
    , int
    start2
    , int
    count
    , bool
    ignoreCase
    ,
    CultureInfo
    ci
    )
    Сравнивает части строк, заданных параметрами
    str1
    и
    str2
    , с использованием специальной информации (связанной с конкретным естественным языком, диалектом или территориальным образованием), переданной в параметре
    ci
    Сравнение начинается со строковых элементов
    str1[start1]
    и
    str2[start2]
    и включает
    count
    символов. Метод возвращает положительное число, если часть строки
    str1
    больше части строки
    str2
    , отрицательное число, если
    str1
    -часть меньше
    str2
    -части, и нуль, если сравниваемые части строк
    str1
    и
    str2
    равны. Если параметр
    ignoreCase
    равен значению true
    , при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Класс
    CultureInfo определен в пространстве имен
    System.Globalization

    Глава 20. Строки и форматирование
    547
    Окончание табл. 20.1
    Метод
    Описание
    public static int
    CompareOrdinal( string
    str1
    , string
    str2
    )
    Сравнивает строку, адресуемую параметром
    str1
    , со строкой, адресуемой параметром
    str2
    , независимо от языка, диалекта или территориального образования. Возвращает положительное число, если строка
    str1
    больше
    str2
    , отрицательное число, если
    str1
    меньше
    str2
    , и нуль, если строки
    str1
    и
    str2
    равны public static int
    CompareOrdinal( string
    str1
    , int
    start1
    , string
    str2
    , int
    start2
    , int
    count
    )
    Сравнивает части строк, заданных параметрами
    str1
    и
    str2
    , независимо от языка, диалекта или территориального образования. Сравнение начинается со строковых элементов
    str1[start1]
    и
    str2[start2]
    и включает
    count
    символов.
    Метод возвращает положительное число, если часть строки
    str1
    больше части строки
    str2
    , отрицательное число, если
    str1
    -часть меньше
    str2
    -части, и нуль, если сравниваемые части строк
    str1
    и
    str2
    равны public int CompareTo( object
    str
    )
    Сравнивает вызывающую строку со строкой, заданной параметром
    str
    . Возвращает положительное число, если вызывающая строка больше строки
    str
    , отрицательное число, если вызывающая строка меньше строки
    str
    , и нуль, если сравниваемые строки равны public int CompareTo( string
    str
    )
    Сравнивает вызывающую строку со строкой, заданной параметром
    str
    . Возвращает положительное число, если вызывающая строка больше строки
    str
    , отрицательное число, если вызывающая строка меньше строки
    str
    , и нуль, если сравниваемые строки равны
    1   ...   31   32   33   34   35   36   37   38   ...   52


    написать администратору сайта