Comment dois-je diffuser dans VB.NET?

151

Tous ces éléments sont-ils égaux? Dans quelles circonstances dois-je choisir les uns sur les autres?

  • var.ToString ()

  • CStr (var)

  • CType (var, chaîne)

  • DirectCast (var, chaîne)


EDIT: Suggestion de NotMyself

  • TryCast (var, chaîne)
Zack Peterson
la source

Réponses:

156

Ceux-ci sont tous légèrement différents et ont généralement une utilisation acceptable.

  • var.ToString()va vous donner la représentation sous forme de chaîne d'un objet, quel que soit son type. Utilisez ceci si ce varn'est pas déjà une chaîne.
  • CStr(var)est l'opérateur de conversion de chaîne VB. Je ne suis pas un gars de VB, alors je suggérerais de l'éviter, mais ça ne va vraiment rien faire de mal. Je pense que c'est fondamentalement le même que CType.
  • CType(var, String) convertira le type donné en chaîne, en utilisant tous les opérateurs de conversion fournis.
  • DirectCast(var, String)est utilisé pour convertir un objet en chaîne. Si vous savez qu'une variable objet est, en fait, une chaîne, utilisez ceci. C'est la même chose qu'en (string)varC #.
  • TryCast(comme mentionné par @ NotMyself ) est comme DirectCast, mais il retournera Nothingsi la variable ne peut pas être convertie en une chaîne, plutôt que de lever une exception. C'est la même chose qu'en var as stringC #. La TryCastpage sur MSDN a également une bonne comparaison.
bdukes
la source
15
Il n'y a jamais de raison d'utiliser CType (var, String) au lieu de CStr (var), ils font exactement la même chose.
Jonathan Allen le
2
@Maslow TryCastne fonctionne que pour les types valeur, car il doit s'agir d'un type pouvant avoir Nothingune valeur
bdukes
1
@Martinho tout à fait raison. Cela devrait dire "ne fonctionne que pour le type de référence "
bdukes
3
CStr(var)s'étouffera et lèvera une exception si la variable est DBNull.Value, mais l'alternative Convert.ToString(var)retournera une chaîne vide.
MCattle
Dim myList AS ArrayList=new ArrayListLorsque vous écrivez, (From e In myList select CType(e.Name,String)).ToArray()cela ne fonctionne pas. Je suis venu écrire ... select CType(e.Name.ToString,String)).ToArray()et j'ai retrouvé mon sourire.
Bellash
13

Cstr() est compilé en ligne pour de meilleures performances.

CType autorise les transtypages entre les types si un opérateur de conversion est défini

ToString() Entre le type de base et la chaîne lève une exception si la conversion n'est pas possible.

TryParse()De la chaîne à la base typeifpossible sinon retourne false

DirectCastutilisé si les types sont liés par héritage ou partagent une interface commune, lèvera une exception si le cast n'est pas possible, trycastne retournera rien dans cette instance

Déroute de Siddharth
la source
8

MSDN semble indiquer que les conversions Cxxx pour des types spécifiques peuvent améliorer les performances dans VB .NET car elles sont converties en code en ligne. Pour une raison quelconque, il suggère également DirectCast par opposition à CType dans certains cas (les documentations indiquent que c'est lorsqu'il y a une relation d'héritage; Je pense que cela signifie que la cohérence de la distribution est vérifiée au moment de la compilation et des optimisations peuvent être appliquées alors que CType utilise toujours le Runtime VB.)

Lorsque j'écris du code VB .NET, ce que j'utilise dépend de ce que je fais. Si c'est du code prototype que je vais jeter, j'utilise tout ce que je tape. Si c'est du code dont je suis sérieux, j'essaye d'utiliser un casting Cxxx. S'il n'en existe pas, j'utilise DirectCast si j'ai une conviction raisonnable qu'il existe une relation d'héritage. Si c'est une situation où je n'ai aucune idée si le casting doit réussir (entrée utilisateur -> entiers, par exemple), alors j'utilise TryCast afin de faire quelque chose de plus convivial que de lancer une exception à l'utilisateur.

Une chose que je ne peux pas secouer est que j'ai tendance à utiliser ToString au lieu de CStr, mais Cstr est censé être plus rapide.

OwenP
la source
8

Je préfère la syntaxe suivante:

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

If str IsNot Nothing Then

Hah vous pouvez dire que j'écris généralement du code en C #. 8)

La raison pour laquelle je préfère TryCast est que vous n'avez pas à vous soucier de la surcharge des exceptions de diffusion. Votre conversion réussit ou votre variable est initialisée à null et vous gérez cela en conséquence.

Pas moi
la source
2
Je crois que vous avez tort. ce n'est pas du tout une bonne idée d'utiliser TryCast. dans un cas comme le vôtre, number.ToString () ou CStr (number) doit être utilisé.
Shimmy Weitzhandler
4
@Shimmy: Quelle est la raison pour laquelle vous n'utilisez pas du tout TryCast? N'est-il pas préférable que DirectCast évite une exception dans certains scénarios?
Dienekes
3
@Dienekes et NotMyself. TryCast est uniquement pour les types REFERENCE. Ici, nous avons un Integer, qui est un type VALUE. Le compilateur rejettera TryCast. En outre, l'objectif est une chaîne. Toute entité .Net à l'exception de Nothing prend en charge .ToString(). Un type valeur, tel que Integer, ne peut pas être Nothing. Donc, dans ce cas, CStr (nombre) ou number.ToString () est sûr. Dans le cas général (pas seulement les types valeur), CStr (peu importe) est sûr, car il peut gérer Nothing - le résultat sera Nothing, dans la variable String. TryCast est très utile - mais pas ici.
ToolmakerSteve
4

L'utilisateur Konrad Rudolph plaide pour DirectCast () dans la question de Stack Overflow «Fonctionnalités cachées de VB.NET» .

Zack Peterson
la source
-1 parce que DirectCast n'est manifestement PAS approprié ici, sauf dans des situations très limitées, que vous n'avez pas pris la peine de mentionner. DirectCast est bon lorsque vous savez que vous avez deux TYPES DE RÉFÉRENCE ASSOCIÉS et que vous voulez un casting efficace entre eux. Puisque la question porte sur l'obtention d'un String, il est peu probable que le PO ait discuté d'une situation où DirectCast est approprié.
ToolmakerSteve
... Si la question n'avait pas été mentionnée Stringet ToString, ma plainte ne s'appliquerait pas. Vous ne devriez pas plaider en faveur de DirectCast, jusqu'à ce que vous ayez réduit le sujet de la CONVERSION générale.
ToolmakerSteve
1

Selon l'examen de certification, vous devez utiliser Convert.ToXXX () chaque fois que possible pour des conversions simples, car il optimise les performances mieux que les conversions CXXX.

SickPuP
la source
1
Pour info, selon Paul Vick de Microsoft, les opérateurs Cxxx étaient plus rapides que les fonctions Convert.Toxxx, du moins en 2004, car Cxxx compile directement en IL, plutôt que d'appeler une fonction. Bien que sa justification semble douteuse, étant donné la capacité d'optimiser les appels de fonction par JIT. panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve
0

À un moment donné, je me souviens avoir vu l'état de la bibliothèque MSDN pour utiliser CStr () car c'était plus rapide. Je ne sais pas si cela est vrai.

joek1975
la source
2
DirectCast est plus rapide que CStr, mais vous ne pouvez l'utiliser que lors de la conversion d'un objet chaîne en une variable chaîne. Cela échouera si vous essayez de convertir un autre objet en chaîne.
Jonathan Allen le