2009-03-12 11 views
51

W artykule MSDN na String Basics pokazuje to:Dlaczego dodawanie wartości null do ciągu jest legalne?

string str = "hello"; 
string nullStr = null; 
string emptyStr = ""; 

string tempStr = str + nullStr; // tempStr = "hello" 
bool b = (emptyStr == nullStr);// b = false; 
string newStr = emptyStr + nullStr; // creates a new empty string 
int len = nullStr.Length; // throws NullReferenceException 

Dlaczego nie łącząc z zerową rzucać wyjątku null odniesienia? Czy to ułatwia życie programistom, tak aby nie musieli sprawdzać wartości zerowej przed konkatenacją?

Odpowiedz

51

Od MSDN:

W operacji konkatenacji ciągów, the # kompilator C traktuje łańcuch pusty tak samo jak pusty ciąg, ale nie konwertuje wartość oryginalnym łańcuchem pustym.

Więcej informacji na temat + binary operator:

Operator binarny + wykonuje Ciąg konkatenacji, gdy jeden lub oba argumenty są typu łańcucha.

Jeśli operand dla konkatenacji jest pusty, zastępuje pusty łańcuch. W przeciwnym razie argumentem innym niż łańcuchowym jest przekonwertowany na jego reprezentację łańcuchową przez wywołanie wirtualnej metody ToString odziedziczonej z obiektu typu.

Jeśli ToString zwraca wartość null, zastępowany jest pusty ciąg .

+0

Pytanie dotyczyło ostatecznie racjonalnego sposobu projektowania języka. Niektórzy ludzie próbowali odgadnąć inne odpowiedzi. Potrzebujemy kogoś z państw członkowskich, aby tu odpowiedzieć. –

+0

Doskonały wybór przez zespół C#, ponieważ okazało się działać jak czar z operatorem null-warunkowym C# 6, zwłaszcza w połączeniu z funkcjami interpolacji ciągów C# 6: 'return $" {person? .FirstName} {person? .LastName} "' – GDS

0

Przyczyną, dla której nie jest zgłaszany zerowy wyjątek referencyjny, jest fakt, że w rzeczywistości nie próbujesz uzyskać dostępu do żadnych właściwości lub metod obiektu zerowego. Podczas cytowania CMS, podczas łączenia łańcucha, wartości null są zastępowane pustymi ciągami.

+0

To właśnie robi, a nie * dlaczego * robi to. –

1

Domyślam się, że projektanci języków (lub biblioteki standardowej) zdecydowali, że to dość częsty przypadek, że mogliby programiście zyskać przychylność.

(Neat! I zawsze po prostu założyć concating NULL będzie przez wyjątek!)

3

koncepcyjnej, łańcuchy są zwykle traktowane jako wartości w przeciwieństwie do odwołań do obiektów, które mają tożsamość. Jednym z głównych powodów, dla których nie są one semantyką wartości, jest obciążenie związane z kopiowaniem na zadanie. Jeśli łańcuchy były wartościami, nie mogły być zerowane, a więc operator "+" jest traktowany tak, jakby był pustym ciągiem znaków (to jest tak, jakby default(string) == "" tak jak).

6

Zgadzam się, że łańcuchy koncepcyjne są po prostu wartościami. Jednakże, należy rozważyć następujący kod:

int? i = null; 
i += 1; // The result of this is that i == null 

Jeśli pozostali operatorzy typ wartości domyślne używane() sposób operatorzy strunowe konwertowania null „”, Twój wyjaśnienie sensu.

Najprościej powiedzieć, że operatory napisów są skrótem (specjalny przypadek) dla wygody.

Powiązane problemy