2013-08-20 6 views
8

Próbuję ukryć kod VB.NET na C# i znalazłem tę interesującą rzecz. Dodanie dwóch znaków zwraca różne wyniki w VB.NET i C#.W C# dlaczego (char) (1) + (char) (2) daje int 3

VB.NET - zwraca ciąg

Chr(1) & Chr(2) = " " 

C# - powraca int

(char)(1) + char(2) = 3 

Jak mogę dodać (oddzielając) dwóch znaków w języku C#?

+0

Masz na myśli łączenie? – Paparazzi

+0

popraw mnie jeśli się mylę - C# i java char i int arr o tej samej wielkości i 0001 + 0010 = 0011 (3). –

+0

@ Blam - yes Concatenate – SarkarG

Odpowiedz

15

W języku C# char is a 16-bit numeric type, więc + oznacza dodawanie, a nie konkatenację. Dlatego po dodaniu a i b otrzymasz a+b. Ponadto wynikiem tego dodania jest int (see a quick demo).

Jeśli przez "dodanie dwóch znaków" rozumie się "konkatenację", konwersja ich na ciągi przed zastosowaniem operatora + będzie jedną z opcji. Innym rozwiązaniem mogłoby być używając string.Format, tak:

string res = string.Format("{0}{1}", charA, charB); 
+0

+1 Niestety opuściłeś najciekawszą część ... Dlaczego w C# wiele operacji upcast do int :-) – xanatos

+0

Cóż, nadal musisz odpowiedzieć na pytanie: P –

+0

Ahaa ... Teraz mam to. Wypróbowałem wszystkie wymienione tu odpowiedzi, a 'string.formularz 'wydaje się być najczystszym sposobem na zrobienie tego. Również odpowiedź od xanatos i Coraka jest dobra, ale może to zmylić zespół w przyszłości. – SarkarG

6

Dodając do pustego łańcucha można wymusić "konwersja" w char do string ... Więc

string res = "" + (char)65 + (char)66; // AB 

(technicznie to isn” Konwersja: kompilator wie, że po dodaniu do string musi zrobić trochę magii ... Jeśli spróbujesz dodać null do ciągu znaków, to uważa się, że null jest pusty, jeśli spróbujesz dodać string a string.Concat i i f próby dodawania czegokolwiek innego to robi .ToString() na elemencie non-strunowej i następnie string.Concat)

0

(char) (1) ma wartość ASCII 1 i (char) (2) wartość ASCII 2

tak ascii wartość 1 + 2 (np. (char) 1 + (char) 2) będzie równe 3.

jeśli to zrobisz: "2" + "1" da ci to "21" (ale nie powinieneś używać tego do łączenia ciągów, zła praktyka)

jeśli to zrobisz: '2' + '1' da ci wartość int równą 99, która jest wartością ascii 2 (która wynosi 50) + wartość ascii 1 (która wynosi 49).

+0

Dlaczego jest to zła praktyka? – Arijoon

0

Najlepsza odpowiedź znajduje się w komentarzach, więc chcę go tutaj przenieść do właściwej odpowiedzi. Z pełnym kredytem na @Jeow Li Huan:

string res = string.Concat(charA, charB);