C Sharp 2.0 - C Sharp 2.0

Язык программирования C # вводит несколько новых функций в версии 2.0 (соответствует 3-му изданию стандарта ECMA-334 и .NET Framework 2.0 ). К ним относятся:

Возможности C # 2.0

Частичный класс

Частичные занятия позволяют распределить реализацию класса между несколькими файлами, при этом каждый файл содержит один или несколько членов класса. Это полезно прежде всего, когда части класса создаются автоматически. Например, эта функция активно используется разработчиками пользовательского интерфейса, генерирующими код, в Visual Studio.

file1.cs:

общественный частичный учебный класс Мой класс{    общественный пустота MyMethod1()    {        // Код, написанный вручную    }}

file2.cs:

общественный частичный учебный класс Мой класс{    общественный пустота MyMethod2()    {        // Автоматически сгенерированный код    }}

Дженерики

Дженерики, или параметризованные типы, или параметрический полиморфизм - это функция .NET 2.0, поддерживаемая C # и Visual Basic. В отличие от шаблонов C ++, параметризованные типы .NET создаются во время выполнения, а не компилятором; следовательно, они могут быть кросс-языковыми, тогда как шаблоны C ++ - нет. Они поддерживают некоторые функции, не поддерживаемые непосредственно шаблонами C ++, например ограничения типов для общих параметров с помощью интерфейсов. С другой стороны, C # не поддерживает универсальные параметры, не являющиеся типами. В отличие от дженериков в Java, дженерики .NET используют овеществление сделать параметризованные типы первоклассные объекты в CLI Виртуальная машина, которая позволяет оптимизировать и сохранять информацию о типе.[1]

Статические классы

Статические классы - это классы, которые нельзя создать или наследовать, и которые допускают только статические члены. Их цель аналогична цели модули на многих процедурных языках.

Функционал генератора

.NET 2.0 Framework позволила C # ввести итератор что обеспечивает генератор функциональность, используя доходность доходность строить аналогично урожай в Python.[2] С доходность доходность, функция автоматически сохраняет свое состояние во время итерации.

// Метод, принимающий итеративный ввод (возможно, массив)// и возвращает все четные числа.общественный статический IEnumerable<int> Получить еще(IEnumerable<int> числа){    для каждого (int я в числа)    {        если (я % 2 == 0)             урожай возвращаться я;    }}

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

Анонимные делегаты

Как предшественник лямбда-функции представленный в C # 3.0, C # 2.0 добавил анонимных делегатов. Они обеспечивают закрытие -подобная функциональность C #.[3] Код внутри тела анонимного делегата имеет полный доступ для чтения / записи к локальным переменным, параметрам метода и членам класса в области действия делегата, за исключением из и ссылка параметры. Например:-

int SumOfArrayElements(int[] множество){    int сумма = 0;    Множество.Для каждого(множество,        делегировать(int Икс)        {            сумма += Икс;        }    );    возвращаться сумма;}

В отличие от некоторых реализаций закрытия, каждый экземпляр анонимного делегата имеет доступ к одному и тому же относительному участку памяти для каждой связанной переменной, а не к фактическим значениям при каждом создании. См более полное обсуждение этого различия.

Делегированная ковариация и контравариантность

Преобразования из групп методов в типы делегатов находятся ковариантный и контравариантный в возврате и типах параметров соответственно.[4]

Доступность средств доступа к свойствам может быть установлена ​​независимо

Пример:

нить положение дел = нить.Пустой;общественный нить Положение дел{    получать { возвращаться положение дел; }             // любой может получить значение этого свойства,    защищенный набор { положение дел = ценить; }  // но только производные классы могут это изменить}

Обнуляемые типы

Типы значений, допускающие значение NULL (обозначается вопросительным знаком, например int? я = ноль;) которые добавляют ноль к набору допустимых значений для любого типа значения. Это обеспечивает улучшенное взаимодействие с базами данных SQL, которые могут иметь обнуляемые столбцы типов, соответствующих примитивным типам C #: SQL INTEGER NULL тип столбца напрямую переводится в C # int?.

Обнуляемые типы получили улучшение в конце августа 2005 г., незадолго до официального запуска, чтобы улучшить их заниматься боксом характеристики: переменная, допускающая значение NULL, которой присвоено значение NULL, на самом деле не является пустой ссылкой, а скорее экземпляром struct Nullable с собственностью HasValue равно ложный. В коробке Обнуляемый упаковывается сам экземпляр, а не значение, хранящееся в нем, поэтому результирующая ссылка всегда будет отличаться от нуля, даже для нулевых значений. Следующий код иллюстрирует исправленный недостаток:

int? я = ноль;объект о = я;если (о == ноль)    Система.Консоль.WriteLine(«Правильное поведение - исполняемая версия от сентября 2005 г. или новее»);еще    Система.Консоль.WriteLine(«Неправильное поведение - предварительная версия (до сентября 2005 г.)»);

При копировании в объекты в официальном выпуске указываются значения из Обнуляемый экземпляры, поэтому значения NULL и ссылки NULL считаются равными. Поздний характер этого исправления вызвал некоторые споры[5], поскольку требовалось ядро-CLR изменения, затрагивающие не только .NET2, но и все зависимые технологии (включая C #, VB, SQL Server 2005 и Visual Studio 2005).

Оператор объединения с нулем

В ?? Оператор называется оператором объединения с нулевым значением и используется для определения значения по умолчанию для типов значений, допускающих значение NULL, а также для ссылочных типов. Он возвращает левый операнд, если он не равен нулю; в противном случае возвращается правильный операнд.[6]

объект nullObj = ноль; объект объект = новый Объект(); возвращаться nullObj ?? объект; // возвращает obj

Основное использование этого оператора - присвоить тип, допускающий значение NULL, типу, не допускающему значения NULL, с помощью простого синтаксиса:

int? я = ноль;int j = я ?? 0; // Если i не равно нулю, инициализируем j значением i. В противном случае (если i равно нулю) инициализировать j значением 0.

Рекомендации

  1. ^ «Введение в универсальные шаблоны C #». Microsoft. Январь 2005 г.. Получено 18 июня, 2009.
  2. ^ "урожай". Справочник по языку C #. Microsoft. Получено 2009-04-26.
  3. ^ «Анонимные методы (C #)». Руководство по программированию на C #. Microsoft. Получено 18 июня, 2009.
  4. ^ «Ковариация и контравариантность в делегатах (C #)». Руководство по программированию на C #. Microsoft. Получено 18 июня, 2009.
  5. ^ Сомасегар (11 августа 2005 г.). «Нули больше не пропадают». WebLog Сомасегара. MSDN. Получено 2008-11-05.
  6. ^ «?? Оператор». Справочник по C #. Microsoft. Получено 2008-11-23.