Пустая строка, если null

У меня это в моем коде:

SelectList(blah, "blah", "blah", cu.Customer.CustomerID.ToString())

Он дает ошибку, когда возвращает null, как я могу его сделать. CustomerID - это пустая строка, если она равна нулю?

Ответы

Ответ 1

(Обновление для С# 6.0)

Если вы используете С# 6 или новее (Visual Studio 2015 или новее), вы можете достичь этого, используя оператор с нулевым условием ?.:

var customerId = cu.Customer?.CustomerId.ToString() ?? "";

Одно полезное свойство оператора с нулевым условием состоит в том, что оно также может быть "закодировано", если вы хотите проверить, являются ли несколько вложенных свойств нулевыми:

// ensure (a != null) && (b != null) && (c != null) before invoking
// a.b.c.CustomerId, otherwise return "" (short circuited at first encountered null)
var customerId = a?.b?.c?.CustomerId.ToString() ?? "";

Для версий С# до 6.0 (VS2013 или старше) вы можете объединить его следующим образом:

string customerId = cu.Customer != null ? cu.Customer.CustomerID.ToString() : "";

Просто проверьте, не объект ли объект null, прежде чем пытаться получить доступ к его членам, и в противном случае вернуть пустую строку.

Кроме того, бывают ситуации, когда полезно null object. Это означает, что вы гарантируете, что ваш родительский класс Customer (тип cu в этом случае) всегда возвращает фактический экземпляр объекта, даже если он "пуст". Проверьте эту ссылку, например, если вы считаете, что она может быть применима к вашей проблеме: Как создать нулевой объект в С#.

Ответ 2

Это зависит от типа CustomerID.

Если CustomerID - это строка, вы можете использовать оператор null coalescing:

SelectList(blah, "blah", "blah", cu.Customer.CustomerID ?? string.Empty)

Если CustomerID является Nullable<T>, вы можете использовать:

SelectList(blah, "blah", "blah", cu.Customer.CustomerID.ToString())

Это будет работать, потому что метод ToString() Nullable<T> возвращает пустую строку, если экземпляр null (технически, если Свойство HasValue - false).

Ответ 3

Тернарный оператор работает, но если вы хотите, чтобы еще меньшее выражение работало над произвольными объектами, вы можете использовать:

(myObject ?? "").ToString()

Вот пример реальной жизни из моего кода:

 private HtmlTableCell CreateTableCell(object cellContents)
 {
     return new HtmlTableCell()
     {
         InnerText = (cellContents ?? "").ToString()             
     };
 }

Ответ 4

SelectList(blah, "blah", "blah", 
(cu.Customer.CustomerID!=null?cu.Customer.CustomerID.ToString():"")
)

Ответ 5

Пожалуйста, не используйте это в процессе производства:

/// <summary>
/// I most certainly don't recommend using this in production but when one can abuse delegates, one should :)
/// </summary>
public static class DirtyHelpers
{
    public static TVal SafeGet<THolder, TVal>(this THolder holder, Func<TVal> extract) where THolder : class
    {
        return null == holder ? default(TVal) : extract();
    }

    public static void Sample(String name)
    {
        int len = name.SafeGet(()=> name.Length);
    }
}