Язык программирования C#9 и платформа .NET5
Часть 98 из 642 Информация о книге
Например, с помощью свойства
или операцииHasValueможно программно выяснять, действительно ли переменной, допускающей!=, было присвоено значениеnull. Значение, которое присвоено типу, допускающемуnull, можно получать напрямую или через свойствоnull. Учитывая, что суффиксValueявляется просто сокращением для использования?, предыдущий методNullable<T>можно было бы реализовать следующим образом:LocalNullableVariables()static void LocalNullableVariablesUsingNullable(){// Определить несколько типов, допускающих null,// с применением Nullable<T>.Nullable<int> nullableInt = 10;Nullable<double> nullableDouble = 3.14;Nullable<bool> nullableBool = null;Nullable<char> nullableChar = 'a';Nullable<int>[] arrayOfNullableInts = new Nullable<int>[10];}Как отмечалось ранее, типы данных, допускающие
, особенно полезны при взаимодействии с базами данных, потому что столбцы в таблицах данных могут быть намеренно оставлены пустыми (скажем, быть неопределенными). В целях демонстрации рассмотрим показанный далее класс, эмулирующий процесс доступа к базе данных с таблицей, в которой два столбца могут принимать значенияnull. Обратите внимание, что методnullне присваивает значение члену целочисленного типа, допускающегоGetlntFromDatabase(), тогда как методnullприсваивает допустимое значение члену типаGetBoolFromDatabase()?boolclass DatabaseReader{// Поле данных типа, допускающего null.public int? numericValue = null;public bool? boolValue = true;// Обратите внимание на возвращаемый тип, допускающий null.public int? GetIntFromDatabase(){ return numericValue; }// Обратите внимание на возвращаемый тип, допускающий null.public bool? GetBoolFromDatabase(){ return boolValue; }}В следующем коде происходит обращение к каждому члену класса
и выяснение присвоенных значений с применением членовDatabaseReaderиHasValue, а также операции равенства C# (точнее операции "не равно"):ValueConsole.WriteLine("***** Fun with Nullable Value Types *****\n");DatabaseReader dr = new DatabaseReader();/// Получить значение int из "базы данных".int? i = dr.GetIntFromDatabase();if (i.HasValue){Console.WriteLine("Value of 'i' is: {0}", i.Value);// Вывод значения переменной i}else{Console.WriteLine("Value of 'i' is undefined.");// Значение переменной i не определено}// Получить значение bool из "базы данных".bool? b = dr.GetBoolFromDatabase();if (b != null){Console.WriteLine("Value of 'b' is: {0}", b.Value);// Вывод значения переменной b}else{Console.WriteLine("Value of 'b' is undefined.");// Значение переменной b не определено}Console.ReadLine();Использование ссылочных типов, допускающих null (нововведение в версии 8.0)
Важным средством, добавленным в версию C# 8, является поддержка ссылочных типов, допускающих значение
. На самом деле изменение было настолько значительным, что инфраструктуру .NET Framework не удалось обновить для поддержки нового средства. В итоге было принято решение поддерживать C# 8 только в .NET Core 3.0 и последующих версиях и также по умолчанию отключить поддержку ссылочных типов, допускающихnull. В новом проекте .NET Core 3.0/3.1 или .NET 5 ссылочные типы функционируют точно так же, как в C# 7. Это сделано для того, чтобы предотвратить нарушение работы миллиардов строк кода, существовавших в экосистеме до появления C# 8. Разработчики в своих приложениях должны дать согласие на включение ссылочных типов, допускающихnull.nullСсылочные типы, допускающие
, подчиняются множеству тех же самых правил, что и типы значений, допускающиеnull. Переменным ссылочных типов, не допускающихnull, во время инициализации должны присваиваться отличающиеся отnullзначения, которые позже нельзя изменять наnull. Переменные ссылочных типов, допускающихnull, могут принимать значениеnull, но перед первым использованием им по-прежнему должны присваиваться какие-то значения (либо фактический экземпляр чего-нибудь, либо значениеnull).null