Пустая строка, если 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);
}
}