books-read.com
books-read.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Наш ресурс дает возможность бесплатно читать книгу онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных . Сайт books-read.com дает возможность читать полную версию книги без регистрации и sms. Все книги онлайн, не надо качать fb2, epub, txt.
Добавить книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю в приложение ЧИТАТЬ КНИГУ ОФЛАЙН в приложении ios/android
Перейти на страницу:

static void InvokeMembersOnDynamicData()

{

  dynamic textData1 = "Hello";

  Console.WriteLine(textData1.ToUpper());

<b>  // Здесь можно было бы ожидать ошибки на этапе компиляции!</b>

<b>  // Однако все компилируется нормально.</b>

  Console.WriteLine(textData1.toupper());

  Console.WriteLine(textData1.Foo(10, &quot;ee&quot;, DateTime.Now));

}

Обратите внимание, что во втором вызове

WriteLine()
предпринимается попытка обращения к методу по имени
toupper()
на динамическом элементе данных (при записи имени метода использовался неправильный регистр символов; оно должно выглядеть как
ToUpper()
). Как видите, переменная
textData1
имеет тип
string
, а потому известно, что у этого типа отсутствует метод с именем, записанным полностью в нижнем регистре. Более того, тип
string
определенно не имеет метода по имени
Foo()
, который принимает параметры
int
,
string
и
DataTime
!

Тем не менее, компилятор C# ни о каких ошибках не сообщает. Однако если вызвать метод

InvokeMembeгsOnDynamicData()
, то возникнет ошибка времени выполнения с примерно таким сообщением:

Unhandled Exception : Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:

'string' does not contain a definition for 'toupper'

Необработанное исключение: Microsoft.CSharp.RuntimeBinder.

RuntimeBinderException: string не содержит определения для toupper

Другое очевидное отличие между обращением к членам динамических и строго типизированных данных связано с тем, что когда к элементу динамических данных применяется операция точки, ожидаемое средство IntelliSense среды Visual Studio не активизируется. Взамен IDE-среда позволит вводить любое имя члена, какое только может прийти вам на ум.

Отсутствие возможности доступа к средству IntelliSense для динамических данных должно быть понятным. Тем не менее, как вы наверняка помните, это означает необходимость соблюдения предельной аккуратности при наборе кода C# для таких элементов данных. Любая опечатка или символ в неправильном регистре внутри имени члена приведет к ошибке времени выполнения, в частности к генерации исключения типа

RuntimeBinderException
.

Класс

RuntimeBinderException
представляет ошибку, которая будет сгенерирована при попытке обращения к несуществующему члену динамического типа данных (как в случае
toupper()
и
Foo()
). Та же самая ошибка будет инициирована, если для члена, который существует, указаны некорректные данные параметров.

Поскольку динамические данные настолько изменчивы, любые обращения к членам переменной, объявленной с ключевым словом

dynamic
, могут быть помещены внутрь подходящего блока
try/catch
для элегантной обработки ошибок:

static void InvokeMembersOnDynamicData()

{

  dynamic textData1 = &quot;Hello&quot;;

  try

  {

    Console.WriteLine(textData1.ToUpper());

    Console.WriteLine(textData1.toupper());

    Console.WriteLine(textData1.Foo(10, &quot;ee&quot;, DateTime.Now));

  }

  catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)

  {

    Console.WriteLine(ex.Message);

  }

}

Если вызвать метод

InvokeMembersOnDynamicData()
снова, то можно заметить, что вызов
ToUpper()
(обратите внимание на заглавные буквы "Т" и "U") работает корректно, но затем на консоль выводится сообщение об ошибке:

HELLO

'string' does not contain a definition for 'toupper'

<i>string не содержит определение для toupper</i>

Конечно, процесс помещения всех динамических обращений к методам в блоки

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

Область использования ключевого слова dynamic

Вспомните, что неявно типизированные данные (объявленные с ключевым словом

var
) возможны только для локальных переменных в области действия члена. Ключевое слово
var
никогда не может использоваться с возвращаемым значением, параметром или членом класса/структуры. Тем не менее, это не касается ключевого слова
dynamic
. Взгляните на следующее определение класса:

namespace DynamicKeyword

{

  class VeryDynamicClass

  {

<b>    // Динамическое поле.</b>

    private static dynamic _myDynamicField;

<b>    // Динамическое свойство.</b>

    public dynamic DynamicProperty { get; set; }

<b>    // Динамический тип возврата и динамический тип параметра.</b>

    public dynamic DynamicMethod(dynamic dynamicParam)

    {

<b>      // Динамическая локальная переменная.</b>

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - на сайте онлайн книг books-read.com Вы можете читать полные версии книг автора в одном месте.


Язык программирования C#9 и платформа .NET5 отзывы

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор books-read.com


Прокомментировать
Подтвердите что вы не робот:*