2011-01-12 15 views
21

C'è qualche differenza tra gli operatori & e + durante la concatenazione della stringa? se sì, allora qual è la differenza? E se No, allora perché sotto codice generando un'eccezione?Concat stringhe di & e + in VB.Net

Esempio:

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

Quale errore si ottiene? – SLaks

+0

'InvalidCastException' –

+0

Non avevo idea che' + 'fosse anche un operatore di concatenazione in VB. Questa è una delle cose che odio di JavaScript è che '+' è per concat e addizione. – Brad

risposta

28

& e + sono entrambi operatori di concatenazione, ma quando si specifica un numero intero durante l'utilizzo +, vb.net cerca di lanciare "Ciao" in numero intero di fare un'aggiunta. Se si cambia "Ciao" con "123", si otterrà il risultato 124.

4

Probabilmente avete ottenuto Option Strict acceso (che è una buona cosa), e il compilatore vi sta dicendo che non è possibile aggiungere una stringa e un int. Prova questo:

t = s1 & i.ToString()

+1

Chris, l'errore è nell'altra riga di codice. –

+1

È lo stesso problema, al contrario ... sta provando a lanciare il s1 su un int e in mancanza. Per risolvere il problema, usa la prima riga e non la seconda. –

+1

Purtroppo penso che sia sbagliato. Option Strict deve essere Off altrimenti non sarebbe compilato, non preoccupatevi delle eccezioni di runtime. Il mio consiglio sarebbe quello di attivare Option Strict On e quindi correggere gli errori del compilatore con i cast espliciti. – MarkJ

2

Man mano che le conferma di domanda, sono diversi: & è soltanto concatenazione di stringhe, + è sovraccarico di entrambi normale aggiunta e la concatenazione.

Nel tuo esempio:

  • perché uno degli operandi + è un intero VB tenta di convertire la stringa in un numero intero, e la stringa non è numerico getta; e

  • & funziona solo con le stringhe in modo che il numero intero venga convertito in una stringa.

-1

Da un ex concatenater stringa (sp?) Si dovrebbe davvero considerare l'utilizzo di String.Format invece di concatenazione.

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

Rende le cose molto più facili da leggere e mantenere e credo che il codice sia più professionale. Vedi: code better – use string.format. Anche se non tutti sono d'accordo When is it better to use String.Format vs string concatenation?

+2

La concatenazione di una stringa di linea singola è generalmente * più veloce * rispetto alla chiamata di 'String.Format'. Qualsiasi consiglio di usare sempre uno sull'altro è sbagliato, e questa non fa eccezione. Approfitta delle ottimizzazioni del compilatore. Questa idea di fare qualcosa per "rendere il tuo codice più professionale" è stupida. Questo è il tipo di cosa che giustifica l'uso del C++ quando il tuo compito è reso molto più semplice con un linguaggio di scripting dinamico perché oh, che sembra troppo "poco professionale". Il software professionale è roba che * funziona * ... bene. L'apparenza è irrilevante. Le risposte nella domanda che hai collegato sembrano confermarlo. –

19
  • & viene utilizzato solo per la concatenazione di stringhe.
  • + è sovraccarico per eseguire sia la concatenazione di stringhe che l'aggiunta aritmetica.

il duplice scopo di + porta a confusione, esattamente come quello nella sua interrogazione. Soprattutto quando Option Strict è Off, perché il compilatore aggiungerà cast impliciti sulle tue stringhe e interi per cercare di dare un senso al tuo codice.

Le mie raccomandazioni

  • Si dovrebbe girare Option Strict On, il compilatore vi costringerà aggiungere cast espliciti dove si pensa che siano necessarie.
  • È consigliabile evitare l'uso di + per la concatenazione a causa dell'ambiguità con l'aggiunta aritmetica.

Entrambe queste raccomandazioni sono anche nel libro Microsoft Press Practical Guidelines And Best Practises for VB and C# (sezioni 1.16, 21.2)

-1

I miei 2 centesimi:

Se si concatenato una notevole quantità di stringhe, si dovrebbe utilizzare la StringBuilder invece. IMO è più pulito e significativamente più veloce.

+0

A 'StringBuilder' è * non * aiuterà in questo caso. Quando si ha a che fare con meno di (circa) 4 appende, il sovraccarico di 'StringBuilder' in genere non vale la pena. Il richiedente non aggiunge le stringhe in un ciclo, quindi non ha senso. Prima di formulare raccomandazioni, capisci quali sono le cose che stai raccomandando effettivamente * fare * e come funzionano. Abbandona la routine di programmazione del carico. –

+1

"Se concatenate una quantità significativa di stringhe" – Alex7575

+1

@Cody prendersela comoda, amico. Nessuno si fa male qui. – Will

0

È possibile scrivere '&' per aggiungere stringa e intero:

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

uscita saranno:

5577:wscript.exe