Значение Null. Nullable-типы. Оператор ??
Ссылочные типы и типы значений, которые рассматривались в предыдущем уроке, имеют еще одно отличие. Ссылочные типы могут принимать значение null, типы значений – нет.
Null указывает на то, что значение неизвестно, или, другими словами, значения нет.
Значение null вы уже встречали, думаю, не раз. Например, когда объявляли массив и пытались работать с ним, не создав его при помощи оператора new. Такая ссылка (имя) имела значение null, и выбрасывалось исключение NullReferenceException.
Иногда новички в программировании могут воспринимать null как число 0 (ноль), но это совсем не так. Число ноль вполне информативное значение, nullже говорит нам о том, что значения нет.
Ниже в примере показано, что для ссылочного типа мы можем задать null, а для типа значений нет:
static void Main(string[] args)
{
Object a = null; // нормально
int b = null; // ошибка, int не nullable тип
}
Nullable-типы
Иногда бывают ситуации, когда необходимо чтобы тип значений мог принимать null, и это можно сделать, указав знак вопроса (?) после имени типа, при объявлении переменной:
static void Main(string[] args)
{
int? a = null;
double? b = null;
bool? c = null;
}
Nullable-типы могут пригодиться при работе с базой данных. Некоторые поля таблицы базы данных могут принимать значение null. Например, значение булевого поля любит ли человек кошек может оставаться неизвестным. Или более практический пример. На главной странице этого сайта есть лента с уроками, и в ней несколько последних, остальные на страницах 2,3,…Номер страницы передается аргументом в http запросе ("…?page=2"), но для первого захода на сайт страницу 1 указывать в запросе не очень красиво, используя nullable-тип, переменная int, которая отвечает за номер страницы, в таком случае принимает значение null.
Оператор ?? (null-объединение)
Оператор null-объединения ?? немного похож на тернарный оператор. Он имеет следующую структуру:
[операнд1] ?? [операнд2];
?? возвращает операнд1 в случае если тот не равен значению null, иначе возвращает операнд2.
static void Main(string[] args)
{
int? a = 1;
int? b = null;
Console.WriteLine(a ?? 3); // 1
Console.WriteLine(b ?? 3); // 3
Console.ReadLine();
}
Левый операнд, который сравнивается со значением null, обязательно должен быть nullable-типа, иначе получим ошибку "Operator '??' cannot be applied to operands of type 'int' and 'int'".
Домашнее задание
Создайте метод, который будет выводить информацию о количестве детей у человека. Метод принимает имя человека и количество (nullable). Метод должен выводить: неизвестно, нет детей и сообщение о количестве детей.
Структуры в Си-шарп
В этом небольшом уроке мы поговорим об альтернативе классам - структурах.
Структура – это более простая версия классов. Все структуры наследуются от базового класса System.ValueType и являются типами значений, тогда как классы - ссылочные типы. Структуры отличаются от классов следующими вещами:
- Структура не может иметь конструктора без параметров (конструктора по умолчанию);
- Поля структуры нельзя инициализировать, кроме случаев, когда поля статические.
private int x = 0; // в структуре недопустимо;
- Экземпляры структуры можно создавать без ключевого слова new;
- Структуры не могут наследоваться от других структур или классов. Классы не могут наследоваться от структур. Структуры могут реализовывать интерфейсы;
- Так как структуры это типы значений, они обладают всеми свойствами подобных типов (передача в метод по значению и т.д.), в отличии от ссылочных типов;
- Структура может быть nullable типом.
Структуры объявляются при помощи ключевого слова struct:
public struct Book
{
public string Name;
public string Year;
public string Author;
}
Экземпляр структуры можно создавать без ключевого слова new:
static void Main(string[] args)
{
Book b;
b. Name = "BookName";
}
Структуры подходят для создания несложных типов, таких как точка, цвет, окружность. Если необходимо создать множество экземпляров подобного типа, используя структуры, мы экономим память, которая могла бы выделяться под ссылки в случае с классами.
Примерами структур в стандартной библиотеке классов .Net являются такие типы как int, float, double, bool и другие. Также DateTime, Point (точка), Color.
Домашнее задание
Создайте программу, которая будет находить окружность (структура) у которой радиус максимально близкий к среднему значению радиусов окружностей из списка.