Uwielbiam operator łączenia wartości null, ponieważ ułatwia przypisywanie wartości domyślnej dla typów dopuszczających wartość null.
int y = x ?? -1;
To świetnie, z wyjątkiem sytuacji, gdy muszę zrobić coś prostego x
. Na przykład, jeśli chcę to sprawdzić Session
, zwykle muszę napisać coś bardziej szczegółowego.
Chciałbym móc to zrobić:
string y = Session["key"].ToString() ?? "none";
Ale nie możesz, ponieważ .ToString()
zostaje wywołany przed sprawdzeniem zerowej wartości, więc kończy się niepowodzeniem, jeśli Session["key"]
jest zerowy. W końcu robię to:
string y = Session["key"] == null ? "none" : Session["key"].ToString();
Działa i moim zdaniem jest lepsza niż trzywierszowa alternatywa:
string y = "none";
if (Session["key"] != null)
y = Session["key"].ToString();
Mimo że to działa, wciąż jestem ciekawy, czy istnieje lepszy sposób. Wydaje się, że nie ma znaczenia, do czego zawsze muszę się odwoływać Session["key"]
dwukrotnie; raz do sprawdzenia i jeszcze raz do zadania. Jakieś pomysły?
.?
), jak ma Groovy .Odpowiedzi:
Co powiesz na
źródło
.ToStringOrDefault()
jest moim preferowanym sposobem robienia tego. Jednak używam tej odpowiedzi w ramach metody rozszerzenia Jona;)Jeśli często robisz to specjalnie z,
ToString()
możesz napisać metodę rozszerzającą:Lub oczywiście domyślna metoda:
źródło
.ToStringOrDefault()
jest prosty i elegancki. Fajne rozwiązanie.object
są przekleństwem i śmieciami w bazie kodu, a metody rozszerzające, które działają bez błędów nathis
wartościach null , są czystym złem.Możesz także użyć
as
, co daje,null
jeśli konwersja się nie powiedzie:To wróci
"none"
nawet jeśli ktoś nadziewane sięint
inSession["key"]
.źródło
ToString()
w pierwszej kolejności.ToString()
do konwersji obiektu zawierającego ciąg znaków na ciąg. Możesz zrobić to samo za pomocąobj as string
lub(string)obj
. To dość powszechna sytuacja w ASP.NET.ToString()
obiekt (mianowicieSession["key"]
), którego typu nie wymienił. Może to być dowolny obiekt, niekoniecznie ciąg.Jeśli zawsze będzie
string
, możesz przesyłać:Ma to tę zaletę, że narzekają, zamiast ukrywać błąd, jeśli ktoś wbija
int
coś lub coś w środkuSession["key"]
. ;)źródło
Wszystkie sugerowane rozwiązania są dobre i odpowiedz na pytanie; więc to jest tylko nieznaczne wydłużenie. Obecnie większość odpowiedzi dotyczy tylko walidacji wartości null i typów ciągów. Możesz rozszerzyć
StateBag
obiekt, aby zawierał ogólny plikGetValueOrDefault
metodę , podobną do odpowiedzi opublikowanej przez Jona Skeeta.Prosta ogólna metoda rozszerzenia, która akceptuje ciąg jako klucz, a następnie typ sprawdza obiekt sesji. Jeśli obiekt ma wartość null lub nie jest tego samego typu, zwracana jest wartość domyślna, w przeciwnym razie zwracana jest wartość sesji o silnym typie.
Coś takiego
źródło
HttpSessionState
.T value = source[key] as T; return value ?? defaultValue;
HttpSessionState
sesję. :)Używamy metody o nazwie
NullOr
.Stosowanie
Źródło
źródło
Dot
Rozważaliśmy, ale uznaliśmy, że jest to zbyt nieopisowe. Zdecydowaliśmy się naNullOr
dobry kompromis między samowyjaśnieniem a zwięzłością. Jeśli naprawdę nie dbałeś o nazewnictwo, zawsze możesz to nazwać_
. Jeśli uznasz, że lambdy są zbyt kłopotliwe do napisania, możesz użyć do tego fragmentu kodu, ale osobiście uważam to za dość łatwe. Co do tego? :
, nie możesz tego używać z bardziej złożonymi wyrażeniami, musiałbyś przenieść je do nowego lokalnego;NullOr
pozwala tego uniknąć.Wolałbym jednorazowo użyć bezpiecznego rzutowania na łańcuch na wypadek, gdyby obiekt przechowywany z kluczem nie był jednym. Używanie
ToString()
może nie przynieść oczekiwanych rezultatów.Jak mówi @Jon Skeet, jeśli często robisz to jako metoda rozszerzająca lub, jeszcze lepiej, może metoda rozszerzająca w połączeniu z silnie wpisaną klasą SessionWrapper. Nawet bez metody rozszerzającej opakowanie o jednoznacznie określonym typie może być dobrym pomysłem.
Użyty jako
źródło
stworzyć funkcję pomocniczą
źródło
Odpowiedź Skeeta jest najlepsza - szczególnie uważam, że jego
ToStringOrNull()
jest dość elegancki i najlepiej pasuje do twoich potrzeb. Chciałem dodać jeszcze jedną opcję do listy metod rozszerzających:Zwróć oryginalny obiekt lub domyślną wartość ciągu dla null :
Użyj
var
dla zwróconej wartości, ponieważ wróci jako typ oryginalnego wejścia, tylko jako ciąg domyślny, kiedynull
źródło
null
defaultValue
jeśli nie jest potrzebny (to znaczyinput != null
)?input != null
Eval zwróci przedmiot jako siebie.input == null
zwraca ciąg podany jako parametr. dlatego jest możliwe, że osoba mogłaby zadzwonić.OnNullAsString(null)
- ale celem (choć rzadko użyteczna metoda rozszerzenia) było zapewnienie albo odzyskania obiektu z powrotem, albo domyślnego ciągu ... nigdy nullinput!=null
Scenariusz zwróci jedynie wejście czydefaultValue!=null
też posiada; w przeciwnym razie wyrzuci plikArgumentNullException
.To jest mój mały "operator Elvisa" bezpieczny dla typów dla wersji .NET, które nie obsługują?.
Pierwszym argumentem jest testowany obiekt. Druga to funkcja. A trzecia to wartość zerowa. Więc w twoim przypadku:
Jest to również bardzo przydatne w przypadku typów dopuszczających wartość null. Na przykład:
źródło