string != "" && string != null - jedno wyrażenie zamiast dwóch

0

Cześć,
mam w klasie kilka stringów typu string nazwa_pliku; które później próbuję połączyć w ścieżkę do pliku funkcją: Path.Combine();
Problem jest taki, że jak zrobię w kodzie if-a w stylu if(nazwa_pliku != "") Path.Combine(...); to i tak wywala mi błąd na początku, bo string jest nullem.
Muszę dodatkowo dać warunek typu nazwa_pliku != null
A moje pytanie to: czy da się sprawdzić jednocześnie czy string != "" oraz string != null?
Wydawało mi się, że każdy string domyślnie jest inicjowany jako "" - czyli nie powinien być pusty.
Dodatkowo przy inicjowaniu zmiennej nie dałem operatora "?", więc zmienna nie powinna być nullable.
Proszę o pomoc.

4
if(!String.IsNullOrEmpty(nazwa_pliku))
{
}
3

Jeszcze lepiej:

string.IsNullOrWhiteSpace(value)

Rozni sie tym ze dla stringa " " IsNullOrEmpty zwroci false, natomiast IsNullOrWhiteSpace zwroci true. Ponadto odradzam pisanie typow z duzej litery. W C# powinno sie raczej uzywac slow kluczowych dla typow, zamiast pisac je z duzych liter (string/String, int/Int32 itp).

Hmm, wyswietlanie postow ucina pusta przestrzen. W przykladzie stringa " " chodzi mi o pustego stringa ze spacjami.

0

Dziękuję.
A proszę mi jeszcze powiedzieć czy tylko string jest inicjalizowany jako null na początku czy np. jak utworzę zmienną typu int lub double to również ona będzie domyślnie null zanim do niej nie przypiszę wartości? Jak to jest z innymi typami?

1

Tylko string (i kazdy typ referencyjny, ale jesli jeszcze nie uczysz sie obiektowosci to nie bede Ci tym zawracal glowy teraz). String jest pewnym wyjatkiem. Wszelkie inne typy wartosciowe (int, bool, char etc) sa inicjalizowane z domyslna wartoscia (np. 0 dla int, false dla bool).

1

Typy referencyjne przyjmują domyślną wartość null. String jest typem referencyjnym.
Natomiast typy wartościowy posiadają swoją domyślną wartość, w przypadku int będzie to 0, w przypadku bool będzie to false.

Poczytaj o typach wartościowych i referencyjnych :)

1

Dziękuję bardzo za pomoc.
Ogólnie to wiem czym jest obiektowość (trochę pisałem już m.in. w C++) i chyba się domyślam o co wam chodzi z typami referencyjnymi :).

0
Aventus napisał(a):

Ponadto odradzam pisanie typow z duzej litery. W C# powinno sie raczej uzywac slow kluczowych dla typow, zamiast pisac je z duzych liter (string/String, int/Int32 itp).

Ja uważam że string, int powinno się używać jeśli są użyte jako typ zmiennej, np.

int x;
string s;

ale frameworkowe nazwy powinny być jeśli jest typ użyty z kropką - np. do wywołania metody statycznej:

String.IsNullOrEmpty(s);
Int32.Parse("123");
0

To tez jakas opcja. Nie bede sie wdawal w polemike bo to kwestia preferencji. Visual Studio domyslnie w takim przypadku doradzi "uproszczenie" nazwy, a wiec do zmiany ze String na string itp.

5
Kofcio napisał(a):

A proszę mi jeszcze powiedzieć czy tylko string jest inicjalizowany jako null na początku czy np. jak utworzę zmienną typu int lub double to również ona będzie domyślnie null zanim do niej nie przypiszę wartości? Jak to jest z innymi typami?

Sęk w tym, że w C# nic samo się nie inicjalizuje na początku.

Aventus napisał(a):

Wszelkie inne typy wartosciowe (int, bool, char etc) sa inicjalizowane z domyslna wartoscia (np. 0 dla int, false dla bool).

Uważałbym z tym "wszystkie", bo niektóre struktury potrafią mieć domyślną wartość null.

Azarien napisał(a):

ale frameworkowe nazwy powinny być jeśli jest typ użyty z kropką - np. do wywołania metody statycznej:

String.IsNullOrEmpty(s);
Int32.Parse("123");

Takie podejście ma trzy wady:

  1. to więcej kodu;
  2. trzeba dodać using;
  3. wygląda jak Java.
0

Uważałbym z tym "wszystkie", bo niektóre struktury potrafią mieć domyślną wartość null.

Moj blad. Szczerze mowiac trudno mi wyobrazic sobie taki przypadek. Masz moze jakis przyklad? Oczywiscie poza wrapowaniem struktury w nullable.

0

No poza Nullable to nie. :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1