Язык программирования C#9 и платформа .NET5
Рекомендации по переносу кода
Если при переносе кода из C# 7 в C# 8 или C# 9 вы хотите задействовать ссылочные типы, допускающие значение
, то можете использовать для работы с кодом комбинацию настройки проекта и директив компилятора. Общепринятая практика предусматривает первоначальное включение предупреждений и отключение заметок о допустимости значенияnullдля всего проекта. Затем по мере приведения в порядок областей кода применяйте директивы компилятора для постепенного включения заметок.nullРабота с типами, допускающими значение null
Для работы с типами, допускающими значение
, в языке C# предлагается несколько операций. В последующих разделах рассматриваются операция объединения сnull, операция присваивания с объединением сnullиnull-условная операция. Для проработки примеров используйте ранее созданный проектnull.FunWithNullableValueTypesОперация объединения с null
Следующий важный аспект связан с тем, что любая переменная, которая может иметь значение null (т.е. переменная ссылочного типа или переменная типа, допускающего
), может использоваться с операциейnullязыка С#, формально называемой операцией объединения с??. Операцияnullпозволяет присваивать значение типу, допускающему??, если извлеченное значение на самом деле равноnull. В рассматриваемом примере мы предположим, что в случае возвращения методомnullзначенияGetlntFromDatabase()(конечно, данный метод запрограммирован так, что он всегда возвращаетnull, но общую идею вы должны уловить) локальной переменной целочисленного типа, допускающегоnull, необходимо присвоить значениеnull. Возвратитесь к проекту100(сделайте его стартовым) и введите следующий код:NullableValueTypes// Для краткости код не показанConsole.WriteLine("***** Fun with Nullable Data *****\n");DatabaseReader dr = new DatabaseReader();// Если значение, возвращаемое из GetlntFromDatabase(), равно// null, тогда присвоить локальной переменной значение 100.int myData = dr.GetIntFromDatabase() ?? 100;Console.WriteLine("Value of myData: {0}", myData);Console.ReadLine();Преимущество применения операции
заключается в том, что она дает более компактную версию кода, чем традиционный условный оператор??. Однако при желании можно было бы написать показанный ниже функционально эквивалентный код, который в случае возвращенияif/elseобеспечит установку переменной в значение 100:null// Более длинный код, в котором не используется синтаксис ??.int? moreData = dr.GetIntFromDatabase();if (!moreData.HasValue){moreData = 100;}Console.WriteLine("Value of moreData: {0}", moreData);// Вывод значения moreDataОперация присваивания с объединением с null (нововведение в версии 8.0)
В версии C# 8 появилась операция присваивания с объединением с
(null), основанная на операции объединения с??=. Эта операция выполняет присваивание левого операнда правому операнду, только если левый операнд равенnull. В качестве примера введите такой код:null// Операция присваивания с объединением с nullint? nullableInt = null;nullableInt ??= 12;nullableInt ??= 14;Console.WriteLine(nullableInt);Сначала переменная
инициализируется значениемnullableInt. В следующей строке переменнойnullприсваивается значение 12, поскольку левый операнд действительно равенnullableInt. Но в следующей за ней строке переменнойnullне присваивается значение 14, т.к. она не равнаnullableInt.nullnull-условная операция
При разработке программного обеспечения обычно производится проверка на предмет
входных параметров, которым передаются значения, возвращаемые членами типов (методами, свойствами, индексаторами). Например, пусть имеется метод, который принимает в качестве единственного параметра строковый массив. В целях безопасности его желательно проверять на предметnull, прежде чем начинать обработку. Поступая подобным образом, мы не получим ошибку во время выполнения, если массив окажется пустым. Следующий код демонстрирует традиционный способ реализации такой проверки:nullstatic void TesterMethod(string[] args){// Перед доступом к данным массива мы должны проверить его// на равенство null!if (args != null){Console.WriteLine($"You sent me {args.Length} arguments.");// Вывод количества аргументов}}Чтобы устранить обращение к свойству
массиваLengthв случае, когда он равенstring, здесь используется условный оператор. Если вызывающий код не создаст массив данных и вызовет методnullпримерно так, как показано ниже, то никаких ошибок во время выполнения не возникнет:TesterMethod()