C # не перестает развиваться. Начавшись как смесь подражания Java и C ++, выбрав их лучшие части, язык с тех пор пошел своим путем, внедряя инновации сам по себе. С версией 8 на горизонте, давайте посмотрим на самых сильных кандидатов среди предложений для окончательного проекта.
Обнуляемые ссылочные типы
Когда-то типы значений не могли быть нулевыми, но это изменилось с введением System.Nullable
синтаксический сахар символа ‘?’ модификатор, который отображает байт? и System.Nullable
Конечно, для ссылочных типов null всегда был законным, но это скоро изменится путем расширения T? синтаксис для ссылочных типов также, чтобы позволить разработчикам выражать, предназначены ли переменная, параметр или результат ссылочного типа быть нулевым или нет, и предоставлять предупреждения, когда такие переменные, параметры и результаты не используются в соответствии с этим намерением «.
Это делает возможным следующее:
класс Человек
{
// у всех есть имя и фамилия, но только у некоторых людей есть отчество.
общедоступная строка FirstName; // Ненулевой
публичная строка? Второе имя; // Может быть нулевым
публичная строка LastName; // Ненулевой
}
Предполагается, что намерение неприукрашенного ссылочного типа T состоит в том, чтобы он не был нулевым.
Методы интерфейса по умолчанию
Аналогично Java «Методами по умолчанию» вводятся «Методы интерфейса по умолчанию», то есть методы в интерфейсах с конкретными реализациями. Как всегда, проблема с интерфейсами заключается в том, что их расширение требует, чтобы все классы, реализующие их, также изменились, чтобы приспособиться к изменениям.
Согласно этому предложению, класс C, реализующий интерфейс IA, не обязан также реализовывать конкретный метод IA:
интерфейс IA
{
void M () {WriteLine («IA.M»); }
}
класс C: IA {}
Эта функция означает, что будущие и расширенные версии интерфейса не должны нарушать существующий код.
Буферы фиксированного размера
В основном это проблема повышения производительности, но особенно важна для тех, кто нуждается в нарушении управляемых границ CLR, например, при взаимодействии с C DLL.
В таких случаях вы, скорее всего, наткнетесь на такие случаи, как:
внутренняя небезопасная структура MyBuffer
{
общедоступный фиксированный uint Зарезервирован [28]; // массив из 28 единиц
}
где с помощью «fixed» вы закрепляете необходимую память для использования неуправляемой dll.
Однако эта операция должна быть заключена в «небезопасный» контекст, а вместе с ним и все связанные с ней опасности.
Предложение требует, чтобы управляемый код мог работать с массивами фиксированного размера, при этом сохраняя преимущества безопасного кода, такие как проверка границ. «Небезопасный» должен уйти.
Он должен снизиться, чтобы вы также могли безопасно взаимодействовать с неуправляемым кодом с помощью MarshalAs. Например, предыдущий «фиксированный» пример можно записать как:
[MarshalAs (UnmanagedType.ByValArray, SizeConst = 28)]
public uint [] Зарезервировано;
фрагмент кода P / Invoke, который я широко использую в приложении UER, которое взаимодействует с unrar.dll WinRAR, написанным на C ++. Ему нужна структура, определенная как:
[StructLayout (LayoutKind.Sequential, CharSet = CharSet.Ansi)]
общедоступная структура OpenArchiveDataEx_template
{
публичная строка ArcName;
[MarshalAs (UnmanagedType.LPWStr)]
публичная строка ArcNameW;
public uint OpenMode;
public uint OpenResult;
публичная строка CmtBuf;
public uint CmtBufSize;
public uint CmtSize;
public uint CmtState;
публичные флаги uint;
общедоступный IntPtr Callback;
public int UserData;
[MarshalAs (UnmanagedType.ByValArray, SizeConst = 28)]
public uint [] Зарезервировано;
…
[DllImport («unrar.dll», SetLastError = true)]
общедоступный статический внешний IntPtr RAROpenArchiveEx (ссылка OpenArchiveDataEx_template OpenArchiveDataEx_instance);
Здесь компилятор заботится об управляемом и неуправляемом обмене данными, но за счет производительности из-за выделения структур и маршалинга данных. «Фиксированный» затем разрешает прямую связь, передавая указатели на неуправляемую структуру, что переводится к гораздо более высокой производительности. Предложение основывается на этом, позволяя также использовать фиксированные буферы в безопасных средах.
Среди остальных предложений выделяются такие, как рекурсивное сопоставление с образцом, статические делегаты, ковариантные возвраты и асинхронные потоки.
Больше информации
Дизайн языка C #
Что нового в C # 8.0 — Мадс Торгерсен
Статьи по Теме
C # углубленно, 2-е изд.
Подробнее о C #, 3-е изд.
C # Guru — Интервью с Эриком Липпертом
Игра за игрой: вопросы и ответы по C # со Скоттом Алленом и Джоном Скитом
Чтобы быть в курсе новых статей на I Programmer, подпишитесь на нашу еженедельную новостную рассылку, подпишитесь на RSS-канал и подпишитесь на нас в Twitter, Facebook или Linkedin.
Комментарии
Оставьте комментарий или просмотрите существующие комментарии с помощью Disqus
или отправьте свой комментарий по адресу: comments@i-programmer.info