2011-12-21 3 views
1
var d = get(x).Title; 
var e = get(y).Title; 

Получение заголовка дает исключение, если get (y) возвращает значение null. Однако мне нужно, чтобы значение e было равно null, если get (y) равно null и не должно быть никакого генерируемого исключения. Я могу сделать это с помощью двух шагов get (y), но я хочу только сделать get (y) один раз.Установка значения переменной на основании результата выборки в C#

Есть ли какой-нибудь простой способ, который я могу использовать только с одним get (y) и с одной строкой кода e, равным null, если get (y) является нулевым или фактическое значение, если get (y) не возвращается нуль?

+0

что более важно? только вызов get (y) однажды или не назначает промежуточную переменную? – Adam

ответ

2
var z = get(y); 
var e = z != null ? z.Title : null; 

Вы можете также использовать методы расширения, как те:

public static TResult IfNotNull<T, TResult>(this T obj, Func<T, TResult> selector) 
     where T : class 
    { 
     return obj.IfNotNull(selector, default(TResult)); 
    } 

    public static TResult IfNotNull<T, TResult>(this T obj, Func<T, TResult> selector, TResult valueIfNull) 
     where T : class 
    { 
     if (obj == null) 
      return valueIfNull; 
     return selector(obj); 
    } 

... 

    var e = get(y).IfNotNull(_ => _.Title); 
+0

Спасибо Томас. Это решение выглядит очень интересно. Я пробовал, и, похоже, все работает нормально. –

0

Вы должны будете использовать terinary оператора:

var e = (get(y) == null ? null : get(y).Title). 

Если get(y) является дорогостоящей операцией, вы хотите кэшировать его в другой переменной.

+0

Все еще надеется на решение без какой-либо другой переменной. The ?? ниже выглядел хорошо, но другой плакат сказал, что это не сработает :-( –

+1

@SamanthaJ: вы не можете сделать это без другой переменной, если вы не позвоните дважды (y). Даже нулевой оператор коалесцирования (написанный неправильно ниже) требует двух вызовов get (y). –

+0

@ SamanthaJ, были вызовы оператора '? .', которые теоретически позволят вам сказать' get (x) ?. Заголовок 'без нулевой проверки, но не было объявлений о том, чтобы включить это в будущую версию C#, и она явно не существует сейчас. –

1
var d = get(x) != null ? get(x).Title : null; 

Так вы утверждаете, что только один вызов get(x)get(y) разрешено вы могли бы написать это следующим образом

var X = get(x); 
    var d = X != null ? X.Title : null; 

То есть самый короткий путь, чтобы написать код, но я думаю, что более четкий способ записи все это должно было бы обработать это с помощью какой-либо формы метода расширения вызова функции, поскольку это то, что вам нужно сделать для множества переменных.

Примеры методов расширения

public static TypeOfTitle GetTitle(this TypeOfget x) 
{ 
    return x != null ? x.Title : null; 
} 

Тогда называют это следующим образом

var d = get(x).GetTitle(); 
+1

Это не скомпилируется ... оба операнда оператора должны иметь тот же тип –

+0

WOW Я никогда не видел этого оператора раньше !! –

+0

Саманте нужно вернуть Title, если get (y) имеет значение null, null в противном случае. Ваш код вернет get (y), а если это null, верните get (y). Название. –

1

Вы можете использовать встроенный условный оператор (или, троичный оператор) , например:

var e = get(y) != null ? get(y).Title : null; 

Однако, возможно, вы захотите взять «примитивный» маршрут (я знаю, я знаю, что один-лайнеры - все это ярость), если только для минимизации вызовов get (что вы считаете проблемой), который был бы просто:

string e = null; 
var somethingOrOther = get(y); 
if (somethingOrOther != null) { 
    e = somethingOrOther; 
} 

Насколько мне известно, я боюсь, что это один или другой - кто-то может что-то знать, что я делаю не так, или Джон Скит может состряпать некоторое зло для вас, но это где я стою (все остальное может показаться лишь вариациями одних и тех же подходов).

Кроме того, поскольку в настоящее время известно о possible duplicate, но для полноты картины, я вышлю Эрик Липперт на «нулевое значение, если объект является недействительным или object.member, если объект не является нулевым»:

Для этого нет короткой формы; реализация одной из них - довольно часто запрашиваемая функция .

+0

Но для этого нужно, чтобы (y) выполнялось дважды :-( –

Смежные вопросы