Najkrótszy sposób sprawdzenia wartości null i przypisania innej wartości, jeśli nie


86

Wyciągam varcharwartości z bazy danych i chcę ustawić, do stringktórego przypisuję je jako „”, jeśli są null. Obecnie robię to w ten sposób:

if (string.IsNullOrEmpty(planRec.approved_by) == true)
  this.approved_by = "";
else
  this.approved_by = planRec.approved_by.toString();

Wygląda na to, że powinien być sposób, aby to zrobić w jednej linii, na przykład:

this.approved_by = "" || planRec.approved_by.toString();

Jednak nie mogę znaleźć optymalnego sposobu, aby to zrobić. Czy jest lepszy sposób, czy też mam najlepszy sposób, aby to zrobić?


5
== true jest tutaj zbędne ...
cjk,

Odpowiedzi:


104

Spróbuj tego:

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? "" : planRec.approved_by.toString();

Możesz również użyć operatora łączącego wartości null, jak powiedzieli inni - ponieważ nikt nie podał przykładu, który działa z twoim kodem, tutaj jest jeden:

this.approved_by = planRec.approved_by ?? planRec.approved_by.toString();

Ale ten przykład działa tylko dlatego, że możliwa wartość this.approved_byjest taka sama, jak jedna z potencjalnych wartości, na które chcesz ją ustawić. We wszystkich innych przypadkach będziesz musiał użyć operatora warunkowego, jak pokazałem w moim pierwszym przykładzie.


8
Czy ten operator koalescencji zerowej i tak nie zgłasza odwołania zerowego? Ja widzę ten kod wykonuje następujące operacje: if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}. Jeśli się mylę, proszę wskazać błąd.
Destrictor

10
@Destrictor ma rację, kod jest uszkodzony. Oto poprawka z użyciem innego zabawnego operatora: this.approved_by = planRec.approved_by?.toString() ?? ""; <- To jest operator warunkowy zerowy i nie sądzę, że był w pobliżu, kiedy po raz pierwszy zadano to pytanie i udzielono odpowiedzi. Miejmy nadzieję, że OP to zobaczy, więc może przejść do refaktoryzacji swojego 7-letniego kodu sprzed dwóch prac :).
Patrick,


30

Szukasz operatora koalescencji C #: ??. Ten operator przyjmuje lewy i prawy argument. Jeśli lewa strona operatora ma wartość null lub dopuszcza wartość null bez wartości, zwróci prawy argument. W przeciwnym razie zwróci lewą stronę.

var x = somePossiblyNullValue ?? valueIfNull;

Ta odpowiedź nie obejmuje wszystkich przypadków z pytania (tylko częściowo). Zauważ, że istnieje „string.IsNullOrEmpty”. Więc pusty przypadek nie jest tutaj obsługiwany.
Bronek

28

Domyślam się, że najlepsze, co możesz wymyślić, to

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty
                                                      : planRec.approved_by.ToString();

Oczywiście, ponieważ sugerujesz, że approved_byjest to object(które nie może równać się „”), zostanie to przepisane jako

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();

20

W C # 6 istnieje nieco krótsza droga dla przypadku, gdy planRec.approved_by nie jest ciągiem:

this.approved_by = planRec.approved_by?.ToString() ?? "";

15

Użyj operatora łączenia C #: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;

15

Począwszy od języka C # 8,0, można użyć operatora ?? =, aby zamienić kod formularza

if (variable is null)
{
    variable = expression;
}

z następującym kodem:

variable ??= expression;

Więcej informacji tutaj


9

Aby rozszerzyć odpowiedź @ Dave ... jeśli planRec.approved_by jest już ciągiem znaków

this.approved_by = planRec.approved_by ?? "";

2

Aby przypisać niepustą zmienną bez powtarzania rzeczywistej nazwy zmiennej (i bez przypisywania czegokolwiek, jeśli zmienna ma wartość null!), Możesz użyć małej metody pomocniczej z Actionparametrem:

public static void CallIfNonEmpty(string value, Action<string> action)
{
    if (!string.IsNullOrEmpty(value))
        action(value);
}

A potem po prostu użyj:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);

1

Możesz to również zrobić w swoim zapytaniu, na przykład w serwerze sql, Google ISNULLi CASEfunkcjach wbudowanych.


-4

Używam metody rozszerzania SelfChk

static class MyExt {
//Self Check 
 public static void SC(this string you,ref string me)
    {
        me = me ?? you;
    }
}

Następnie użyj like

string a = null;
"A".SC(ref a);

Myślę, że masz na myśli, ale niełatwe do odczytania i zrozumienia, prawda?
Ali Humayun

3
UPS! Masz całkowitą rację: bardzo krótki, ale NIEłatwy do odczytania i zrozumienia (przynajmniej jeśli nie jesteś przyzwyczajony do tego zapisu)
Jack Miller

w takim razie spróbuj przeczytać książkę. Wydawałoby się, że jest to naprawdę obszerne i łatwe do zrozumienia: p
Ali Humayun
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.