Wyciągam varchar
wartości z bazy danych i chcę ustawić, do string
któ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ć?
c#
.net
null
variable-assignment
Splashlin
źródło
źródło
Odpowiedzi:
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_by
jest 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.źródło
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.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 :).Operator COALESCE (??) jest to, co chcesz, ja wierzę.
źródło
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;
źródło
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_by
jest toobject
(które nie może równać się „”), zostanie to przepisane jakothis.approved_by = (planRec.approved_by ?? string.Empty).ToString();
źródło
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() ?? "";
źródło
Użyj operatora łączenia C #: ??
// if Value is not null, newValue = Value else if Value is null newValue is YournullValue var newValue = Value ?? YourNullReplacement;
źródło
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:
Więcej informacji tutaj
źródło
Aby rozszerzyć odpowiedź @ Dave ... jeśli planRec.approved_by jest już ciągiem znaków
this.approved_by = planRec.approved_by ?? "";
źródło
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
Action
parametrem: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);
źródło
Możesz to również zrobić w swoim zapytaniu, na przykład w serwerze sql, Google
ISNULL
iCASE
funkcjach wbudowanych.źródło
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);
źródło