Domanda

Sono tutti uguali?In quali circostanze dovrei sceglierne uno rispetto agli altri?

  • var.ToString()

  • CStr(var)

  • CType(var, String)

  • DirectCast(var, String)


MODIFICARE:Suggerimento da Non me stesso

  • TryCast(var, String)
È stato utile?

Soluzione

Sono tutti leggermente diversi e generalmente hanno un utilizzo accettabile.

  • var.ToString() ti darà la rappresentazione di stringa di un oggetto, indipendentemente dal tipo.Usa questo se var non è già una stringa.
  • CStr(var) è l'operatore di cast di stringhe VB.Non sono un tipo VB, quindi suggerirei di evitarlo, ma non farà davvero male a nulla.Penso che sia fondamentalmente lo stesso di CType.
  • CType(var, String) convertirà il tipo specificato in una stringa, utilizzando qualsiasi operatore di conversione fornito.
  • DirectCast(var, String) viene utilizzato per eseguire l'upcast di un oggetto in una stringa.Se sai che una variabile oggetto è, in effetti, una stringa, usa questo.Questo è lo stesso di (string)var in C#.
  • TryCast (come menzionato da @Non me stesso) è come DirectCast, ma tornerà Nothing se la variabile non può essere convertita in una stringa, anziché generare un'eccezione.Questo è lo stesso di var as string in C#.IL TryCast anche la pagina su MSDN ha un buon confronto.

Altri suggerimenti

Cstr() è compilato in linea per prestazioni migliori.

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

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

TryParse() Dalla corda alla base typeif possibile altrimenti restituisce falso

DirectCast utilizzato se i tipi sono correlati tramite ereditarietà o condividono un'interfaccia comune, genererà un'eccezione se il cast non è possibile, trycast non restituirà nulla in questo caso

Preferisco la seguente sintassi:

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 preoccuparti del sovraccarico derivante dal casting delle eccezioni.Il tuo cast ha successo oppure la tua variabile viene inizializzata su null e lo gestisci di conseguenza.

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 al contrario di CType in alcuni casi (la documentazione afferma che è quando esiste una relazione di ereditarietà;Credo che ciò significhi che la sanità del cast viene controllata in fase di compilazione e che è possibile applicare ottimizzazioni mentre CType utilizza sempre il runtime VB.)

Quando scrivo codice VB .NET, ciò che utilizzo dipende da cosa sto facendo.Se è un codice prototipo che intendo buttare via, utilizzo qualunque cosa mi capiti di digitare.Se si tratta di un codice serio, provo a utilizzare un cast Cxxx.Se non ne esiste uno, utilizzo DirectCast se ho una ragionevole convinzione che esista una relazione di ereditarietà.Se si tratta di una situazione in cui non ho idea se il cast dovrebbe avere successo (input dell'utente -> numeri interi, ad esempio), allora utilizzo 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.

Secondo l'esame di certificazione dovresti utilizzare Convert.ToXXX() quando possibile per conversioni semplici perché ottimizza le prestazioni meglio delle conversioni CXXX.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top