2012-04-24 10 views
15

istnieje wiele razy, w którym mam tekst wejściowy,C# pusty ciąg -> zero?

i jeśli jego puste (nie zrobił użytkownik wpisać dowolny tekst) - chcę wysłać do zapytania DB „null”

i nieString.Empty. (lub "")

więc uważam moje ja robi to dużo:

var mySqlValue = string.IsNullOrEmpty(tbCustomerId.Text)?null:tbCustomerId.Text; 

to wydaje mi się brzydkie.

.net daje wiele innych rozwiązań na przeciwległych scenariuszy:

 string.IsNullOrEmpty 
     string.IsNullOrWhiteSpace 
     myProblemVal ?? myDefultVal 

Wiem, że to może być rozwiązany za pomocą metod rozszerzenie - i wiem jak to zrobić ..

ale czy jest coś lepszego?

czy istnieje inteligentny kod dla: "if its empty -> null".

+0

Istnieje również następujący problem: Jeśli '.Text' jest właściwością (tj. Wywołaniem do' get' dostępowego), to po pierwszym wywołaniu gettera może zwrócić długi łańcuch, np. "John Doe" '. Dostajemy do oceny ostatniego "komponentu" potrójnego operatora '?:'. Ale to znowu wywołuje getter 'Text' i tym razem może zwrócić' "". W tym celu musisz pobrać lokalną zmienną kopię 'Text'. Oczywiście nie jest to konieczne, jeśli używasz metody rozszerzenia. –

+0

Jeśli używasz metody rozszerzenia, możesz 'Trim()' ciąg przed sprawdzeniem, co jest trudne do zrobienia w pojedynczym wyrażeniu. – toddmo

Odpowiedz

5

ale czy jest coś lepszego?

Nie, chociaż twierdzę, że to, co opisujesz w pytaniu (metody przedłużania) jest absolutnie w porządku. I jak opisujesz w pytaniu, w innym kierunku masz koalescing null.

+0

Będę zadowolony usłyszeć i dowiedzieć się, co nie jest "absolutnie w porządku" –

+0

@Royi ??? zmieszany; metoda rozszerzenia nie jest tu brzydka ... –

+0

@Royi Miałem na myśli metodę metody rozszerzania - wyjaśniłem, że –

17

można wykorzystywać metodę rozszerzenia:

public static class Extensions { 
    public static string NullIfWhiteSpace(this string value) { 
     if (String.IsNullOrWhiteSpace(value)) { return null; } 
     return value; 
    } 
} 

które można użyć tak:

var mySqlValue = tbCustomerId.Text.NullIfWhiteSpace(); 

ja naprawdę nie wiem, co można sobie wyobrazić coś lepszego niż metody rozszerzenie. Jak definiujesz "lepsze"? Krótszy? Używając specjalnego słowa kluczowego? Używanie rzadko używanych operatorów do sprytnego wyglądu? To już tylko pojedyncze wywołanie metody dołączone do twojej wartości, które działa nawet na wartości null, a logika, której potrzebujesz, nie może być wyrażona w krótszy sposób niż ta. Ponadto nie znam żadnej specjalnej składni.

+0

i explictly napisałem "Wiem, że można to rozwiązać metodami Extension - i wiem, jak to zrobić ..." - czy jest coś lepszego –

+0

oops, nie widziałem tej części :) Ale nie widzę bardziej eleganckiego droga. – Botz3000

+5

Mimo że powiedział, że wie, jest to prawdopodobnie najlepszy sposób, zamiast całego grona, jeśli ifs – Matthew

3

Deklarują swoją własną metodę statyczną:

public static string NullIfEmpty(string value) 
{ 
    return string.IsNullOrEmpty(value) ? null : value; 
} 

Doing

MyHelper.NullIfEmpty (wartość) nie brzydsze niż wywołanie statycznej metody typu string ... I wydaje czystsze niż piśmie "string.IsNullOrEmpty (tbCustomerId.Text)? null: tbCustomerId.Text" za każdym razem.

+3

Hehe, jeśli umieścisz tę metodę w klasie statycznej i użyjesz słowa kluczowego 'this', możesz użyć jej jako metody rozszerzenia ;) - O wiele krótszy by napisać – Matthew

+4

mógłbyś przynajmniej uczynić to metodą rozszerzenia, nie? –

+0

Oczywiście można wykonać metodę rozszerzenia, ale nie podoba mi się to, szczególnie w przypadku odwołań zerowych. Osobisty wybór. – Guillaume