Неповторяющийся способ сказать: получить доступ к члену этого объекта, если объект не нулевой
Допустим, у меня есть набор автомобилей, где у каждого автомобиля есть руль. Я хотел бы написать строку кода, которая ищет автомобиль в наборе и возвращает его рулевое колесо, или возвращает ноль, если автомобиль не находится в наборе. Что-то вроде этого:
Car found = // either a Car or null
SteeringWheel wheel = (found == null ? null : found.steeringwheel);
Есть ли способ сделать это без использования found
а также null
дважды в выражении? Мне не нравится запах повторения здесь.
3 ответа
Нет очевидного улучшения, пока не появится C# 6, но вы можете скрыть неприятности в методе расширения до тех пор.
void Main() {
Car found = null;// either a Car or null
SteeringWheel wheel = found.MaybeGetWheel();
}
public static class CarExtensions {
internal static SteeringWheel MaybeGetWheel(this Car @this) {
return @this != null ? @this.steeringwheel : null;
}
}
Некоторые люди говорят, что вы не должны позволять вызывать методы расширения null
, но это работает. Это предпочтение стиля, а не техническое ограничение.
Вы можете немного подождать C# 6.0, а затем использовать оператор null-conditional (он же безопасная навигация), ?.
:
SteeringWheel wheel = FindCar()?.steeringwheel;
Используя linq вы можете сделать
var steeringwheel = cars.Where(c => c.name = "foo")
.Select(c => c.steeringwheel)
.SingleOrDefault();