Czy istnieje prosty sposób na wykonanie następujących czynności:
String s = myObj == null ? "" : myObj.ToString();
Wiem, że mogę wykonać następujące czynności, ale naprawdę uważam to za hack:
String s = "" + myObj;
Byłoby wspaniale, gdyby Convert.ToString () miał do tego odpowiednie przeciążenie.
Convert.ToString()
robi dokładnie to pierwszą rzeczą, którą napisał pod spodem.Odpowiedzi:
C # 6.0 Edycja:
Dzięki C # 6.0 możemy teraz mieć zwięzłą, wolną od rzutowania wersję oryginalnej metody:
Lub nawet używając interpolacji:
Oryginalna odpowiedź:
lub
by być jeszcze bardziej zwięzłym.
Niestety, jak już wskazano, często będziesz potrzebować rzutowania po obu stronach, aby działało to z typami innymi niż String lub Object:
Dlatego, chociaż może się wydawać elegancka, obsada jest prawie zawsze konieczna i nie jest tak zwięzła w praktyce.
Jak zasugerowano w innym miejscu, polecam użycie metody rozszerzenia, aby uczynić to czystszym:
źródło
string.Format sformatuje null jako pusty ciąg i wywoła ToString () na obiektach innych niż null. Jak rozumiem, właśnie tego szukałeś.
źródło
"" + myObj
. Ale czytałem, że tworzy to dodatkowe struny.str.Concat(myObj)
wydaje się działać dobrze i jest „jeszcze szybszy”.Od tamtej
Convert.ToString(Object value)
pory .Net 2.0 (około 5 lat przed zapytaniem o to pytanie) wydaje się robić dokładnie to, czego chcesz:http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
Czy brakuje mi / źle interpretuję coś naprawdę oczywistego?
źródło
Za pomocą metody rozszerzenia można to osiągnąć:
Poniższe nie zapisałyby nic na ekranie i nie zgłosiłyby wyjątku:
źródło
string s = "" + myObj;
to hacking, wywołanie funkcji na obiekcie zerowym powinno trafić do tej samej łodzi. Głosowałbym negatywnie, ale rozwiązuje to problem, po prostu nie zgadzam się z użyciem. Obiekty puste powinny być rzucaneNullReferenceException
, nawet w metodach rozszerzających.ToStringOrEmptyWhenNull
.this
parametr), ponieważ są one tylko cukrem składniowym. To jestx.SomeExtensionMethod()
cukier syntaktyczny dlaSomeStaticClass.SomeExtensionMethod(x);
Tak więc, kiedyx
nienull
próbujemy wywołać metody nanull
obiekcie, ale raczej przekazujemynull
obiekt do metody statycznej. Jeśli i tylko wtedy, gdy ta metoda sprawdzanull
parametr i zgłasza w przypadku napotkania takiego, metoda rozszerzająca zostanie „wywołana” w przypadku zgłoszenianull
obiektu.Nie zgadzam się z tym:
jest w jakikolwiek sposób hackerem. Myślę, że to dobry przykład przejrzystego kodu. Jest absolutnie oczywiste, co chcesz osiągnąć i że oczekujesz zerowej wartości.
AKTUALIZACJA:
Teraz widzę, że nie powiedziałeś, że to był hack. Ale z pytania wynika, że myślisz, że ten sposób nie jest właściwy. Moim zdaniem to zdecydowanie najwyraźniejsze rozwiązanie.
źródło
byłby najkrótszą drogą, jak sądzę, i miałby również znikomy narzut wydajności. Pamiętaj jednak, że dla czytelnika kodu nie byłoby całkiem jasne, jaki jest zamiar.
źródło
Concat
faktycznie robi zerowe sprawdzenie pod spodem i zwracastring.Empty
lubarg0.ToString()
, co wydaje się być nieco bardziej wydajne (mam na myśli, mówimy tutaj ms).właściwie nie rozumiałem, co chcesz robić. Jak rozumiem, możesz napisać ten kod w inny sposób. Pytasz o to czy nie? Czy możesz to bardziej wyjaśnić?
źródło
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
Mogę zostać pobity za moją odpowiedź, ale tak czy inaczej:
Po prostu napisałbym
string s = "" if (myObj! = null) {x = myObj.toString (); }
Czy korzystanie z operatora trójskładnikowego się opłaca? Nie wiem z góry mojej głowy.
I oczywiście, jak wspomniano powyżej, możesz umieścić to zachowanie w metodzie takiej jak safeString (myObj), która pozwala na ponowne użycie.
źródło
Miałem ten sam problem i rozwiązałem go po prostu rzucając obiekt na łańcuch. Działa to również w przypadku obiektów o wartości null, ponieważ ciągi znaków mogą mieć wartość null. O ile absolutnie nie chcesz mieć łańcucha zerowego, powinno to działać dobrze:
źródło
Niektóre (szybkie) testy wydajności podsumowujące różne opcje, ale nie to, że to naprawdę ma znaczenie # mikrooptymalizacja (przy użyciu rozszerzenia linqpad )
Opcje
Prawdopodobnie ważne jest, aby wskazać, że
Convert.ToString(...)
zachowa ciąg pusty.Wyniki
Obiekt
Strunowy
źródło
Komentarz Holstebroe byłby najlepszą odpowiedzią:
Jeśli
myObj
jest null, Format umieszcza tam wartość pustego ciągu.Spełnia również wymagania dotyczące jednej linii i jest łatwy do odczytania.
źródło
Mimo że jest to stare pytanie, a OP zapytany o C #, chciałbym udostępnić rozwiązanie VB.Net dla tych, którzy pracują z VB.Net zamiast C #:
Niestety VB.Net nie pozwala na? -Operator po zmiennej, więc myObj? .ToString nie jest poprawne (przynajmniej nie w .Net 4.5, którego użyłem do testowania rozwiązania). Zamiast tego używam If, aby zwrócić pusty ciąg w przypadku, gdy myObj ist Nothing. Zatem pierwszy Tostring-Call zwraca pusty ciąg, podczas gdy drugi (gdzie myObj nie jest Nothing) zwraca „42”.
źródło