Си Шарп 2.0
В программирования языке C# в версии 2.0 представлено несколько новых функций (соответствующих 3-му изданию стандарта ECMA-334 и .NET Framework 2.0 ). К ним относятся:
Возможности С# 2.0
[ редактировать ]Частичный класс
[ редактировать ]Частичные классы позволяют распределить реализацию класса между несколькими файлами, при этом каждый файл содержит один или несколько членов класса. Это полезно, прежде всего, когда части класса генерируются автоматически. Например, эта функция активно используется дизайнерами пользовательского интерфейса, генерирующими код в Visual Studio .
файл1.cs:
public partial class MyClass
{
public void MyMethod1()
{
// Manually written code
}
}
файл2.cs:
public partial class MyClass
{
public void MyMethod2()
{
// Automatically generated code
}
}
Дженерики
[ редактировать ]Обобщения , или параметризованные типы, или параметрический полиморфизм — это функция .NET 2.0, поддерживаемая C# и Visual Basic. В отличие от шаблонов C++, параметризованные типы .NET создаются во время выполнения, а не компилятором; следовательно, они могут быть межъязыковыми, тогда как шаблоны C++ не могут. Они поддерживают некоторые функции, не поддерживаемые напрямую шаблонами C++, такие как ограничения типа для универсальных параметров с помощью интерфейсов. С другой стороны, C# не поддерживает универсальные параметры, не относящиеся к типам. В отличие от дженериков в Java, дженерики .NET используют реификацию , чтобы сделать параметризованные типы первоклассными объектами в виртуальной машине CLI , что позволяет оптимизировать и сохранять информацию о типах. [1]
Статические классы
[ редактировать ]Статические классы — это классы, экземпляры которых не могут быть созданы или унаследованы и которые допускают только статические члены. Их назначение аналогично назначению модулей во многих процедурных языках.
Функциональность генератора
[ редактировать ]Платформа .NET 2.0 Framework позволила C# ввести итератор , обеспечивающий генератора , используя функциональность yield return
построить аналогично yield
в Питоне . [2] С yield return
, функция автоматически сохраняет свое состояние во время итерации.
// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
foreach (int i in numbers)
{
if (i % 2 == 0)
yield return i;
}
}
Существует также yield break
оператор, в котором управление безоговорочно возвращается вызывающему итератору. Существует неявное yield break
в конце каждого метода генератора.
Анонимные делегаты
[ редактировать ]В качестве предшественника лямбда-функций, представленных в C# 3.0, в C# 2.0 добавлены анонимные делегаты. Они обеспечивают замыканию . функциональность C#, подобную [3] Код внутри тела анонимного делегата имеет полный доступ на чтение и запись к локальным переменным, параметрам метода и членам класса в области делегата, за исключением out
и ref
параметры. Например:-
int SumOfArrayElements(int[] array)
{
int sum = 0;
Array.ForEach(array,
delegate(int x)
{
sum += x;
}
);
return sum;
}
В отличие от некоторых реализаций замыкания, каждый экземпляр анонимного делегата имеет доступ к одной и той же относительной ячейке памяти для каждой связанной переменной, а не к фактическим значениям при каждом создании. См. более полное обсуждение этого различия.
Делегировать ковариацию и контравариантность
[ редактировать ]Преобразования из групп методов в типы делегатов являются ковариантными и контравариантными по типам возвращаемых значений и параметров соответственно. [4]
Доступность методов доступа к свойствам может быть установлена независимо.
[ редактировать ]Пример:
string status = string.Empty;
public string Status
{
get { return status; } // anyone can get value of this property,
protected set { status = value; } // but only derived classes can change it
}
Типы значений, допускающие значение NULL
[ редактировать ]Типы значений, допускающие значение NULL (обозначаются знаком вопроса, например int? i = null;
), которые добавляют null
к набору разрешенных значений для любого типа значения. Это обеспечивает улучшенное взаимодействие с базами данных SQL, которые могут иметь столбцы с нулевым значением типов, соответствующих примитивным типам C#: INTEGER NULL
тип столбца напрямую переводится в C# int?
.
Типы значений, допускающие значение NULL, получили усовершенствование в конце августа 2005 года, незадолго до официального запуска, для улучшения характеристик упаковки : переменная, допускающая значение NULL, которой присвоено значение NULL, на самом деле не является пустой ссылкой, а скорее экземпляром struct Nullable<T>
с недвижимостью HasValue
равный false
. В упаковке Nullable
Упаковывается сам экземпляр, а не значение, хранящееся в нем, поэтому результирующая ссылка всегда будет ненулевой, даже для нулевых значений. Следующий код иллюстрирует исправленную ошибку:
int? i = null;
object o = i;
if (o == null)
System.Console.WriteLine("Correct behaviour - runtime version from September 2005 or later");
else
System.Console.WriteLine("Incorrect behaviour - pre-release runtime (from before September 2005)");
При копировании в объекты официальные значения коробок выпуска из Nullable
экземпляры, поэтому нулевые значения и нулевые ссылки считаются равными. Позднее появление этого исправления вызвало некоторые споры. [5]
, поскольку это потребовало изменений ядра CLR , затронувших не только .NET2, но и все зависимые технологии (включая C#, VB, SQL Server 2005 и Visual Studio 2005).
Оператор объединения с нулем
[ редактировать ]The ??
Оператор называется оператором объединения значений NULL и используется для определения значения по умолчанию для типов значений, допускающих значение NULL, а также для ссылочных типов. Он возвращает левый операнд, если он не равен нулю; в противном случае он возвращает правильный операнд. [6]
object nullObj = null;
object obj = new Object();
return nullObj ?? obj; // returns obj
Основное использование этого оператора — присвоение типа, допускающего значение NULL, типу, не допускающему NULL, с помощью простого синтаксиса:
int? i = null;
int j = i ?? 0; // If i is not null, initialize j to i. Else (if i is null), initialize j to 0.
Ссылки
[ редактировать ]- ^ «Введение в дженерики C#» . Майкрософт . Январь 2005 года . Проверено 18 июня 2009 г.
- ^ "урожай" . Справочник по языку C# . Майкрософт . Проверено 26 апреля 2009 г.
- ^ «Анонимные методы (C#)» . Руководство по программированию на C# . Майкрософт . Проверено 18 июня 2009 г.
- ^ «Ковариантность и контравариантность в делегатах (C#)» . Руководство по программированию на C# . Майкрософт . Проверено 18 июня 2009 г.
- ^ Сомасегар (11 августа 2005 г.). «Нулевые значения больше не пропадают» . Веб-журнал Сомасегара . MSDN . Проверено 5 ноября 2008 г.
- ^ «?? Оператор» . Справочник по С# . Майкрософт . Проверено 23 ноября 2008 г.