J'ai beaucoup appris à parcourir les fonctionnalités cachées de C # et j'ai été surpris de ne pas trouver quelque chose de similaire pour VB.NET.
Alors, quelles sont certaines de ses fonctionnalités cachées ou moins connues?
vb.net
hidden-features
Sean Gough
la source
la source
Enum
S personnaliséL'une des véritables fonctionnalités cachées de VB est la
completionlist
balise de documentation XML qui peut être utilisée pour créer desEnum
types similaires avec des fonctionnalités étendues. Cette fonctionnalité ne fonctionne pas en C #, cependant.Un exemple d'un de mes codes récents:
Désormais, lors de l'affectation d'une valeur à une variable déclarée comme
Rule
, l'EDI propose une liste IntelliSense des valeurs possibles deRuleTemplates
./ÉDITER:
Comme il s'agit d'une fonctionnalité qui repose sur l'EDI, il est difficile de montrer à quoi cela ressemble lorsque vous l'utilisez, mais je vais simplement utiliser une capture d'écran:
Liste de complétion en action http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png
En fait, IntelliSense est 100% identique à ce que vous obtenez en utilisant un
Enum
.la source
friend
ou en utilisant la même classe que l'énumération:Rule
au lieu deRuleTemplate
.Avez-vous remarqué l'opérateur de comparaison Like?
Dim b As Boolean = "file.txt" Like "*.txt"
En savoir plus sur MSDN
la source
Typedefs
VB connaît un type primitif d' alias
typedef
viaImport
:Ceci est plus utile lorsqu'il est utilisé avec des types génériques:
la source
Imports
ça devrait être. ;-) D'une manière ou d'une autre, cette erreur n'a pas été détectée (et a recueilli 28 votes positifs) pendant près d'un an.Imports Assert = xUnit.Assert
Oh! et n'oubliez pas les littéraux XML .
la source
<string>This string contains "quotes" and it's OK.</string>.Value
(J'ai trouvé cela particulièrement pratique lors de l'écriture de tests sur l'analyse de fichiers CSV où chaque champ était entre guillemets. Cela n'aurait pas été amusant d'échapper à toutes ces citations à la main dans mon test lines.)L'initialisation d'objet est là aussi!
la source
DirectCast
DirectCast
est une merveille. En surface, il fonctionne de manière similaire à l'CType
opérateur en ce sens qu'il convertit un objet d'un type en un autre. Cependant, cela fonctionne selon un ensemble de règles beaucoup plus strictes.CType
Le comportement réel de ce dernier est donc souvent opaque et on ne sait pas du tout quel type de conversion est exécuté.DirectCast
ne prend en charge que deux opérations distinctes:Tout autre cast ne fonctionnera pas (par exemple, essayer de déballer un
Integer
en aDouble
) et entraînera une erreur de compilation / exécution (en fonction de la situation et de ce qui peut être détecté par la vérification de type statique). J'utilise doncDirectCast
autant que possible, car cela capture au mieux mon intention: selon la situation, je souhaite soit déballer une valeur de type connu, soit effectuer un upcast. Fin de l'histoire.L'utilisation
CType
, par contre, laisse le lecteur du code se demander ce que le programmeur a vraiment voulu car il résout toutes sortes d'opérations différentes, y compris l'appel de code défini par l'utilisateur.Pourquoi est-ce une fonctionnalité cachée? L'équipe VB a publié une directive 1 qui décourage l'utilisation de
DirectCast
(même si c'est en fait plus rapide!) Afin de rendre le code plus uniforme. Je soutiens que c'est une mauvaise directive qui devrait être inversée: autant que possible, privilégiezDirectCast
l'CType
opérateur plus général . Cela rend le code beaucoup plus clair.CType
, d'autre part, ne doit être appelé que si c'est effectivement prévu, c'est-à-dire lorsqu'unCType
opérateur de rétrécissement (cf. surcharge d'opérateur ) doit être appelé.1) Je suis incapable de trouver un lien vers la ligne directrice, mais j'ai trouvé le point de vue de Paul Vick (développeur en chef de l'équipe VB):
(EDIT by Zack: En savoir plus ici: Comment puis-je diffuser dans VB.NET? )
la source
TryCast
à l'époque car j'avais principalement un os à choisir avec l'utilisation généralisée deCType
.TryCast
ne fonctionnent que sur les types référence, selon la documentation.If
opérateur conditionnel et de fusionCe n'est pas tant caché que obsolète ! VB 9 a l'
If
opérateur qui est bien meilleur et fonctionne exactement comme l'opérateur conditionnel et de fusion de C # (selon ce que vous voulez):Modifié pour montrer un autre exemple:
Cela fonctionnera avec
If()
, mais provoquera une exception avecIIf()
la source
:?
opérateur C et Perl , ce n'est pas seulement une version simplifiée.C'est une belle. L'instruction Select Case dans VB.Net est très puissante.
Bien sûr, il y a la norme
Mais il y a plus ...
Vous pouvez faire des gammes:
Et encore plus...
Vous pouvez (bien que ce ne soit pas une bonne idée) faire des vérifications booléennes sur plusieurs variables:
la source
Select Case True
est qu'il semble qu'il évalue chacune desCase
instructions et exécute le code pour chacune d'elles qui est vraie. Mais en fait, il les évalue un par un et n'exécute le code que pour le premier qui est vrai. La syntaxe deIf
est beaucoup plus claire à cet égard (If...Else If...Else If...Else
).Un gain de temps majeur que j'utilise tout le temps est le mot clé With :
Je n'aime tout simplement pas taper plus que nécessaire!
la source
L'analyseur CSV le meilleur et le plus simple:
En ajoutant une référence à Microsoft.VisualBasic, cela peut être utilisé dans n'importe quel autre langage .Net, par exemple C #
la source
(EDIT: En savoir plus ici: Dois-je toujours utiliser les opérateurs AndAlso et OrElse? )
la source
Membres statiques dans les méthodes.
Par exemple:
Dans la fonction ci-dessus, l'expression régulière de modèle ne sera créée qu'une seule fois, quel que soit le nombre d'appels de la fonction.
Une autre utilisation est de conserver une instance de "aléatoire" autour de:
En outre, ce n'est pas la même chose que de simplement le déclarer en tant que membre partagé de la classe; les éléments déclarés de cette façon sont également garantis pour les threads. Cela n'a pas d'importance dans ce scénario car l'expression ne changera jamais, mais il y en a d'autres où cela pourrait.
la source
Dans vb, il y a une différence entre ces opérateurs:
/
onDouble
\
est enInteger
ignorant le restela source
J'aime beaucoup l' espace de noms «Mon» qui a été introduit dans Visual Basic 2005. My est un raccourci vers plusieurs groupes d'informations et de fonctionnalités. Il offre un accès rapide et intuitif aux types d'informations suivants:
la source
Événements personnalisés
Bien que rarement utile, la gestion des événements peut être fortement personnalisée:
Cela peut ensuite être testé de la manière suivante:
la source
Je viens de trouver un article sur le "!" opérateur, également appelé «opérateur de recherche de dictionnaire». Voici un extrait de l'article à l' adresse : http://panopticoncentral.net/articles/902.aspx
la source
Ceci est intégré et constitue un avantage certain par rapport à C #. La possibilité d'implémenter une méthode d'interface sans avoir à utiliser le même nom.
Tel que:
la source
Forcer ByVal
Dans VB, si vous encapsulez vos arguments dans un ensemble supplémentaire de parenthèses, vous pouvez remplacer la déclaration ByRef de la méthode et la transformer en ByVal. Par exemple, le code suivant produit 4, 5, 5 au lieu de 4,5,6
Voir l' argument non modifié par l'appel de procédure - Variable sous-jacente
la source
Passer des paramètres par nom et donc les réorganiser
Usage:
Peut également être appelé à l'aide de la spécification du paramètre ": =" dans n'importe quel ordre:
la source
L'instruction Using est nouvelle à partir de VB 8, C # l'avait depuis le début. Il appelle à disposer automatiquement pour vous.
Par exemple
la source
Les alias d'importation sont également largement inconnus:
la source
Considérez la déclaration d'événement suivante
En C #, vous pouvez rechercher des abonnés à l'événement en utilisant la syntaxe suivante:
Toutefois, le compilateur VB.NET ne prend pas en charge cela. Il crée en fait un champ de membre privé caché qui n'est pas visible dans IntelliSense:
Plus d'information:
http://jelle.druyts.net/2003/05/09/BehindTheScenesOfEventsInVBNET.aspx http://blogs.msdn.com/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug -rothaus.aspx
la source
Si vous avez besoin d'un nom de variable correspondant à celui d'un mot-clé, placez-le entre crochets. Pas nec. la meilleure pratique cependant - mais elle peut être utilisée à bon escient.
par exemple
Exemple à partir des commentaires (@Pondidum):
la source
Il y a quelques réponses sur les littéraux XML, mais pas sur ce cas spécifique:
Vous pouvez utiliser des littéraux XML pour entourer des littéraux de chaîne qui devraient autrement être échappés. Des chaînes littérales contenant des guillemets doubles, par exemple.
Au lieu de cela:
Tu peux le faire:
Ceci est particulièrement utile si vous testez un littéral pour l'analyse CSV:
(Vous n'êtes pas obligé d'utiliser la
<string>
balise, bien sûr; vous pouvez utiliser n'importe quelle balise que vous aimez.)la source
<q>
serait une bonne balise, similaire à l'utilisation en Perl / Ruby. Quoi qu'il en soit, c'est un idiome assez sympa. COMME!DateTime peut être initialisé en entourant votre date avec #
Vous pouvez également utiliser l'inférence de type avec cette syntaxe
C'est beaucoup plus agréable que d'utiliser le constructeur
la source
Vous pouvez avoir 2 lignes de code sur une seule ligne. Par conséquent:
la source
Call (New Something).CallAMethod()
Paramètres facultatifs
Les options sont tellement plus faciles que de créer de nouvelles surcharges, telles que:
la source
La casse de titre dans VB.Net peut être obtenue par un ancien fxn VB6:
la source
Propriétés avec paramètres
J'ai fait de la programmation C # et découvert une fonctionnalité qui manquait à VB.Net, mais qui n'a pas été mentionnée ici.
Un exemple de comment faire cela (ainsi que la limitation c #) peut être vu à: Utilisation des propriétés get set typiques en C # ... avec des paramètres
J'ai extrait le code de cette réponse:
la source