Come devo trasmettere in VB.NET?


151

Sono tutti uguali? In quali circostanze dovrei scegliere ciascuno rispetto agli altri?

  • var.ToString ()

  • CStr (Var)

  • CType (var, String)

  • DirectCast (var, String)


EDIT: Suggerimento da NotMyself ...

  • TryCast (var, String)

Risposte:


156

Sono tutti leggermente diversi e generalmente hanno un uso accettabile.

  • var.ToString()ti darà la rappresentazione in forma di stringa di un oggetto, indipendentemente dal tipo. Usalo se varnon è già una stringa.
  • CStr(var)è l'operatore di cast della stringa VB. Non sono un ragazzo VB, quindi suggerirei di evitarlo, ma non farà davvero del male a nulla. Penso che sia sostanzialmente lo stesso di CType.
  • CType(var, String) convertirà il tipo specificato in una stringa, utilizzando tutti gli operatori di conversione forniti.
  • DirectCast(var, String)viene utilizzato per eseguire l'upgrade di un oggetto in una stringa. Se sai che una variabile oggetto è, in effetti, una stringa, usa questa. Questo è lo stesso (string)vardi C #.
  • TryCast(come indicato da @ NotMyself ) è simile DirectCast, ma verrà restituito Nothingse la variabile non può essere convertita in una stringa, anziché generare un'eccezione. Questo è lo stesso var as stringdi C #. Anche la TryCastpagina su MSDN ha un buon confronto.

15
Non c'è mai un motivo per usare CType (var, String) invece di CStr (var), fanno esattamente la stessa cosa.
Jonathan Allen,

2
@Maslow TryCastfunziona solo per i tipi di valore, poiché deve essere un tipo che può avere Nothingcome valore
bdukes,

1
@Martinho abbastanza bene. Ciò dovrebbe dire "funziona solo per il tipo di riferimento "
bdukes il

3
CStr(var)soffocerà e genererà un'eccezione se var è DBNull.Value, ma l'alternativa Convert.ToString(var)restituirà una stringa vuota.
MCattle

Dim myList AS ArrayList=new ArrayListQuando scrivi (From e In myList select CType(e.Name,String)).ToArray()non funziona. Sono venuto a scrivere ... select CType(e.Name.ToString,String)).ToArray()e ho recuperato il mio sorriso.
Bellash,

13

Cstr() è compilato in linea per prestazioni migliori.

CType consente il cast tra tipi se è definito un operatore di conversione

ToString() Tra tipo base e stringa genera un'eccezione se la conversione non è possibile.

TryParse()Da String a base typeifpossibile altrimenti restituisce false

DirectCastutilizzato se i tipi sono correlati tramite ereditarietà o condividono un'interfaccia comune, genererà un'eccezione se il cast non è possibile, trycastnon restituirà nulla in questa istanza


8

MSDN sembra indicare che i cast Cxxx per tipi specifici possono migliorare le prestazioni in VB .NET perché vengono convertiti in codice inline. Per qualche ragione, suggerisce anche DirectCast in contrapposizione a CType in alcuni casi (la documentazione afferma che è quando c'è una relazione di ereditarietà; credo che ciò significhi che la sanità mentale del cast sia controllata al momento della compilazione e che le ottimizzazioni possano essere applicate mentre CType usa sempre il Runtime VB.)

Quando scrivo il codice VB .NET, ciò che uso dipende da ciò che sto facendo. Se è il prototipo del codice che sto per buttare via, uso qualunque cosa mi capiti di scrivere. Se è il codice di cui sto seriamente, provo a usare un cast Cxxx. Se uno non esiste, utilizzo DirectCast se ho la ragionevole convinzione che esista una relazione ereditaria. Se è una situazione in cui non ho idea del successo del cast (input dell'utente -> numeri interi, per esempio), allora uso TryCast in modo da fare qualcosa di più amichevole che lanciare un'eccezione all'utente.

Una cosa che non riesco a scuotere è che tendo a usare ToString invece di CStr ma presumibilmente Cstr è più veloce.


8

Preferisco la sintassi seguente:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

Ah, puoi dire che in genere scrivo codice in C #. 8)

Il motivo per cui preferisco TryCast è che non devi fare confusione con le spese generali di trasmissione delle eccezioni. Il tuo cast ha esito positivo o la variabile viene inizializzata su null e la gestisci di conseguenza.


2
Penso che ti sbagli. non è una buona idea usare TryCast. in un caso come il tuo, dovrebbe essere usato number.ToString () o CStr (numero).
Shimmy Weitzhandler,

4
@Shimmy: qual è la ragione per non usare TryCast? Non è meglio che DirectCast eviti un'eccezione in determinati scenari?
Dienekes

3
@Dienekes e NotMyself. TryCast è solo per i tipi di RIFERIMENTO. Qui, abbiamo un numero intero, che è un tipo VALUE. Il compilatore rifiuterà TryCast. Inoltre, l'obiettivo è una stringa. Qualsiasi entità .Net tranne Nothing supporta .ToString(). Un tipo di valore, come Integer, non può essere Nothing. Quindi, in questo caso, CStr (numero) o number.ToString () è sicuro. Nel caso generale (non solo i tipi di valore), CStr (qualunque cosa) è sicuro, perché può gestire Nothing: il risultato sarà Nothing, nella variabile String. TryCast è molto utile, ma non qui.
ToolmakerSteve

4

-1 perché DirectCast NON è palesemente appropriato qui, tranne in situazioni molto limitate, che non ti sei preoccupato di menzionare. DirectCast è utile quando sai di avere due TIPI DI RIFERIMENTO CORRELATI e desideri un casting efficiente tra di loro. Poiché la domanda riguarda l'ottenimento di un String, è improbabile che l'OP stia discutendo di una situazione in cui DirectCast è appropriato.
ToolmakerSteve

... Se la domanda non fosse stata menzionata Stringe il ToStringmio reclamo non si applicherebbe. Non dovresti sostenere DirectCast, fino a quando non avrai ristretto l'argomento dalla CONVERSIONE generale.
ToolmakerSteve

1

Secondo l'esame di certificazione, dovresti usare Convert.ToXXX () ogni volta che è possibile per conversioni semplici perché ottimizza le prestazioni meglio delle conversioni CXXX.


1
Cordiali saluti, Secondo Paul Vick di Microsoft, gli operatori Cxxx erano più veloci delle funzioni Convert.Toxxx, almeno nel 2004, perché Cxxx si compila direttamente in IL, piuttosto che chiamare una funzione. Sebbene la sua logica sembri dubbia, data la possibilità di ottimizzare le chiamate di funzione via JIT. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve

0

Una volta, ricordo di aver visto lo stato della libreria MSDN utilizzare CStr () perché era più veloce. Non so se questo sia vero però.


2
DirectCast è più veloce di CStr, ma è possibile utilizzarlo solo quando si esegue il cast di un oggetto stringa in una variabile stringa. Fallirà se provi a convertire qualsiasi altro oggetto in una stringa.
Jonathan Allen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.