» » » Герберт Шилдт - C# 4.0: полное руководство


Авторские права

Герберт Шилдт - C# 4.0: полное руководство

Здесь можно скачать бесплатно "Герберт Шилдт - C# 4.0: полное руководство" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование, издательство ООО "И.Д. Вильямс", год 2011. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Герберт Шилдт - C# 4.0: полное руководство
Рейтинг:
Название:
C# 4.0: полное руководство
Издательство:
ООО "И.Д. Вильямс"
Год:
2011
ISBN:
978-5-8459-1684-6
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

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

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "C# 4.0: полное руководство"

Описание и краткое содержание "C# 4.0: полное руководство" читать бесплатно онлайн.



В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.


Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию






  public void Show(T x) {

    Console.WriteLine(x);

  }

}


В данном случае метод Show() просто выводит на экран строковое представление переменной х, получаемое в результате неявного обращения к методу ToString() из метода WriteLine().

После этого объявляется иерархия классов, как показано ниже.


// Создать простую иерархию классов,

class Alpha {

  public override string ToString() {

    return "Это объект класса Alpha.";

  }

  // ...

}


class Beta : Alpha {

  public override string ToString() {

    return "Это объект класса Beta.";

  }

  // ...

}


Ради большей наглядности классы Alpha и Beta несколько отличаются от аналогичных классов из предыдущего примера применения ковариантности. Обратите также внимание на то, что метод ToString() переопределяется таким образом, чтобы возвращать тип объекта.

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


// Создать ссылку из интерфейса IMyContraVarGenIF<Alpha>

//на объект типа MyClass<Alpha>.

// Это вполне допустимо как при наличии контравариантности, так и без нее.

 IMyContraVarGenIF<Alpha> AlphaRef = new MyClass<Alpha>();


// Создать ссылку из интерфейса IMyContraVarGenIF<beta>

// на объект типа MyClass<Beta>.

//И это вполне допустимо как при наличии контравариантности, так и без нее.

IMyContraVarGenIF<Beta> BetaRef = new MyClass<Beta>();


// Создать ссылку из интерфейса IMyContraVarGenIF<beta>

// на объект типа MyClass<Alpha>.

// *** Это вполне допустимо благодаря контравариантности. ***

IMyContraVarGenIF<Beta> BetaRef2 = new MyClass<Alpha>();


// Этот вызов допустим как при наличии контравариантности, так и без нее.

BetaRef.Show(new Beta());


// Присвоить переменную AlphaRef переменной BetaRef.

// *** Это вполне допустимо благодаря контравариантности. ***

BetaRef = AlphaRef;

BetaRef.Show(new Beta());


Прежде всего, обратите внимание на создание двух переменных ссылочного типа IMyContraVarGenIF, которым присваиваются ссылки на объекты класса MyClass, где параметры типа совпадают с аналогичными параметрами в интерфейсных ссылках. В первом случае используется параметр типа Alpha, а во втором — параметр типа Beta. Эти объявления не требуют контравариантности и допустимы в любом случае.

Далее создается переменная ссылочного типа IMyContraVarGenIF<Beta>, но на этот раз ей присваивается ссылка на объект класса MyClass<Alpha>. Эта операция вполне допустима, поскольку обобщенный тип Т объявлен как контравариантный.

Как и следовало ожидать, следующая строка, в которой вызывается метод BetaRef.Show() с аргументом Beta, является вполне допустимой. Ведь Beta — это обобщенный тип Т в классе MyClass<Beta> и в то же время аргумент в методе Show().

В следующей строке переменная AlphaRef присваивается переменной BetaRef. Эта операция вполне допустима лишь в силу контравариантности. В данном случае переменная относится к типу MyClass<Beta>, а переменная AlphaRef — к типу MyClass<Alpha>. Но поскольку Alpha является базовым классом для класса Beta, то такое преобразование типов оказывается допустимым благодаря контравариантности. Для того чтобы убедиться в необходимости контравариантности в рассматриваемом здесь примере, попробуйте удалить ключевое слово in из объявления обобщенного типа Т в интерфейсе IMyContraVarGenIF, а затем попытайтесь скомпилировать приведенный выше код еще раз. В результате появятся ошибки компиляции.

Ради большей наглядности примера вся рассмотренная выше последовательность операций собрана ниже в единую программу.


// Продемонстрировать контравариантность в обобщенном интерфейсе,

using System;


// Это обобщенный интерфейс, поддерживающий контравариантность.

public interface IMyContraVarGenIF<in T> {

  void Show(T obj);

}


// Реализовать интерфейс IMyContraVarGenIF.

class MyClass<T> : IMyContraVarGenIF<T> {

  public void Show(T x) {

    Console.WriteLine(x);

  }

}


// Создать простую иерархию классов,

class Alpha {

  public override string ToString() {

    return "Это объект класса Alpha.";

  }

  // ...

}


class Beta : Alpha {

  public override string ToString() {

    return "Это объект класса Beta.";

  }

  // ...

}


class VarianceDemo {

  static void Main() {

    // Создать ссылку из интерфейса IMyContraVarGenIF<Alpha>

    //на объект типа MyClass<Alpha>.

    // Это вполне допустимо как при наличии контравариантности, так и без нее.

    IMyContraVarGenIF<Alpha> AlphaRef = new MyClass<Alpha>();


    // Создать ссылку из интерфейса IMyContraVarGenIF<beta>

    // на объект типа MyClass<Beta>.

    //И это вполне допустимо как при наличии контравариантности,

    // так и без нее.

    IMyContraVarGenIF<Beta> BetaRef = new MyClass<Beta>();


    // Создать ссылку из интерфейса IMyContraVarGenIF<beta>

    //на объект типа MyClass<Alpha>.

    // *** Это вполне допустимо благодаря контравариантности. ***

    IMyContraVarGenIF<Beta> BetaRef2 = new MyClass<Alpha>();


    // Этот вызов допустим как при наличии контравариантности, так и без нее.

    BetaRef.Show(new Beta());


    // Присвоить переменную AlphaRef переменной BetaRef.

    // *** Это вполне допустимо благодаря контравариантности. ***

    BetaRef = AlphaRef;

    BetaRef.Show(new Beta());

  }

}


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


Это объект класса Beta.

Это объект класса Beta.


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


public interface IMyContraVarGenIF2<in Т> : IMyContraVarGenIF<T> {

  // ...

}


Следует иметь в виду, что указывать ключевое слово in в объявлении базового интерфейса не только не нужно, но и не допустимо. Более того, сам расширенный интерфейс IMyContraVarGenIF2 не обязательно должен быть контравариантным. Иными словами, обобщенный тип Т в интерфейсе IMyContraVarGenIF2 не требуется модифицировать ключевым словом in. Разумеется, все преимущества, которые сулит контравариантность в интерфейсе IMyContraVarGen, при этом будут утрачены в интерфейсе IMyContraVarGenIF2.

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


Вариантные делегаты

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


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "C# 4.0: полное руководство"

Книги похожие на "C# 4.0: полное руководство" читать онлайн или скачать бесплатно полные версии.


Понравилась книга? Оставьте Ваш комментарий, поделитесь впечатлениями или расскажите друзьям

Все книги автора Герберт Шилдт

Герберт Шилдт - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Отзывы о "Герберт Шилдт - C# 4.0: полное руководство"

Отзывы читателей о книге "C# 4.0: полное руководство", комментарии и мнения людей о произведении.

  1. BOT20.02.2021, 13:02
    сКОРО КУПЛЮ
А что Вы думаете о книге? Оставьте Ваш отзыв.