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

  • Метод

  • Сортировка массивов и поиск заданного элемента

  • Свойство

  • Генерирование случайных чисел с помощью класса Random

  • Интерфейсы IFormatProvider и IFormattable

  • Справочник по 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
    страница34 из 52
    1   ...   30   31   32   33   34   35   36   37   ...   52
    522
    Часть II. Библиотека C# for(i=0; i < str.Length; i++) {
    Console.Write(str[i]
    +
    " является"); if(Char.IsDigit(str[i]))
    Console.Write(" цифрой"); if(Char.IsLetter(str[i]))
    Console.Write(" буквой"); if(Char.IsLower(str[i]))
    Console.Write(" строчной"); if(Char.IsUpper(str[i]))
    Console.Write(" прописной "); if(Char.IsSymbol(str[i]))
    Console.Write(" символическим знаком"); if(Char.IsSeparator(str[i]))
    Console.Write(" разделителем"); if(Char.IsWhiteSpace(str[i]))
    Console.Write(" пробелом"); if(Char.IsPunctuation(str[i]))
    Console.Write(" знаком пунктуации");
    Console.WriteLine();
    }
    Console.WriteLine("Исходная строка: " + str);
    //
    Преобразуем в буквы в прописные. string newstr = ""; for(i=0; i < str.Length; i++) newstr
    +=
    Char.ToUpper(str[i]);
    Console.WriteLine("После преобразования: " + newstr);
    }
    }
    Результаты выполнения этой программы таковы:
    Э является буквой прописной т является буквой строчной о является буквой строчной является разделителем пробелом п является буквой строчной р является буквой строчной о является буквой строчной с является буквой строчной т является буквой строчной о является буквой строчной й является буквой строчной является разделителем пробелом т является буквой строчной е является буквой строчной с является буквой строчной т является буквой строчной
    . является знаком пунктуации является разделителем пробелом
    $ является символическим знаком
    2 является цифрой
    3 является цифрой
    Исходная строка: Это простой тест. $23
    После преобразования: ЭТО ПРОСТОЙ ТЕСТ. $23

    Глава 19. Пространство имен System
    523
    Структура Boolean
    Структура Boolean предназначена для поддержки типа данных bool
    . Методы, определенные в структуре Boolean, перечислены в табл. 19.10. В ней также определены следующие поля: public static readonly string FalseString public static readonly string TrueString
    Они содержат удобные для восприятия человеком формы логических констант true и false
    . Например, если вывести значение
    FalseString с помощью метода
    WriteLine()
    , будет отображена строка “
    False
    ”.
    Структура Boolean реализует интерфейсы
    IComparable и
    IConvertible
    Таблица 19.10. Методы, определенные в структуре Boolean
    Метод
    Описание
    public int CompareTo( object
    v
    )
    Сравнивает значение вызывающего объекта со значением параметра
    v
    . Возвращает нуль, если сравниваемые значения равны. Возвращает отрицательное число, если вызывающий объект имеет значение false
    , а параметр
    v

    true
    . Возвращает положительное число, если вызывающий объект имеет значение true
    , a параметр
    v
    — false public override bool
    Equals(object
    v
    )
    Возвращает значение true
    , если значение вызывающего объекта равно значению параметра
    v
    public override int
    GetHashCode()
    Возвращает хеш-код для вызывающего объекта public TypeCode
    GetTypeCode()
    Возвращает значение перечисления
    TypeCode для структуры
    Boolean
    , т.е.
    TypeCode.Boolean public static bool
    Parse(string
    str
    )
    Возвращает bool
    -эквивалент строки, содержащейся в параметре
    str
    . Если эта строка не содержит ни вариант

    True
    ”, ни “
    False
    ”, генерируется исключение. При этом не важно, какие буквы здесь используются; прописные или строчные public override string
    ToString()
    Возвращает строковое представление значения вызывающего объекта string ToString(
    IForroatProvider
    fmtpvdr
    )
    Возвращает строковое представление значения вызывающего объекта с использованием заданной в параметре
    fmtpvdr
    информации о представлении данных, соответствующем конкретному естественному языку, диалекту или территориальному образованию
    Класс Array
    Один из самых полезных классов в пространстве имен
    System

    Array
    Array
    — это базовый класс для всех массивов в C#. Следовательно, его методы можно применять для массивов любого из встроенных типов, а также массивов, тип которых вы создадите сами. Свойства, определенные в классе
    Array
    , перечислены в табл. 19.11, а методы — в табл. 19.12.
    Класс
    Array реализует следующие интерфейсы:
    ICloneable
    ,
    ICollection
    ,
    IEnumerable и
    IList
    . Интерфейсы
    ICollection
    ,
    IEnumerable и
    IList определены в пространстве имен
    System.Collections и описаны в главе 22.

    524
    Часть II. Библиотека C#
    В ряде методов класса
    Array используется параметр интерфейсного типа
    IComparer
    В этом интерфейсе, принадлежащем пространству имен
    System.Collections
    , определен метод
    Compare()
    , который сравнивает значения двух объектов. int Compare(object
    v1
    , object
    v2
    )
    Этот метод возвращает положительное число, если значение
    v1
    больше значения
    v2
    ,
    отрицательное число, если
    v1
    меньше
    v2
    , и нуль, если сравниваемые значения равны.
    В следующих разделах демонстрируется выполнение наиболее употребимых операций над массивами.
    Сортировка массивов и поиск заданного элемента
    Одной из наиболее употребимых операций, выполняемых над массивами, является сортировка. Поэтому класс
    Array поддерживает множество методов сортировки элементов массива. Используя метод
    Sort()
    , можно отсортировать весь массив, его часть или два массива, которые содержат соответствующие пары “ключ/значение”. В отсортированном массиве можно организовать эффективный поиск заданных элементов с помощью метода
    BinarySearch()
    . Рассмотрим программу, в которой на основе int
    -массива показано использование методов
    Sort()
    и
    BinarySearch()
    :
    // Сортировка массива и поиск в кем заданного значения. using System; class SortDemo { public static void Main() { int[] nums = { 5, 4, 6, 3, 14, 9, 8, 17, 1, 24, -1, 0 };
    //
    Отображаем исходный порядок следования
    // элементов в массиве.
    Console.Write("Исходный порядок: "); foreach(int i in nums)
    Console.Write(i + " ");
    Console.WriteLine();
    //
    Сортируем массив.
    Array.Sort(nums);
    //
    Отображаем отсортированный массив.
    Console.Write("Порядок после сортировки: "); foreach(int i in nums)
    Console.Write(i + " ");
    Console.WriteLine();
    //
    Выполняем поиск числа 14. int idx = Array.BinarySearch(nums, 14);
    Console.WriteLine("Индекс значения 14 равен " + idx);
    }
    }
    Результаты выполнения этой программы таковы:
    Исходный порядок:
    5 4 6 3 14 9 8 17 1 24 -1 0
    Порядок после сортировки:
    -1 0 1 3 4 5 6 8 9 14 17 24
    Индекс значения 14 равен 9

    Глава 19. Пространство имен System
    525
    В предыдущем примере массив имел базовый тип int
    , т.е. нессылочный тип. Все методы, определенные в классе
    Array
    , автоматически применимы для всех встроенных нессылочных типов. Но совсем иначе обстоит дело с массивами объектных ссылок. Чтобы выполнить сортировку или поиск значения в массиве объектных ссылок, тип класса этих объектов должен реализовать интерфейс
    IComparable
    . Если класс не реализует этот интерфейс, при попытке выполнить сортировку или поиск значения в массиве будет динамически сгенерировано исключение. К счастью, интерфейс
    IComparable реализовать нетрудно, поскольку он состоит только из одного метода: int CompareTo(object
    v
    )
    Этот метод сравнивает вызывающий объект со значением в параметре
    v
    . Он возвращает положительное число, если вызывающий объект больше значения
    v
    , нуль, если два сравниваемых объекта равны, и отрицательное число, если вызывающий объект меньше значения
    v
    . Рассмотрим пример программы, которая иллюстрирует сортировку и поиск в массиве, состоящем из объектов класса, определенного пользователем:
    // Сортировка и поиск в массиве объектов. using System; class MyClass : IComparable { public int i; public MyClass(int x) { i = x;
    }
    //
    Реализуем интерфейс IComparable. public int CompareTo(object v) { return i - ((MyClass)v).i;
    }
    } class SortDemo { public static void Main() {
    MyClass[] nums = new MyClass[5]; nums[0] = new MyClass(5); nums[1] = new MyClass(2); nums[2] = new MyClass(3); nums[3] = new MyClass(4); nums[4] = new MyClass(1);
    //
    Отображаем исходный порядок следования элементов
    // в массиве.
    Console.Write("Исходный порядок;
    "); foreach(MyClass o in nums)
    Console.Write(o.i + " ");
    Console.WriteLine();
    //
    Сортируем массив.
    Array.Sort(nums);
    //
    Отображаем отсортированный массив.
    Console.Write("Порядок после сортировки: "); foreach(MyClass o in nums)
    Console.Write(o.i + " ");
    Console.WriteLine();

    526
    Часть II. Библиотека C#
    //
    Поиск объекта MyClass(2).
    MyClass x = new MyClass(2); int idx = Array.BinarySearch(nums, x);
    Console.WriteLine("Индекс объекта MyClass(2) равен " + idx);
    }
    }
    Результаты выполнения этой программы таковы:
    Исходный порядок:
    5 2 3 4 1
    Порядок после сортировки:
    1 2 3 4 5
    Индекс объекта MyClass(2) равен 1
    Реверсирование массива
    Иногда полезно реверсировать содержимое массива. Например, может потребоваться заменить массив, который был отсортирован в возрастающем порядке, массивом, отсортированном в убывающем порядке. Выполнить реверсирование нетрудно: достаточно вызвать метод
    Reverse()
    . С помощью этого метода можно реверсировать весь массив или только некоторую его часть. Этот процесс демонстрируется в следующей программе:
    // Реверсирование массива. using System; class ReverseDemo { public static void Main() { int[] nums = { 1, 2, 3, 4, 5 };
    //
    Отображаем исходный порядок.
    Console.Write("Исходный порядок:
    "); foreach(int i in nums)
    Console.Write(i + " ");
    Console.WriteLine();
    //
    Реверсируем весь массив.
    Array.Reverse(nums);
    //
    Отображаем обратный порядок.
    Console.Write("Обратный порядок:
    "); foreach(int i in nums)
    Console.Write(i + " ");
    Console.WriteLine();
    //
    Реверсируем часть массива.
    Array.Reverse(nums, 1, 3);
    //
    Отображаем порядок при частичном
    // реверсировании массива.
    Console.Write("После частичного реверсирования: "); foreach(int i in nums)
    Console.Write(i + " ");
    Console.WriteLine();
    }
    }

    Глава 19. Пространство имен System
    527
    Результаты выполнения этой программы таковы:
    Исходный порядок:
    1 2 3 4 5
    Обратный порядок:
    5 4 3 2 1
    После частичного реверсирования: 5 2 3 4 1
    Копирование массивов
    Копирование всего массива или некоторой его части — еще одна часто используемая операция. Чтобы скопировать массив, используйте метод
    Сору()
    . Этот метод может помешать элементы в начало массива-приемника или в середину, в зависимости от того, какую версию метода
    Сору()
    вы используете. Использование метода
    Сору()
    демонстрируется в следующей программе:
    // Копирование массива. using System; class CopyDemo { public static void Main() { int[] source = { 1, 2, 3, 4, 5 }; int[] target = { 11, 12, 13, 14, 15 }; int[] source2 = { -1, -2, -3, -4, -5 };
    //
    Отображаем массив-источник копирования.
    Console.Write("Массив-источник: "); foreach(int i in source)
    Console.Write(i + " ");
    Console.WriteLine();
    //
    Отображаем исходное содержимое массива-приемника.
    Console.Write(
    "Исходное содержимое массива-приемника: "); foreach(int i in target)
    Console.Write(i + " ");
    Console.WriteLine();
    //
    Копируем весь массив.
    Array.Copy(source, target, source.Length);
    //
    Отображаем копию массива.
    Console.Write("Приемник после копирования: "); foreach(int i in target)
    Console.Write(i + " ");
    Console.WriteLine();
    //
    Копируем в середину массива target.
    Array.Copy(source2, 2, target, 3, 2);
    //
    Отображаем результат частичного копирования.
    Console.Write(
    "Приемник после частичного копирования: "); foreach(int i in target)
    Console.Write(i + " ");
    Console.WriteLine();
    }
    }

    528
    Часть II. Библиотека C#
    Результаты выполнения этой программы таковы:
    Массив-источник: 1 2 3 4 5
    Исходное содержимое массива-приемника: 11 12 13 14 15
    Приемник после копирования: 1 2 3 4 5
    Приемник после частичного копирования: 1 2 3-3-4
    Таблица 19.11. Свойства, определенные в классе Array
    Свойство
    Описание
    public virtual bool
    IsFixedSize { get; }
    Предназначено только для чтения. Принимает значение true
    , если массив имеет фиксированный размер, и false
    , если массив может динамически его изменять public virtual bool
    IsReadOnly { get; }
    Предназначено только для чтения. Принимает значение true
    , если объект класса
    Array предназначен только для чтения, и false в противном случае public virtual bool
    IsSynchronized { get; }
    Предназначено только для чтения. Принимает значение true
    , если массив можно безопасно использовать в многопоточной среде, и false в противном случае public int Length { get; }
    Предназначено только для чтения. Содержит количество элементов в массиве public int Rank { get; }
    Предназначено только для чтения. Содержит размерность массива public virtual object
    SyncRoot { get; }
    Предназначено только для чтения. Содержит объект, который должен быть использован для синхронизации доступа к массиву
    Таблица 19.12, Методы, определенные в классе Array
    Метод
    Описание
    public static int
    BinarySearch(
    Array
    a
    , object
    v
    )
    В массиве, заданном параметром
    а
    , выполняет поиск значения, заданного параметром
    v
    . Возвращает индекс первого вхождения искомого значения. Если оно не найдено, возвращает отрицательное число. Массив
    а
    должен быть отсортированным и одномерным public static int
    BinarySearch(
    Array
    a
    , object
    v
    ,
    IComparer
    comp
    )
    В массиве, заданном параметром
    а
    , выполняет поиск значения, заданного параметром
    v
    , с использованием метода сравнения, заданного параметром
    comp
    Возвращает индекс первого вхождения искомого значения.
    Если оно не найдено, возвращает отрицательное число.
    Массив
    а
    должен быть отсортированным и одномерным public static int
    BinarySearch(
    Array
    a
    , int
    start
    , int
    count
    , object
    v
    )
    В части массива, заданного параметром
    а
    , выполняет поиск значения, заданного параметром
    v
    , Поиск начинается с индекса, заданного параметром
    start
    , и охватывает
    count
    элементов. Возвращает индекс первого вхождения искомого значения. Если оно не найдено, возвращает отрицательное число. Массив
    а
    должен быть отсортированным и одномерным public static int
    BinarySearch(
    Array
    a
    , int
    start
    , int
    count
    , object
    v
    ,
    IComparer
    comp
    )
    В части массива, заданного параметром
    а
    , выполняет поиск значения, заданного параметром
    v
    , с использованием метода сравнения, заданного параметром
    comp
    . Поиск начинается с индекса, заданного параметром
    start
    , и охватывает
    count
    элементов. Возвращает индекс первого вхождения искомого значения. Если оно не найдено, возвращает отрицательное число. Массив а должен быть отсортированным и одномерным

    Глава 19. Пространство имен System
    529
    Продолжение табл. 19.12
    Метод
    Описание
    public static void Clear(
    Arrау
    а
    , int
    start
    , int
    count
    )
    Устанавливает заданные элементы равными нулю.
    Диапазон элементов, подлежащих обнулению, начинается с индекса, заданного параметром
    start
    , и включает
    count
    элементов public virtual object Clone()
    Возвращает копию вызывающего массива. Эта копия ссылается на те же элементы, что и оригинал, за что получила название "поверхностной". Это означает, что изменения, вносимые в элементы, влияют на оба массива, поскольку они оба используют одни и те же элементы public static void Copy(
    Array
    source
    ,
    Array
    dest
    , int
    count
    )
    Копирует
    count
    элементов из массива
    source
    в массив
    dest
    . Копирование начинается с начальных элементов каждого массива. Если оба массива имеют одинаковый ссылочный тип, метод
    Сору()
    создает "поверхностную копию", в результате чего оба массива будут ссыпаться на одни и те же элементы public static void Copy(
    Array
    source
    , int
    srcStart
    ,
    Array
    dest
    , int
    destStart
    , int
    count
    )
    Копирует
    count
    элементов из массива
    source
    (начиная с элемента с индексом
    srcStart
    ) в массив
    dest
    (начиная с элемента с индексом
    destStart
    ). Если оба массива имеют одинаковый ссылочный тип, метод
    Cору()
    создает "поверхностную копию", в результате чего оба массива будут ссылаться на одни и те же элементы public virtual void CopyTo(
    Array
    dest
    , int
    start
    )
    Копирует элементы вызывающего массива в массив
    dest
    , начиная с элемента
    dest[start]
    public static Array
    CreateInstance(
    Type
    t
    , int
    size
    )
    Возвращает ссылку на одномерный массив, который содержит
    size
    элементов типа
    t
    public static Array
    CreateInstance(
    Type
    t
    , int
    size1
    , int
    size2
    )
    Возвращает ссылку на двумерный массив размером
    size1*size2
    . Каждый элемент этого массива имеет тип
    t
    public static Array
    CreateInstance(
    Type
    t
    , int
    size1
    , int
    size2
    , int
    size3
    )
    Возвращает ссылку на трехмерный массив размером
    size1*size2*size3
    . Каждый элемент этого массива имеет тип
    t
    public static Array
    CreateInstance(
    Type
    t
    , int[]
    sizes
    )
    Возвращает ссылку на многомерный массив, размерности которого заданы в массиве
    sizes
    . Каждый элемент этого массива имеет тип
    t
    public static Array
    CreateInstance(
    Type
    t
    , int[]
    sizes
    , int[]
    startIndexes
    )
    Возвращает ссылку на многомерный массив, размерности которого заданы в массиве
    sizes
    . Каждый элемент этого массива имеет тип
    t
    . Начальный индекс каждой размерности задан в массиве
    startIndexes
    . Таким образом, этот метод позволяет создавать массивы, которые начинаются с некоторого индекса, отличного от нуля public override bool Equals( object
    v
    )
    Возвращает значение
    true
    , если значение вызывающего объекта равно значению параметра
    v
    public virtual IEnumerator
    GetEnumerator()
    Возвращает нумераторный объект для массива. Нумератор позволяет опрашивать массив в цикле. Нумераторы описаны в главе 22, "Коллекции"

    530
    Часть II. Библиотека C#
    Продолжение табл. 19.12
    Метод
    Описание
    public int GetLength( int
    dim
    )
    Возвращает длину заданной размерности. Отсчет размерностей начинается с нуля; следовательно, для получения длины первой размерности необходимо передать методу значение 0, а для получения длины второй — значение 1 public int GetLowerBound( int
    dim
    )
    Возвращает начальный индекс заданной размерности, который обычно равен нулю. Параметр
    dim
    ориентирован на то, что отсчет размерностей начинается с нуля; следовательно, для получения начального индекса первой размерности необходимо передать методу значение 0, а для получения начального индекса второй — значение 1 public override int
    GetHashCode()
    Возвращает хеш-код для вызывающего объекта public TypeCode GetTypeCode()
    Возвращает значение перечисления
    TypeCode для класса
    Array
    , т.е.
    TypeCode.Array public int GetUpperBound( int
    dim
    )
    Возвращает конечный индекс заданной размерности, который обычно равен нулю. Параметр
    dim
    ориентирован на то, что отсчет размерностей начинается с нуля; следовательно, для получения конечного индекса первой размерности необходимо передать методу значение 0, а для получения конечного индекса второй — значение 1 public object GetValue( int
    idx
    )
    Возвращает значение элемента вызывающего массива с индексом
    idx
    . Массив должен быть одномерным public object GetValue( int
    idx1
    , int
    idx2
    )
    Возвращает значение элемента вызывающего массива с индексами
    [idx1, idx2]
    . Массив должен быть двумерным public object GetValue ( int
    idx1
    , int
    idx2
    , int
    idx3
    )
    Возвращает значение элемента вызывающего массива с индексами
    [idx1, idx2, idx3]
    . Массив должен быть трехмерным public object GetValue( int[]
    idxs
    )
    Возвращает значение элемента вызывающего массива с индексами, заданными с помощью параметра
    idxs
    Вызывающий массив должен иметь столько размерностей, сколько элементов в массиве
    idxs
    public static int IndexOf(
    Array
    a
    , object
    v
    )
    Возвращает индекс первого элемента одномерного массива
    а
    , который имеет значение, заданное параметром
    v
    Возвращает -1, если искомое значение не найдено, (Если массив имеет нижнюю границу, отличную от 0, признак неудачного выполнения метода будет равен значению нижней границы, уменьшенному на 1) public static int IndexOf(
    Array
    a
    , object
    v
    , int
    start
    )
    Возвращает индекс первого элемента одномерного массива
    а
    , который имеет значение, заданное параметром
    v
    . Поиск начинается с элемента
    а[start]
    . Возвращает -1, если искомое значение не найдено. (Если массив имеет нижнюю границу, отличную от 0, признак неудачного выполнения метода будет равен значению нижней границы, уменьшенному на 1) public static int IndexOf(
    Array
    a
    , object
    v
    , int
    start
    , int
    count
    )
    Возвращает индекс первого элемента одномерного массива
    а
    , который имеет значение, заданное параметром
    v
    . Поиск начинается с элемента
    a[start]
    и охватывает
    count
    элементов. Метод возвращает -1, если внутри заданного диапазона искомое значение не найдено. (Если массив имеет нижнюю границу, отличную от 0, признак неудачного выполнения метода будет равен значению нижней границы, уменьшенному на 1)

    Глава 19. Пространство имен System
    531
    Продолжение табл. 19.12
    Метод
    Описание
    public void Initialize()
    Инициализирует каждый элемент вызывающего массива посредством вызова конструктора по умолчанию, соответствующего конкретному элементу. Этот метод можно использовать только для массивов нессылочных типов public static int
    LastIndexOf(
    Array
    a
    , object
    v
    )
    Возвращает индекс последнего элемента одномерного массива
    а
    , который имеет значение, заданное параметром
    v
    . Возвращает -1, если искомое значение не найдено. (Если массив имеет нижнюю границу, отличную от 0, признак неудачного выполнения метода будет равен значению нижней границы, уменьшенному на 1) public static int
    LastIndexOf(
    Array
    a
    , object
    v
    , int
    start
    )
    Возвращает индекс последнего элемента заданного диапазона одномерного массива
    а
    , который имеет значение, заданное параметром
    v
    . Поиск осуществляется в обратном порядке, начиная с элемента
    а[start]
    и заканчивая элементом
    а[0]
    , Метод возвращает число -1, если искомое значение не найдено. (Если массив имеет нижнюю границу, отличную от 0, признак неудачного выполнения метода будет равен значению нижней границы, уменьшенному на 1) public static int
    LastIndexOf(
    Array
    a
    , object
    v
    , int
    start
    , int
    count
    )
    Возвращает индекс последнего элемента заданного диапазона одномерного массива
    а
    , который имеет значение, заданное параметром
    v
    . Поиск осуществляется в обратном порядке, начиная с элемента
    a[start]
    , и охватывает
    count
    элементов. Метод возвращает -1, если внутри заданного диапазона искомое значение не найдено. (Если массив имеет нижнюю границу, отличную от 0, признак неудачного выполнения метода будет равен значению нижней границы, уменьшенному на 1) public static void Reverse(
    Array
    a
    )
    Меняет на обратный порядок следования элементов в массиве
    а
    public static void Reverse(
    Array
    a
    , int
    start
    , int
    count
    )
    Меняет на обратный порядок следования элементов в заданном диапазоне массива
    а
    . Упомянутый диапазон начинается с элемента
    a[start]
    и включает
    count
    элементов
    Public void SetValue( object
    v
    , int
    idx
    )
    Устанавливает в вызывающем массиве элемент с индексом
    idx
    равным значению
    v
    . Массив должен быть одномерным public void SetValue( object
    v
    , int
    idx1
    , int
    idx2
    )
    Устанавливает в вызывающем массиве элемент с индексами
    [idx1, idx2]
    равным значению
    v
    . Массив должен быть двумерным public void SetValue( object
    v
    , int
    idx1
    , int
    idx2
    , int
    idx3
    )
    Устанавливает в вызывающем массиве элемент с индексами
    [idx1, idx2, idx3]
    равным значению
    v
    . Массив должен быть трехмерным public void SetValue( object
    v
    , int[]
    idxs
    )
    Устанавливает в вызывающем массиве элемент с индексами, заданными параметром
    idxs
    , равным значению
    v
    . Вызывающий массив должен столько размерностей, сколько элементов в массиве
    idxs
    public static void Sort(
    Array
    a
    )
    Сортирует массив
    а
    в порядке возрастания. Массив должен быть одномерным public static void Sort(
    Array
    a
    ,
    IComparer
    comp
    )
    Сортирует массив
    а
    в порядке возрастания с использованием метода сравнения, заданного параметром
    comp
    . Массив должен быть одномерным

    532
    Часть II. Библиотека C#
    Окончание табл. 19.12
    Метод
    Описание
    public static void Sort(
    Array
    k
    ,
    Array
    v
    )
    Сортирует в порядке возрастания два заданных одномерных массива. Массив
    k
    содержит ключи сортировки, а массив
    v
    — значения, связанные с этими ключами. Следовательно, эти два массива должны содержать пары ключ/значение. После сортировки элементы обоих массивов расположены в порядке возрастания ключей public static void Sort(
    Array
    k
    ,
    Array
    v
    ,
    IComparer
    comp
    )
    Сортирует в порядке возрастания два заданных одномерных массива с использованием метода сравнения, заданного параметром
    comp
    . Массив
    k
    содержит ключи сортировки, а массив
    v
    - значения, связанные с этими ключами.
    Следовательно, эти два массива должны содержать пары ключ/значение. После сортировки элементы обоих массивов расположены в порядке возрастания ключей public static void Sort(
    Array
    a
    , int
    start
    , int
    count
    )
    Сортирует заданный диапазон массива в порядке возрастания.
    Упомянутый диапазон начинается с элемента
    а[start]
    и включает
    count
    элементов. Массив должен быть одномерным public static void Sort(
    Array
    a
    , int
    start
    int
    count
    ,
    IComparer
    comp
    )
    Сортирует заданный диапазон массива в порядке возрастания с использованием метода сравнения, заданного параметром
    comp
    . Упомянутый диапазон начинается с элемента
    a[start]
    и включает
    count
    элементов. Массив должен быть одномерным public static void Sort(
    Array
    k
    ,
    Array
    v
    , int
    start
    , int
    count
    )
    Сортирует заданный диапазон двух одномерных массивов в порядке возрастания. В обоих массивах диапазон сортировки начинается с индекса, переданного в параметре
    start
    , и включает
    count
    элементов. Массив
    k
    содержит ключи сортировки, а массив
    v
    — значения, связанные с этими ключами. Следовательно, эти два массива должны содержать пары ключ/значение. После сортировки элементы диапазонов обоих массивов расположены в порядке возрастания ключей public static void Sort(
    Array
    k
    ,
    Array
    v
    , int
    start
    , int
    count
    ,
    IComparer
    comp
    )
    Сортирует заданный диапазон двух одномерных массивов в порядке возрастания с использованием метода сравнения, заданного параметром
    comp
    . В обоих массивах диапазон сортировки начинается с индекса, переданного в параметре
    start
    , и включает
    count
    элементов. Массив
    k
    содержит ключи сортировки, а массив
    v
    — значения, связанные с этими ключами. Следовательно, эти два массива должны содержать пары ключ/значение. После сортировки элементы диапазонов обоих массивов расположены в порядке возрастания ключей
    Класс BitConverter
    При написании программ часто приходится преобразовывать данные встроенных типов в массив байтов. Например, некоторые устройства могут принимать целочисленные значения, но эти значения должны посылаться побайтно. Не менее часто встречается и обратная ситуация. Иногда данные должны быть организованы для приема в виде упорядоченной последовательности байтов, которые нужно преобразовать в значение одного из встроенных типов. Например, некоторое устройство может выводить целые числа, посылаемые как поток байтов. Для решения подобных проблем преобразования данных в C# и предусмотрен класс
    BitConverter

    Глава 19. Пространство имен System
    533
    Класс
    BitConverter содержит методы, представленные в табл. 19.13. В нем также определено следующее поле: public static readonly bool IsLittleEndian
    Это поле принимает значение true
    , если текущая операционная среда обрабатывает сначала слово с младшим (наименее значимым), а затем со старшим (наиболее значимым) байтом. Такой формат обработки (хранения и передачи) называется прямым, т.е. прямым порядком байтов, (“little-endian” format). Поле
    IsLittleEndian принимает значение false
    , если текущая операционная среда обрабатывает сначала слово со старшим
    (наиболее значимым), а затем с младшим (наименее значимым) байтом. Такой формат обработки называется обратным (“big-endian” format). Компьютеры, собранные на базе микропроцессора Pentium фирмы Intel, используют формат с прямым порядком байтов.
    Класс
    BitConverter является sealed
    -классом, т.е. не может иметь производных классов.
    Таблица 19.13. Методы, определенные в классе BitConverter
    Метод
    Описание
    public static long
    DoubleToInt64Bits( double
    v
    )
    Преобразует значение параметра
    v
    в целочисленное значение типа long и возвращает результат public static byte[] GetBytes( bool
    v
    )
    Преобразует значение параметра
    v
    в однобайтовый массив и возвращает результат public static byte[] GetBytes( char
    v
    )
    Преобразует значение параметра
    v
    в двубайтовый массив и возвращает результат public static byte[] GetBytes( double
    v
    )
    Преобразует значение параметра
    v
    в восьмибайтовый массив и возвращает результат public static byte[] GetBytes( float
    v
    )
    Преобразует значение параметра
    v
    в четырехбайтовый массив и возвращает результат public static byte[] GetBytes( int
    v
    )
    Преобразует значение параметра
    v
    в четырехбайтовый массив и возвращает результат public static byte[] GetBytes( long
    v
    )
    Преобразует значение параметра
    v
    в восьмибайтовый массив и возвращает результат public static byte[] GetBytes( short
    v
    )
    Преобразует значение параметра
    v
    в двубайтовый массив и возвращает результат public static byte[] GetBytes( uint
    v
    )
    Преобразует значение параметра
    v
    в четырехбайтовый массив и возвращает результат public static byte[] GetBytes( ulong
    v
    )
    Преобразует значение параметра
    v
    в восьмибайтовый массив и возвращает результат public static byte[] GetBytes( ushort
    v
    )
    Преобразует значение параметра
    v
    в двубайтовый массив и возвращает результат public static double
    Int64BitsToDouble( long
    v
    )
    Преобразует значение параметра
    v
    в значение с плавающей точкой типа double и возвращает результат public static bool ToBoolean( byte[]
    a
    , int
    idx
    )
    Преобразует элемент
    a[idx]
    байтового массива а в его bool
    -эквивалент и возвращает результат.
    Ненулевое значение преобразуется в значение true
    , а нулевое — в false public static char ToChar( byte[]
    a
    , int
    start
    )
    Преобразует два байта, начиная с элемента
    a[start]
    , в соответствующий char
    -эквивалент и возвращает результат

    534
    Часть II. Библиотека C#
    Окончание табл. 19.13
    Метод
    Описание
    public static double ToDouble( byte[]
    a
    , int
    start
    )
    Преобразует восемь байтов, начиная с элемента
    a[start]
    , в соответствующий double
    -эквивалент и возвращает результат public static short ToInt16( byte[]
    a
    , int
    start
    )
    Преобразует два байта, начиная с элемента
    а[start]
    , в соответствующий short
    -эквивалент и возвращает результат public static int ToInt32( byte[]
    a
    , int
    start
    )
    Преобразует четыре байта, начиная с элемента
    a[start]
    , в соответствующий int
    -зквивалент и возвращает результат public static long ToInt64( byte[]
    a
    , int
    start
    )
    Преобразует восемь байтов, начиная с элемента
    а[start]
    , в соответствующий long
    -эквивалент и возвращает результат public static float ToSingle( byte[]
    a
    , int
    start
    )
    Преобразует четыре байта, начиная с элемента
    а[start]
    , в соответствующий float
    -эквивалент и возвращает результат public static string ToString( byte[]
    a
    )
    Преобразует байты массива
    а
    в строку. Строка содержит шестнадцатеричные значения (связанные с этими байтами), разделенные дефисами public static string ToString( byte[]
    a
    , int
    start
    )
    Преобразует байты массива
    а
    , начиная с элемента
    a[start]
    , в строку. Строка содержит шестнадцатеричные значения (связанные с этими байтами), разделенные дефисами
    Public static string ToString( byte[]
    a
    , int
    start
    , int
    count
    )
    Преобразует
    count
    байт массива
    а
    , начиная с элемента
    a[start]
    , в строку. Строка содержит шестнадцатеричные значения (связанные с этими байтами), разделенные дефисами public static ushort ToUInt16( byte[]
    a
    , int
    start
    )
    Преобразует два байта, начиная с элемента
    a[start]
    , в соответствующий ushort
    -эквивалент и возвращает результат public static uint ToUInt32( byte[]
    a
    , int
    start
    )
    Преобразует четыре байта, начиная с элемента
    a[start]
    , в соответствующий uint
    -эквивалент и возвращает результат public static ulong ToUInt64( byte[]
    a
    , int
    start
    )
    Преобразует восемь байтов, начиная с элемента
    a[start]
    , в соответствующий ulong
    -эквивалент и возвращает результат
    Генерирование случайных чисел с помощью
    класса Random
    Чтобы сгенерировать последовательность псевдослучайных чисел, используйте класс
    Random
    . Последовательности случайных чисел используются во многих ситуациях, в том числе при моделировании и проведении имитационных экспериментов. Начало такой последовательности определяется некоторым начальным числом, которое автоматически предоставляется классом
    Random или задается явным образом.
    В классе
    Random определены следующие два конструктора: public Random() public Random(int
    seed
    )

    Глава 19. Пространство имен System
    535
    С помощью первой версии конструктора создается объект класса
    Random
    , который для вычисления начального числа последовательности случайных чисел использует системное время. При использовании второй версии конструктора начальное число задается в параметре
    seed
    Методы, определенные в классе
    Random
    , перечислены в табл. 19.14.
    Таблица 19.14. Методы, определенные в классе Random
    Метод
    Описание
    public virtual int Next()
    Возвращает следующее случайное число типа int
    , которое будет находиться в диапазоне
    0-Int32.MaxValue-1
    , включительно public virtual int
    Next( int
    upperBound
    )
    Возвращает следующее случайное число типа int
    , которое будет находиться в диапазоне
    0-
    upperBound
    -1
    , включительно public virtual int
    Next( int
    lowerBound
    , int
    upperBound
    )
    Возвращает следующее случайное число типа int
    , которое будет находиться в диапазоне
    lowerBound
    -
    upperBound-1
    , включительно public virtual void
    NextBytes( byte[]
    buf
    )
    Заполняет буфер
    buf
    последовательностью случайных целых чисел. Каждый байт в массиве будет находиться в диапазоне
    0-Byte.MaxValue-1
    , включительно public virtual double
    NextDouble()
    Возвращает следующее случайное число из последовательности (представленное в форме с плавающей точкой), которое будет больше или равно числу 0,0 и меньше
    1,0 protected virtual double
    Sample()
    Возвращает следующее случайное число из последовательности (представленное в форме с плавающей точкой), которое будет больше или равно числу 0,0 и меньше
    1,0. Чтобы создать несимметричное или специализированное распределение, этот метод необходимо переопределить а производном классе
    Рассмотрим программу, в которой демонстрируется использование класса
    Random посредством создания парных результатов игры в кости:
    // Автоматизированная игра в кости, using System; class RandDice { public static void Main() {
    Random ran = new Random();
    Console.Write(ran.Next(1, 7) + " ");
    Console.WriteLine(ran.Next(1,
    7));
    }
    }
    Вот как выглядят результаты нашей “игры” в три хода:
    5 2 4 4 1 6
    Работа программы начинается с создания объекта класса
    Random
    . Затем она запрашивает два случайных числа, которые находятся в диапазоне 1—6.

    536
    Часть II. Библиотека C#
    Управление памятью и класс GC
    В классе
    GC
    инкапсулировано C#-средство сбора мусора. Методы, определенные в этом классе, представлены в табл. 19.15. В нем также определено следующее свойство, предназначенное только для чтения: public static int MaxGeneration { get; }
    Свойство
    MaxGeneration содержит номер поколения самой старой области выделенной памяти. При каждом выделении памяти (т.е при использовании оператора new
    ) новой выделяемой области присваивается номер поколения, равный нулю Номера, соответствующие ранее выделенным областям памяти, при этом увеличиваются.
    Следовательно, свойство
    MaxGeneration означает номер области памяти, которая была выделена раньше других Наличие номеров поколений способствует повышению эффективности процесса сбора мусора.
    В большинстве приложений программисты не пользуются возможностями класса
    GC
    Но в отдельных случаях они могут оказаться весьма полезными Например, метод
    Collect()
    позволяет выполнять сбор мусора в удобное для вас время. Обычно это происходит в моменты, неизвестные вашей программе. Но поскольку процесс сбора мусора занимает некоторое время, у вас могут быть вполне обоснованные причины для того, чтобы это не происходило при выполнении критических с точки зрения времени задач, либо вы хотели бы для сбора мусора и других вспомогательных операций использовать вынужденные периоды ожидания (простоя).
    GC
    — это sealed
    -класс, т.е он не может иметь потомков
    Таблица 19.15. Методы, определенные в классе GС
    Метод
    Описание
    public static void
    Collect()
    Инициализирует процесс сбора мусора public static void
    Collect( int
    MaxGen
    )
    Инициализирует процесс сбора мусора для областей памяти с номерами поколений от 0 до
    MaxGen
    public static int
    GetGeneration(object
    o
    )
    Возвращает номер поколения для области памяти, на которую ссылается параметр
    о
    public static int
    GetGeneration(
    WeakReference
    o
    )
    Возвращает номер поколения для области памяти, адресуемой "слабой" ссылкой, заданной параметром
    о
    Наличие "слабой" ссылки не защищает объект от угрозы подвергнуться процессу сбора мусора public static long
    GetTotalMemory( bool
    collect
    )
    Возвращает общий объем выделенной памяти (в байтах) на данный момент Если параметр
    collect
    равен значению true
    , до выдачи результата выполняется сбор мусора public static void
    KeepAlive(object
    o
    )
    Создает ссылку на объект о, тем самым защищая его от угрозы подвергнуться операции сбора мусора public static void
    ReRegisterForFmalize( object
    o
    )
    Вызывает выполнение деструктора Этот метод аннулирует действие Метода
    SuppressFinalize()
    public static void
    SuppressFinalize( object
    o
    )
    Препятствует выполнению деструктора public static void
    WaitForPendingFinalizers()
    Прекращает выполнение вызывающего потока до тех пор, пока не будут выполнены все незаконченные деструкторы

    Глава 19. Пространство имен System
    537
    Класс Object
    Object
    — это класс, который лежит в основе C#-типа object
    . Члены класса
    Object рассматривались в главе 11, но ввиду его центральной роли в C# (и ради удобства читателя) его методы снова приводятся в табл. 19.16. В классе
    Object определен один конструктор:
    Object()
    Этот конструктор создает пустой объект.
    Таблица 19.16. Методы, определенные в классе Object
    Метод
    Назначение
    public virtual bool Equals( object
    ob
    )
    Возвращает значение true
    , если вызывающий объект является таким же, как объект, адресуемый параметром
    ob
    . В противном случае возвращает значение false public static bool Equals( object
    ob1
    , object
    ob2
    )
    Возвращает значение true
    , если объект
    ob1
    является таким же, как объект
    ob2
    . В противном случае возвращает значение false protected Finalize()
    Выполняет завершающие действия перед процессом сбора мусора. В C# метод
    Finalize() доступен через деструктор public virtual int
    GetHashCode()
    Возвращает хеш-код, связанный с вызывающим объектом public Type GetType()
    Получает тип объекта во время выполнения программы protected object
    MemberwiseClone()
    Выполняет "поверхностное копирование" объекта, т.е. копируются члены, но не объекты, на которые ссылаются эти члены public static bool
    ReferenceEquals( object
    ob1
    , object
    ob2
    )
    Возвращает значение true
    , если объекты
    ob1
    и
    ob2
    ссылаются на один и тот же объект. В противном случае возвращает значение false public virtual string
    ToString()
    Возвращает строку, которая описывает объект
    Интерфейс IComparable
    Во многих классах необходимо реализовать интерфейс
    IComparable
    , поскольку он с помощью методов, определенных в C#-библиотеке, позволяет сравнить два объекта.
    Интерфейс
    IComparable легко реализовать, поскольку он состоит только из одного метода: int CompareTo(object
    v
    )
    Этот метод сравнивает вызывающий объект со значением параметра
    v
    . Метод возвращает положительное число, если вызывающий объект больше объекта
    v
    , нуль, если два сравниваемых объекта равны, и отрицательное число, если вызывающий объект меньше объекта
    v

    538
    Часть II. Библиотека C#
    Интерфейс IConvertible
    Интерфейс
    IConvertible реализован всеми структурами нессылочных типов. Он определяет преобразование типов. Как правило, в создаваемых программистами классах этот интерфейс реализовать не нужно.
    Интерфейс ICloneable
    Реализуя интерфейс
    ICloneable
    , вы позволяете создавать копию объекта. В интерфейсе
    ICloneable определен только один метод: object Clone()
    Этот метод создает копию вызывающего объекта. От того, как реализован метод
    Clone()
    , зависит вид создаваемой копии. Существует два вида копий: детальная и поверхностная. При создании копии первого вида копия и оригинал совершенно независимы. Следовательно, если исходный объект содержит ссылку на другой объект
    O
    , то в результате детального копирования будет также создана копия объекта
    O
    . В поверхностной копии копируются члены, но не объекты, на которые ссылаются эти члены.
    Если объект ссылается на другой объект
    O
    , то по окончании поверхностного копирования как копия, так и исходный объект будут ссылаться на один и тот же объект
    O
    , и любые изменения, вносимые в объект
    O
    , отразятся и на копии, и на оригинале. Обычно метод
    Clone()
    реализуется так, чтобы выполнялось детальное копирование. Поверхностные копии можно создавать с помощью метода
    MemberwiseClone()
    , который определен в классе
    Object
    Рассмотрим пример, который иллюстрирует использование интерфейса
    ICloneable
    . В следующей программе создается класс
    Test
    , который содержит ссылку на класс
    X
    . В классе
    Test для создания детальной копии используется метод
    Clone()
    // Демонстрация использования интерфейса ICloneable. using System; class X { public int a; public X(int x) { a = x;
    }
    } class Test : ICloneable { public X o; public int b; public Test(int x, int y) { o = new X(x); b = y;
    } public void show(string name) {
    Console.
    Write("Значения объекта " + name + " : ");
    Console.WriteLine("o.a: {0}, b: {1}", o.a, b);
    }

    Глава 19. Пространство имен System
    539
    //
    Создаем детальную копию вызывающего объекта. public object Clone() {
    Test temp = new Test(o.a, b); return temp;
    }
    } class CloneDemo { public static void Main() {
    Test ob1 = new Test(10, 20); ob1.show("ob1");
    Console.WriteLine(
    "Создаем объект оb2 как клон объекта ob1.");
    Test ob2 = (Test) ob1. Clone(); ob2.show("ob2");
    Console.WriteLine("Заменяем член ob1.o.a числом 99, "
    + "а член ob1.b числом 88."); ob1.o.a = 99; ob1.b = 88; ob1.show("ob1"); ob2.show("ob2");
    }
    }
    Результаты выполнения этой программы таковы:
    Значения объекта ob1 : o.a: 10, b: 20
    Создаем объект оb2 как клон объекта ob1.
    Значения объекта оb2 : o.a: 10, b: 20
    Заменяем член ob1.o.a числом 99, а член ob1.b числом 88.
    Значения объекта ob1 : o.a: 99, b: 88
    Значения объекта оb2 : o.a: 10, b 20
    Судя по приведенным результатам, объект оb2
    является копией объекта ob1
    , но ob1
    и оb2
    — отдельные объекты. Изменение одного никак не отражается на другом. Это достигается за счет того, что для копии создается новый объект
    X
    , которому присваивается то же значение, которое имеет объект
    X
    в оригинале.
    Для реализации поверхностного копирования достаточно организовать внутри метода
    Clone()
    вызов метода
    MemberwiseClone()
    , определенного в классе
    Object
    Попробуйте, например, изменить определение метода
    Clone() из предыдущей программы таким:
    // Создаем поверхностную копию вызывающего объекта. public object Clone() {
    Test temp = (Test) MemberwiseClone(); return temp;
    }
    После внесения указанных изменений результаты выполнения той же программы будут другими:
    Значения объекта ob1 : o.a: 10, b: 20
    Создаем объект оb2 как клон объекта ob1.
    Значения объекта оb2 : o.a: 10, b: 20
    Заменяем член ob1.o.a числом 99, а член ob1.b числом 88.

    540
    Часть II. Библиотека C#
    Значения объекта ob1 : o.a: 99, b: 88
    Значения объекта оb2 : o.a: 99, b: 20
    Обратите внимание на то, что член о
    в объекте ob1
    и член о
    в объекте оb2
    ссылаются на один и тот же объект
    X
    . Теперь изменение одного объекта отражается на другом. Но int
    -поля b
    в каждом объекте по-прежнему независимы, поскольку имеют нессылочный тип и доступ к ним осуществляется не через ссылки.
    Интерфейсы IFormatProvider и IFormattable
    Интерфейс
    IFormatProvider определяет один метод
    GetFormat()
    , который возвращает объект, управляющий форматированием данных строки, удобной для восприятия человеком. Общий формат метода
    GetFormat()
    таков: object GetFormat(Type
    fmt
    )
    Здесь параметр
    fmt
    задает формат объекта. Форматирование описано в главе 20.
    Интерфейс
    IFormattable поддерживает форматирование выводимого результата в удобной для восприятия человеком форме. В интерфейсе
    IFormattable определен следующий метод: string ToString(string
    fmt
    , IFormatProvider
    fmtpvdr
    )
    Здесь параметр
    fmt
    задает инструкции форматирования, а параметр
    fmtpvdr
    — источник (поставщик) формата. Подробно форматирование описано в главе 20.

    Полный справочник по
    1   ...   30   31   32   33   34   35   36   37   ...   52


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