Пустая строка, если ноль - PullRequest
20 голосов
/ 02 ноября 2009

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

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

Выдает ошибку, когда возвращает ноль, как я могу сделать так, чтобы CustomerID был пустой строкой, если он нулевой?

/ M

Ответы [ 5 ]

51 голосов
/ 02 ноября 2009

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

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

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

Одним полезным свойством условного оператора null является то, что его также можно «связать» цепью, если вы хотите проверить, являются ли несколько вложенных свойств нулевыми:

// 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() ?? "";

Для C # версий до 6.0 (VS2013 или старше) вы можете объединить это так:

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

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

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

18 голосов
/ 20 января 2015

(C # 2.0 - C # 5.0)

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

(myObject ?? "").ToString()

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

 private HtmlTableCell CreateTableCell(object cellContents)
 {
     return new HtmlTableCell()
     {
         InnerText = (cellContents ?? "").ToString()             
     };
 }
16 голосов
/ 02 ноября 2009

Зависит от типа CustomerID.

Если CustomerID является строкой, вы можете использовать оператор объединения нулей :

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) .

1 голос
/ 02 ноября 2009
SelectList(blah, "blah", "blah", 
(cu.Customer.CustomerID!=null?cu.Customer.CustomerID.ToString():"")
)
0 голосов
/ 02 ноября 2009

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

/// <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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...