2011-01-12 5 views
21

Czy jest jakaś różnica między & a operatorami + podczas łączenia łańcucha? jeśli tak, to jaka jest różnica? A jeśli nie, to dlaczego poniżej wyjątku generowania kodu?Łańcuchy konkatencji przez & i + w VB.Net

Przykład:

Dim s, s1, t As String 
    Dim i As Integer 

    s1 = "Hello" 
    i = 1 

    s = s1 & i 
    t = s1 + i //Exception here 

    If s = t Then 
     MessageBox.Show("Equal...") 
    End If 
+0

Jaki błąd otrzymasz? – SLaks

+0

'InvalidCastException' –

+0

Nie miałem pojęcia, że' + 'jest nawet operatorem konkatenacji w VB. Jedną z rzeczy, których nienawidzę w JavaScript jest to, że '+' jest dla concata i addycji. – Brad

Odpowiedz

28

& i + są zarówno operatorzy concatenation ale gdy podasz liczbę całkowitą podczas korzystania + vb.net próbuje rzucić „cześć” do liczby całkowitej zrobić dodatek. Jeśli zmienisz „Hello” z „123”, otrzymasz wynik 124.

4

Pewnie dostał Option Strict włączone (co jest dobre), a kompilator mówi ci, że nie możesz dodać ciąg i int. Spróbuj tego:

t = s1 & i.ToString()

+1

Chris, błąd jest w drugiej linii kodu. –

+1

To ten sam problem, na odwrót ... próbuje rzucić s1 na int i zawodzi. Aby to naprawić, użyj pierwszego wiersza, a nie drugiego. –

+1

Niestety, myślę, że to jest złe. Opcja Strict musi być wyłączona, w przeciwnym razie nie skompilowałaby się, nie licząc wyjątków w czasie wykonywania. Moja rada to włączyć opcję Strict On, a następnie naprawić błędy kompilatora za pomocą jawnych rzutów. – MarkJ

2

jak Twoje pytanie potwierdza, że ​​są różne: & jest tylko ciąg konkatenacji, + jest przeciążony zarówno zwykłego dodawania i konkatenacji.

W przykładzie:

  • ponieważ jeden z argumentów do + jest liczbą całkowitą VB próbuje przekonwertować ciąg do liczby całkowitej, a nie jako ciąg jest numeryczne rzuca; i

  • & działa tylko z ciągami, więc liczba całkowita jest konwertowana na ciąg znaków.

-1

Z poprzedniej konkatenacji łańcuchowej (sp?) Powinieneś naprawdę rozważyć użycie String.Format zamiast konkatenacji.

Dim s1 As String 
    Dim i As Integer 
    s1 = "Hello" 
    i = 1 
    String.Format("{0} {1}", s1, i) 

Dzięki temu jest dużo łatwiej czytać i utrzymywać, a moim zdaniem kod wygląda bardziej profesjonalnie. Zobacz: code better – use string.format. Chociaż nie wszyscy zgadzają się z tym, że When is it better to use String.Format vs string concatenation?

+2

Łączenie ciągów pojedynczych linii zwykle jest * szybsze * niż wywoływanie 'String.Format'. Każda rada, aby zawsze używać jednej nad drugą, jest błędna i nie jest to wyjątkiem. Skorzystaj z optymalizacji kompilacji. Ten pomysł zrobienia czegoś, aby "sprawić, by twój kod wyglądał bardziej profesjonalnie" jest głupi. To jest właśnie to, co usprawiedliwia używanie C++, gdy twoje zadanie jest znacznie łatwiejsze dzięki dynamicznemu językowi skryptowemu, ponieważ, och, to po prostu wygląda na "nieprofesjonalne". Profesjonalne oprogramowanie to coś, co * działa * ... cóż. Wygląd nie ma znaczenia. Odpowiedzi na pytanie, które łączysz, potwierdzają to. –

19
  • & służy tylko do łączenia ciągów.
  • + jest przeciążone, aby wykonać zarówno łączenie ciągów, jak i dodawanie arytmetyczne.

Podwójny cel + prowadzi do zamieszania, dokładnie tak jak w pytaniu. Zwłaszcza gdy Option Strict jest Off, ponieważ kompilator doda niejawne rzutowania na twoje ciągi i liczby całkowite, aby spróbować zrozumieć kod.

Moje zalecenia

  • powinno się włączyć Option Strict On, wówczas kompilator zmusi Cię do dodawania jawnych odlewane gdzie myśli są one konieczne.
  • Należy unikać używania + do konkatenacji z powodu niejednoznaczności z dodawaniem arytmetycznym.

Oba te zalecenia są również w książce Microsoft Press Practical Guidelines And Best Practises for VB and C# (sekcje 1.16, 21.2)

-1

Moje 2 centów:

Jeśli łącząc znaczną ilość strun, powinno być przy użyciu Zamiast tego StringBuilder. IMO jest czystszy i znacząco szybszy.

+0

"StringBuilder' to * nie * pomoże w tym przypadku. Kiedy masz do czynienia z mniej niż (około) 4 załącznikami, narzut 'StringBuilder' na ogół nie jest tego wart. Pytający nie dodaje ciągów w pętli, więc nie ma sensu. Zanim zaczniesz wydawać rekomendacje, sprawdź, co naprawdę polecasz. * Do * i jak działają. Porzuć rutynową procedurę programowania ładunków. –

+1

"Jeśli łączysz znaczną liczbę napisów" – Alex7575

+1

@Cody, uspokój się, kolego. Nikt tu nie ucierpi. – Will

0

można napisać '&', aby dodać ciąg i całkowita:

processDetails=objProcess.ProcessId & ":" & objProcess.name 
message = msgbox(processDetails,16,"Details") 

wyjście będzie:

5577:wscript.exe