Неповторяющийся способ сказать: получить доступ к члену этого объекта, если объект не нулевой

Допустим, у меня есть набор автомобилей, где у каждого автомобиля есть руль. Я хотел бы написать строку кода, которая ищет автомобиль в наборе и возвращает его рулевое колесо, или возвращает ноль, если автомобиль не находится в наборе. Что-то вроде этого:

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();
Другие вопросы по тегам