2014-11-07 3 views
0

Есть ли случай для синтаксического сахара, который возвращает null, когда конкретный параметр равен нулю? Это существует?Синтаксический сахар для «Если этот параметр имеет значение null, автоматически возвращает null»

public DataObj GetMyData(DataSource source?null, User currentUser?null, string path) { 
    // Code starts here. source and currentUser are not null. 
} 

или это

public DataObj GetMyData(DataSource source!, User currentUser!, string path) { 
    // Code starts here. source and currentUser are not null. 
} 

Так выше будет возвращать нулевое значение, если источник или CurrentUser были нуль без выполнения метода, но выполнить бы, если только путь был нулевым.

public DataObj GetMyData(DataSource source, User currentUser, string path) { 
    if (source == null || currentUser == null) 
    { 
     return null; 
    } 
    // The rest of your code here 
} 

Вы также можете использовать ArgumentNullExceptions, но тогда вы создаете дополнительную работу обработки исключений в других местах, особенно если нулевые параметры в порядке, но вы не получите от него значения.

+14

Нет, в C# ничего подобного нет. – MarcinJuraszek

+0

Что бы этот метод возвращал для типа значения? –

+0

Есть ли язык, который на самом деле это делает? – TyCobb

ответ

3

C# 6 предлагает null propagation operator? что получится:

double? minPrice = null; 
if (product != null 
    && product.PriceBreaks != null 
    && product.PriceBreaks[0] != null) 
{ 
    minPrice = product.PriceBreaks[0].Price; 
} 

в:

var minPrice = product?.PriceBreaks?[0]?.Price; 
0

Нет, нет синтаксического сахара для возврата null.

Я думаю, что ближе всего, что существует, операции по обнуляемым значениям:

int? Add(int? l, int? r) 
{ 
    return l + r; 
} 

даст вам «HasValue = False», если один из операндов не имеет значение.

Возможно, вы также захотите прочитать о «Maybe monad», который очень близок к тому, что вы ищете - то есть Marvels of Monads пытается объяснить его на C# (значения с нулевым значением являются примером для одного, но применяются только к типам значений).

0

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

public T OperateIfNotNull<T, V1, V2>(V1 arg1, V2 arg2, string path, Func<V1, V2, string, T> operation) where T : class 
{ 
    if ((arg1 == null) || (arg2 == null) || string.IsNullOrWhiteSpace(path)) 
     return null; 

    return operation(arg1, arg2, path); 

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