Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Выпуск 9


Информационный Канал Subscribe.Ru

Профессинальное программирование на .NET


Выпуск 9

Здравствуйте, уважаемые подписчики!

Сайт рассылки - DeveloperGuru.NET. Не стеснейтесь задавать вопросы и писать отзывы на сайте или на email.

.NET

7 ноября, как и было обещано, вышла Visual Studio 2005, причем в пяти редакциях: Visual Studio 2005 Express, Visual Studio 2005 Standart Edition, Visual Studio 2005 Professional Edition, Visual Studio 2005 Tools for Office, Visual Studio 2005 Team System. Сравнительная таблица различий редакций.

Кроме того, совершенно официально, Visual Studio Express можно скачать бесплатно в течение года (http://msdn.microsoft.com/vstudio/express/).

Обобщения (Generics)

Обобщения являются одним из основных нововведений в C# 2.0 и многие другие новые возможности основаны на их использовании. Обобщения позволяют разрабатывать классы и методы с использованием типов, которые специфицируются при объявлении и создании экземпляра клиентским кодом. Например:

public class KeyValue <kT, vT> { private kT key; private vT value; public kT Key { get { return this.key; } set { this.key = value; } } public vT Value { get { return this.value; } set { this.value = value; } } }

В данном примере мы определили класс KeyValue, параметризировав два типа: kT (для ключа) и vT (для значения). Конкретные типы указываются при объявлении переменной класса и создании экземпляра:

KeyValue<int, double> keyValue1 = new KeyValue<int, double>(); KeyValue<int, double> keyValue2 = new KeyValue<int, double>();


Использование обобщений позволяет проектировать базовые библиотеки классов с контролем типов и избежать упаковки / распаковки при использовании структурных типов. В .NET Framework 2.0 в пространстве имен System.Collections.Generic содержатся интерфейсы и классы для создания типизированных коллекций, которые обеспечивают лучший контроль типов и быстродействие, чем необобщенные коллекции.

Nullable типы

Давайте, теперь, попробуем сами сделать что-то полезное с помощью обобщений. Часто, при работе с примитивными типами (int, bool, float и т.п.), возникает необходимость хранить неопределенное значение. Особенно это важно при работе с базой данных, где в полях могут храниться значения null. Для решения этой задачи определим обобщенный структурный тип MyNullable:

public struct MyNullable<T> { private T value; private bool hasValue; public MyNullable(T value) { this.value = value; this.hasValue = true; } public static implicit operator MyNullable<T>(T value) { return new MyNullable<T>(value); } public bool HasValue { get { return this.hasValue; } } public T Value { get { if(!this.hasValue) { throw new Exception("No Value Exception!"); } return this.value; } } }


В переменной класса value хранится типизированное значение. hasValue определяет, содержит ли экземпляр значение, отличное от null. Получить значение можно через открытое свойство Value.

MyNullable<int> i = 5; Console.WriteLine(i.HasValue); Console.WriteLine(i.Value); int i2 = i.Value; i = new MyNullable<int>(); // Присвоим null Console.WriteLine(i.HasValue); Console.WriteLine(i.Value); // Значение неопределено - exception


К сожалению, присваивание null происходит ненаглядно, так как нельзя присвоить null типу struct.
В .NET Framework 2.0 уже есть подобный класс - это System.Nullable. Более того, он позволяет присваивать null, при этом компилятор заменяет такое присваивание на использованную нами конструкцию. Но это еще не все. Для Nullable типов существует специальный синтаксис с использованием знака "?". Следующие две строки эквивалентны:

Nullable<int> i1 = 10; int? i2 = 10;


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

Логическая задача

Как всегда, сначала, ответ на задачу из предыдущего выпуска (Логические задачи: три выключателя в коридоре).

Это задача, которая кажется не имеющей решения. Если вы выключите все выключатели, то свет не будет гореть (и ваш поход в комнату вам ничего не скажет). Если же вы включите один из выключателей, вероятность того, что вы выбрали нужный, -один к трем. Если повезет, то свет будет гореть, и вы найдете нужный выключатель, но в двух из трех случаев свет гореть не будет, и у вас не будет возможности определить, какой из двух выключенных выключателей включает свет в комнате. Если вы включите два из трех выключателей или все три, то столкнетесь со сходными проблемами.
Если по другому это сформулировать: для идентификации одного объекта из трех нужны два бита информации. Ваш единственный визит в комнату дает вам только один бит информации.
Если бы это были выключатели, которые не просто включают или выключают свет, но регулируют его интенсивность, задачу было бы легко решить. Вы бы один из них включили на полную мощность, второй выключили бы, а третий включили бы на 50 процентов. Тогда состояние лампочки подсказало бы вам, какой из выключателей ее контролирует.
Это, конечно, было бы решением, но головоломка была бы неинтересной, если бы в ее условии упоминался такой важный факт. Тем не менее это "решение" привлекает внимание к важному обстоятельству: если бы существовал способ установить один из выключателей в "промежуточное положение", а не просто в положение "включено" или "выключено", это позволило бы решить задачу.
Вот решение: пронумеруйте выключатели 1, 2 и 3. Затем включите выключатели 1 и 2 и выключите выключатель номер 3. Подождите примерно десять минут. Затем выключите выключатель номер 1, включите выключатель номер 2 и немедленно отправляйтесь в комнату.
Если свет там горит, значит, его включает выключатель номер 2. Если свет не горит, но лампочка теплая, его контролирует выключатель номер 1. Если свет не горит и лампочка холодная, его контролирует выключатель 3.

Теперь, новая логическая задача.


 
"Brilliant," said Hermione. "This isn't magic - it's logic - a puzzle. A lot of the greatest wizards haven't got an ounce of logic, they'd be stuck in here forever."
Harry Potter and the Sorcer's Stone
 
"Замечательно," сказала Гермиона "Это не магия - это логика - логическая задача. Многие волшебники не имеют ни капли логики, они бы остались здесь навеки."
Гарри Поттер и Филосовский Камень

Я уверен, все слышали о юном волшебнике Гарри Поттере из книги английской писательницы Джоан Роуллинг. Сегодня предлагаю вашему вниманию задачу, которую пришлось решать юным героям.

В конце первой книги о Гарри Поттере - "Гарри Поттер и филосовский камень", Гарри и Гермиона попадают в комнату с двумя выходами, закрытыми магическим огнем (в фильме этот эпизод, к сожалению, отсутствует). В комнате стоит стол, на котором находится семь бутылочек разного размера и записка:

Danger lies before you, while safety lies behind,
Two of us will help you, whichever you would find,
Опасность находится перед вами, а безопасноть позади,
Двое из нас помогут вам, а какие - вам надо найти,
One among us seven will let you move ahead,
Another will transport the drinker back instead,
Одна из семи позволит вам дальше пройти,
Другая, наоборот, отправит любого назад,
Two among our number hold only nettle wine,
Three of us are killers, waiting hidden in line.
Крапивное вино находится в двух из нас,
Трое других из выстроившихся в ряд, содержат яд.
Choose, unless you wish to stay here forevermore,
To help you in your choice, we give you these clues four:
Выбери, если ты не хочешь остаться здесь навсегда,
Чтобы помочь, должны мы четыре подсказки вам дать:
First, however slyly the poison tries to hide
You will always find some on nettle wine's left side;
Во-первых, как бы хитро не прятался яд,
всегда от крапивного вина он будет слева стоять;
Second, different are those who stand at either end,
But if you would move onward, neither is your friend;
Во-вторых, различны напитки с обеих концов,
Но если ты хочешь идти вперед, никто из них не поможет;
Third, as you see clearly, all are different size,
Neither dwarf nor giant holds death in their insides;
В-третьих, как ты видишь, все мы разного размера,
Ни карлик и ни гигант не содержат смерти в себе;
Fourth, the second left and the second on the right
Are twins once you taste them, though different at first sight.

В-четвертых, второй слева и второй справа
Являются близнецами на вкус, хотя и различны на вид.

Те, кто читал книгу, наверное, помнят, что Гермиона, немного поразмыслив, определила, из какой бутылочки надо выпить, чтобы пройти вперед и какая поможет вернуться назад. Правда, она видела бутылочки и могла воспользоваться третим ключом, а у читателей такой возможности небыло. Неясно, почему в книге нет изображения бутылочек. Возможно, какой-то редактор посчитал эту задачу слишком сложной для читателей и "заботливо" вырезал.

На приведенной картинке вы видите одну из возможных комбинаций расположения бутылочек.

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

Самые нетерпеливые могут проверить ответ на сайте - Логическая задача из книги "Гарри Поттер и филосовский камень".

На этом все. Желаю приятного программирования.


Технологический партнер рассылки:
PARKING.RU.
Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows®: поддержка .NET-приложений, управление сайтом, аренда бизнес-приложений, сертифицированные специалисты.


 


Вопросы? Пожелания? Пишите: author@developerguru.net

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.gurudotnet
Архив рассылки
Отписаться
Вспомнить пароль

В избранное