Оператор null-conditional в C#

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

Оператор null-conditional (локализ. null-условие; символы ?.) в C# предоставляет доступ к свойству, если оно не null, или возвращает null, т.е. он проверяет св-во на null и предоставляет к нему доступ, если оно не null, иначе возвращает null.

Обозначение

Обозначается знаком вопроса и точкой: «?.».

Примеры

Иногда при работе с объектами, которые принимают значение null, можно столкнуться с ошибкой, когда пытаешься обратиться к объекту, а этот объект равен null. Напр., пусть есть след. система классов:

class User {
	public Phone Phone { get; set; }
}
class Phone {
	public Company Company { get; set; }
}
class Company {
	public string Name { get; set; }
}

Объект класса User содержит ссылку на объект класса Phone, а объект класса Phone содержит ссылку на объект класса Company, поэтому можно получить из объекта класса User название компании, напр., так:

User user = new User();
Console.WriteLine(user.Phone.Company.Name);

В данном случ. св-во Phone не определено, оно по-умолч. будет иметь знач. null. Поэтому будет брошено исключение типа NullReferenceException. Чтобы избежать этой ситуации можно использовать условную конструкцию для проверки на null:

User user = new User();
if (user != null) {
	if (user.Phone != null) {
		if (user.Phone.Company != null) {
			string companyName = user.Phone.Company.Name;
			Console.WriteLine(companyName);
		}
	}
}

Получается многовложенная ("многоэтажная") конструкция, но её можно сократить:

if (user != null && user.Phone != null && user.Phone.Company != null) {
	string companyName = user.Phone.Company.Name;
	Console.WriteLine(companyName);
}

Если usernull, то проверяется след. выражение: user.Phone != null и т.д. Конструкция намного проще, но все равно получается довольно большой. И чтобы её упростить, в C# ввели оператор условного null (null-conditional operator) — «?.»:

string companyName = user?.Phone?.Company?.Name;

Выражение ?. и представляет оператор условного null. Здесь последовательно проверяется = ли объект user и вложенные объекты значению null. Если же на каком-то этапе один из объектов окажется = null, то companyName будет иметь знач. по-умолч., т.е. null.

Использование вместе с др. операторами

Часто операторы ?. и ?? используют вместе для установки значения по-умолч., если название компании не установлено:

User user = new User();
string companyName = user?.Phone?.Company?.Name ?? "не установлено";
Console.WriteLine(companyName);