WikiDer > C Sharp 4.0
C # 4.0 это версия C # язык программирования, выпущенный 11 апреля 2010 года. Microsoft выпустила 4.0 время выполнения и среда разработки Visual Studio 2010.[1] Основное внимание в C # 4.0 уделяется взаимодействию с частично или полностью динамически типизированными языками и фреймворками, такими как Среда выполнения динамического языка и COM.
Функции
В C # 4.0 были добавлены следующие новые функции.[2]
Динамический поиск членов
Новый псевдотип динамичный
вводится в систему типов C #. Это рассматривается как System.Object
, но, кроме того, любой доступ к члену (вызов метода, доступ к полю, свойству или индексатору или вызов делегата) или применение оператора к значению такого типа разрешается без какой-либо проверки типа, и его разрешение откладывается до запуска -время. Это известно как утка печатать. Например:
// Возвращает значение свойства или поля Length любого объекта int GetLength(динамичный объект) { возвращаться объект.Длина; } GetLength("Привет, мир"); // строка имеет свойство Length, GetLength(новый int[] { 1, 2, 3 }); // и массив, GetLength(42); // но не целое число - исключение будет сгенерировано в методе GetLength во время выполнения
Вызов динамических методов запускается значением типа динамичный
как любой неявный или явный параметр (а не только получатель). Например:
пустота Распечатать(динамичный объект) { Система.Консоль.WriteLine(объект); // какая перегрузка WriteLine () для вызова определяется во время выполнения } Распечатать(123); // заканчивается вызовом WriteLine (int) Распечатать("abc"); // заканчивается вызовом WriteLine (строка)
Динамический поиск выполняется с использованием трех различных механизмов: COM. IDispatch для COM-объектов, IDynamicMetaObjectProvider
Интерфейс DLR для объектов, реализующих этот интерфейс, и отражение для всех остальных объектов. Поэтому любой класс C # может перехватывать динамические вызовы своих экземпляров, реализуя IDynamicMetaObjectProvider
.
В случае вызовов динамического метода и индексатора разрешение перегрузки происходит во время выполнения в соответствии с фактическими типами значений, переданных в качестве аргументов, но в остальном в соответствии с обычными правилами разрешения перегрузки C #. Более того, в случаях, когда получатель в динамическом вызове сам не является динамическим, разрешение перегрузки во время выполнения будет учитывать только методы, которые представлены в объявленном типе времени компиляции получателя. Например:
учебный класс Основание{ пустота Фу(двойной Икс);}учебный класс Полученный : Основание{ пустота Фу(int Икс);}динамичный Икс = 123;Основание б = новый Полученный();б.Фу(Икс); // выбирает Base.Foo (double), потому что b имеет тип Base, а Derived.Foo (int) не отображаетсядинамичный b1 = б;b1.Фу(Икс); // выбирает Derived.Foo (int)
Любое значение, возвращаемое из динамического доступа к члену, само имеет тип динамичный
. Значения типа динамичный
неявно конвертируются как из любого другого типа, так и в любой другой. В приведенном выше примере кода это позволяет GetLength
функция для обработки значения, возвращаемого вызовом Длина
как целое число без явного приведения. Во время выполнения фактическое значение будет преобразовано в запрошенный тип.
Ковариантные и контравариантные параметры универсального типа
Общий интерфейсы и делегаты могут иметь параметры типа, помеченные как ковариантный или контравариантный используя ключевые слова из
и в
соответственно. Эти объявления затем учитываются при преобразовании типов, как неявном, так и явном, как во время компиляции, так и во время выполнения. Например, существующий интерфейс IEnumerable
был переопределен следующим образом:
интерфейс IEnumerable<из Т>{ IEnumerator<Т> GetEnumerator();}
Следовательно, любой класс, реализующий IEnumerable
для какого-то класса Полученный
также считается совместимым с IEnumerable <база>
для всех классов и интерфейсов Основание
который Полученный
расширяется, прямо или косвенно. На практике это позволяет писать такой код, как:
пустота PrintAll(IEnumerable<объект> объекты){ для каждого (объект о в объекты) { Система.Консоль.WriteLine(о); }}IEnumerable<нить> струны = новый Список<нить>();PrintAll(струны); // IEnumerable неявно преобразуется в IEnumerable
Для контравариантности существующий интерфейс IComparer
был переопределен следующим образом:
общественный интерфейс IComparer<в Т>{ int Сравнивать(Т Икс, Т у);}
Следовательно, любой класс, реализующий IComparer <База>
для какого-то класса Основание
также считается совместимым с IComparer <Получено>
для всех классов и интерфейсов Полученный
которые продолжаются от Основание
. Это позволяет писать такой код, как:
IComparer<объект> objectComparer = GetComparer();IComparer<нить> stringComparer = objectComparer;
Необязательное ключевое слово ref при использовании COM
В ссылка
ключевое слово для вызывающих методов теперь необязательно при вызове методов, предоставляемых COM интерфейсы. Учитывая метод COM с подписью
пустота Приращение(ссылка int Икс);
вызов теперь можно записать как
Приращение(0); // больше не требуется "ref" или переменная-заполнитель
или же
int Икс = 0;Приращение(ссылка Икс);
Необязательные параметры и именованные аргументы
C # 4.0 вводит необязательные параметры со значениями по умолчанию, как показано в Visual Basic и C ++. Например:
пустота Приращение(ссылка int Икс, int dx = 1){ Икс += dx;}int Икс = 0;Приращение(ссылка Икс); // dx принимает значение по умолчанию 1, после того как метод возвращает x == 1Приращение(ссылка Икс, 2); // dx принимает значение 2 после того, как метод возвращает x == 3
Кроме того, чтобы дополнить необязательные параметры, можно явно указать имена параметров в вызовах методов, что позволяет программисту выборочно передавать любое подмножество необязательных параметров для метода. Единственное ограничение - именованные параметры должен быть помещен после безымянных параметров. Имена параметров могут быть указаны как для необязательных, так и для обязательных параметров и могут использоваться для улучшения читаемости или произвольного изменения порядка аргументов в вызове. Например:
Транслировать Открыть файл(нить имя, FileMode Режим = FileMode.Открыть, FileAccess доступ = FileAccess.Читать) { ... }Открыть файл("file.txt"); // использовать значения по умолчанию для "режима" и "доступа" Открыть файл("file.txt", Режим: FileMode.Создавать); // использовать значение по умолчанию для "доступа"Открыть файл("file.txt", доступ: FileAccess.Читать); // использовать значение по умолчанию для "режима"Открыть файл(имя: "file.txt", доступ: FileAccess.Читать, Режим: FileMode.Создавать); // называем все параметры для большей читабельности, // и используйте порядок, отличный от объявления метода
Необязательные параметры упрощают взаимодействие с COM. Раньше C # должен был передавать все параметры в методе COM-компонента, даже те, которые являются необязательными. Например:
объект имя файла = "Test.docx";объект отсутствующий = Система.Отражение.Отсутствующий.Ценить;док.Сохранить как(ссылка имя файла, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий, ссылка отсутствующий);
При поддержке необязательных параметров код можно сократить как
док.Сохранить как(ссылка имя файла);
Что из-за того, что теперь необязательно ссылка
ключевое слово при использовании COM, может быть сокращено как
док.Сохранить как(имя файла);
Проиндексированные свойства
Индексированные свойства (и свойства по умолчанию) COM-объектов теперь распознаются, но объекты C # по-прежнему их не поддерживают.
Рекомендации
- ^ «Первый взгляд на Microsoft Visual Studio 2010».
- ^ Торгерсен, Мадс (27 октября 2008 г.). «Новые возможности в C # 4.0». Microsoft. Получено 2008-10-28.