Чтение онлайн

на главную - закладки

Жанры

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

struct XY<T> where Т : struct {

// ...

Создание обобщенного метода

Как следует из приведенных выше примеров, в методах, объявляемых в обобщенных классах, может использоваться параметр типа из данного класса, а следовательно, такие методы автоматически становятся обобщенными по отношению к параметру типа. Но помимо этого имеется возможность объявить обобщенный метод со своими собственными параметрами типа и даже создать обобщенный метод, заключенный в необобщенном классе.

Рассмотрим

для начала простой пример. В приведенной ниже программе объявляется необобщенный класс ArrayUtils, а в нем — статический обобщенный метод Copy Insert . Этот метод копирует содержимое одного массива в другой, вводя по ходу дела новый элемент в указанном месте. Метод CopylnsertO можно использовать вместе с массивами любого типа.

// Продемонстрировать применение обобщенного метода, using System;

// Класс обработки массивов. Этот класс не является обобщенным, class ArrayUtils {

// Копировать массив, вводя по ходу дела новый элемент.

// Этот метод является обобщенным.

public static bool CopyInsert<T> (Т e, uint idx,

T[] src, T[] target) {

// Проверить, насколько велик массив, if(target.Length < src.Length+1) return false;

// Скопировать содержимое массива src в целевой массив,

// попутно введя значение е по- индексу idx. for(int i=0, j=0; i < src.Length; i++, j++) { if(i == idx) { target[j] = e; j++;

}

target[j] = src[i];

}

return true;

}

}

class GenMethDemo { static void Main {

int[] nums = { 1, 2, 3 }; int[] nums2 = new int [4];

// Вывести содержимое массива nums.

Console.Write("Содержимое массива nums: ") ; foreach(int x in nums)

Console.Write(х + " ") ;

Console.WriteLine ;

// Обработать массив типа int.

ArrayUtils.Copylnsert(99, 2, nums, nums2);

// Вывести содержимое массива nums2.

Console.Write("Содержимое массива nums2: "); foreach(int x in nums2)

Console.Write(x + " ") ;

Console.WriteLine;

//А теперь обработать массив строк, используя метод copylnsert. string[] strs = {"Обобщения", "весьма", "эффективны."}; string[] strs2 = new string[4];

// Вывести содержимое массива strs.

Console.Write("Содержимое массива strs: "); foreach(string s in strs)

Console.Write(s + " ");

Console.WriteLine;

// Ввести элемент в массив строк.

ArrayUtils.Copylnsert("в

С#", 1, strs, strs2);

// Вывести содержимое массива strs2.

Console.Write("Содержимое массива strs2: "); foreach(string s in strs2)

Console.Write(s + " ");

Console.WriteLine;

// Этот вызов недопустим, поскольку первый аргумент // относится к типу double, а третий и четвертый // аргументы обозначают элементы массивов типа int.

// ArrayUtils.Copylnsert(0.01, 2, nums, nums2);

}

}

Вот к какому результату приводит выполнение этой программы.

Содержимое массива nums: 1 2 3 Содержимое массива nums2: 1 2 99.3

Содержимое массива strs: Обобщения весьма эффективны.

Содержимое массива strs2: Обобщения в C# весьма эффективны.

Внимательно проанализируем метод CopyInsert. Прежде всего обратите внимание на объявление этого метода в следующей строке кода.

public static bool CopyInsert<T>(Т e, uint idx,

T[] src, T[] target) {

Параметр типа объявляется после имени метода, но перед списком его параметров. Обратите также внимание на то, что метод Copylnsert является статическим, что позволяет вызывать его независимо от любого объекта. Следует, однако, иметь в виду, что обобщенные методы могут быть либо статическими, либо нестатическими. В этом отношении для тшх не существует никаких ограничений.

Далее обратите внимание на то, что метод Copylnsert вызывается в методе Main с помощью обычного синтаксиса и без указания аргументов типа. Дело в том, что типы аргументов различаются автоматически, а тип Т соответственно подстраивается. Этот процесс называется выводимостью типов. Например, в первом вызове данного метода

ArrayUtils.Copylnsert (99, 2, nums, nums2);

тип T становится типом int, поскольку числовое значение 99 и элементы массивов nums и num&2 относятся к типу int. А во втором вызове данного метода используются строковые типы, и поэтому тип Т заменяется типом string.

Поделиться:
Популярные книги

Вдовье счастье

Брэйн Даниэль
1. Ваш выход, маэстро!
Фантастика:
попаданцы
историческое фэнтези
фэнтези
5.00
рейтинг книги
Вдовье счастье

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Прорвемся, опера! Книга 4

Киров Никита
4. Опер
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прорвемся, опера! Книга 4

Возвышение Меркурия. Книга 12

Кронос Александр
12. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 12

Черный дембель. Часть 2

Федин Андрей Анатольевич
2. Черный дембель
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Черный дембель. Часть 2

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Как я строил магическую империю

Зубов Константин
1. Как я строил магическую империю
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Релокант

Ascold Flow
1. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант

Мужчина моей судьбы

Ардова Алиса
2. Мужчина не моей мечты
Любовные романы:
любовно-фантастические романы
8.03
рейтинг книги
Мужчина моей судьбы

Ученик. Книга вторая

Первухин Андрей Евгеньевич
2. Ученик
Фантастика:
фэнтези
5.40
рейтинг книги
Ученик. Книга вторая