Вход/Регистрация
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
вернуться

Троелсен Эндрю

Шрифт:

// При использовании с обобщениями оно представляет значение

// параметра типа, принимаемое по умолчанию.

public void ResetPoint {

 xPos = default(Т);

 yPos = default(T);

}

В C# 2005 ключевое слово default получило два значения. Кроме использования в конструкции switch, оно может использоваться для установки параметрам типа значений, принятых по умолчанию. И это, очевидно, полезно, поскольку обобщенный тип ничего заранее не знает о фактических замещающих значениях и поэтому не может с безопасностью предполагать о том. каким должно быть значение по умолчанию. Значения по умолчанию для параметра типа являются следующими.

• Для числовых значений значением по умолчанию является 0.

• Для ссылочных типов значением по умолчанию является null.

• Поля структуры устанавливаются равными 0 (для типов, характеризуемых значениями) или null (для ссылочных типов).

Для Point‹T› вы можете непосредственно установить xPos и yPos равными 0, поскольку вполне безопасно предполагать, что вызывающая сторона будет поставлять только числовые данные. Однако с помощью синтаксиса default(T) вы можете сделать обобщенный тип более гибким. В любом случае вы теперь можете использовать методы Point‹T› так.

static void Main(string[] args) {

 Console.WriteLine("***** Забавы с обобщениями *****\n");

 // Point с использованием int.

 Point‹int› p = new Point‹int›(10, 10);

 Console.WriteLine("p.ToString={0}", p.ToString);

 p.ResetPoint;

 Console.WriteLine("p.ToString={0}", p.ToString);

 Console.WriteLine;

 // Point с использованием double.

 Point‹double› p2 = new Point‹double›(5.4, 3.3);

 Console.WriteLine("p2.ToString={0}", p2.ToString);

 p2.ResetPoint;

 Console.WriteLine("p2.ToString={0}", p2.ToString);

 Console.WriteLine;

 // Обмен двух Point.

 Point‹int› pointA = new Point‹int›(50, 40);

 Point‹int› pointB = new Point‹int›(543, 1);

 Console.WriteLine("До обмена: {0}, {1}", pointA, pointB);

 Swap‹Point‹int> >(ref pointA, ref pointB);

 Console.WriteLine("После обмена: {0}, {1}", pointA, pointB);

 Console.ReadLine;

}

Соответствующий вывод показан на рис. 10.2.

Рис. 10.2. Использование обобщённого типа Point

Исходный код. Проект SimpleGenerics размещен в подкаталоге, соответствующем главе 10.

Создание пользовательских обобщенных коллекций

Итак, пространство имен System.Collections.Generic предлагает множество типов, позволяющих создавать эффективные контейнеры, удовлетворяющие требованиям типовой безопасности. С учетом множества доступных вариантов очень велика вероятность того, что в .NET 2.0 у вас вообще не возникнет необходимости в построении пользовательских типов коллекции. Тем не менее, чтобы показать, как строится обобщенный контейнер, нашей следующей задачей будет создание обобщенного класса коллекции, который мы назовем CarCollection‹Т›.

Подобно созданному выше необобщенному типу CarCollection, наш новый вариант будет использовать уже существующий тип коллекции для хранения своих элементов (в данном случае это List‹›). Будет реализована и поддержка цикла foreach путем реализации обобщенного интерфейса IEnumerable‹›. Обратите внимание на то, что IEnumerable‹› расширяет необобщенный интерфейс IEnumerable, поэтому компилятор ожидает, что вы реализуете две версии метода GetEnumerator. Вот как может выглядеть соответствующая модификация.

public class CarCollection‹T›: IEnumerable‹T› {

 private List‹T› arCars = new List‹T›;

 public T GetCar(int pos) { return arCars[pos]; }

 public void AddCar(T c) { arCars.Add(c); }

 public void ClearCars { arCars.Clear; }

 public int Count { get { return arCars.Count; } }

 // IEnumerable‹T› расширяет IEnumerable, поэтому

 // нужно реализовать обе версии GetEnumerator.

  • Читать дальше
  • 1
  • ...
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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