Ich habe einiges über das Durchsuchen der versteckten Funktionen von C # gelernt und war überrascht, als ich für VB.NET nichts Ähnliches finden konnte.
Also, was sind einige seiner versteckten oder weniger bekannten Merkmale?
vb.net
hidden-features
Sean Gough
quelle
quelle
Benutzerdefinierte
Enum
sEine der wirklich verborgenen Funktionen von VB ist das
completionlist
XML-Dokumentations-Tag, mit dem eigeneEnum
Typen mit erweiterten Funktionen erstellt werden können. Diese Funktion funktioniert jedoch nicht in C #.Ein Beispiel aus einem meiner jüngsten Codes:
Wenn Sie einer als deklarierten Variablen einen Wert zuweisen
Rule
, bietet die IDE eine IntelliSense-Liste möglicher Werte ausRuleTemplates
./BEARBEITEN:
Da dies eine Funktion ist, die auf der IDE basiert, ist es schwierig zu zeigen, wie dies aussieht, wenn Sie es verwenden, aber ich verwende nur einen Screenshot:
Abschlussliste in Aktion http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png
Tatsächlich ist IntelliSense zu 100% identisch mit dem, was Sie bei der Verwendung von erhalten
Enum
.quelle
friend
oder dieselbe Klasse wie die Aufzählung verwenden:Rule
anstelle vonRuleTemplate
.Haben Sie den Vergleichsoperator "Gefällt mir" bemerkt?
Dim b As Boolean = "file.txt" Like "*.txt"
Mehr von MSDN
quelle
Typedefs
VB kennt eine primitive Art von
typedef
Via-Import
Aliasen:Dies ist nützlicher, wenn es in Verbindung mit generischen Typen verwendet wird:
quelle
Imports
es sollte sein. ;-) Irgendwie ist dieser Fehler seit fast einem Jahr unentdeckt geblieben (und hat 28 positive Stimmen erhalten).Imports Assert = xUnit.Assert
Oh! und vergessen Sie nicht XML-Literale .
quelle
<string>This string contains "quotes" and it's OK.</string>.Value
(Ich fand dies besonders praktisch, wenn ich Tests zum Parsen von CSV-Dateien schrieb, bei denen jedes Feld in Anführungszeichen stand. Es hätte keinen Spaß gemacht, all diese Anführungszeichen von Hand in meinem zu entkommen Testlinien.)Die Objektinitialisierung ist auch da!
quelle
DirectCast
DirectCast
ist ein Wunder. An der Oberfläche funktioniert es ähnlich wie derCType
Operator, indem es ein Objekt von einem Typ in einen anderen konvertiert. Es funktioniert jedoch nach einem viel strengeren Regelwerk.CType
Das tatsächliche Verhalten ist daher oft undurchsichtig und es ist überhaupt nicht ersichtlich, welche Art von Konvertierung ausgeführt wird.DirectCast
unterstützt nur zwei verschiedene Operationen:Jede andere Umwandlung funktioniert nicht (z. B. der Versuch, ein
Integer
bis a zu entpackenDouble
) und führt zu einem Kompilierungs- / Laufzeitfehler (abhängig von der Situation und dem, was durch statische Typprüfung erkannt werden kann). Ich verwende daherDirectCast
nach Möglichkeit, da dies meine Absicht am besten erfasst: Je nach Situation möchte ich entweder einen Wert bekannten Typs entpacken oder einen Upcast durchführen. Ende der Geschichte.Unter Verwendung
CType
, auf der anderen Seite, läßt den Leser des Codes fragen , was wirklich der Programmierer gedacht , weil es für alle Arten von verschiedenen Operationen löst, benutzerdefinierten Code einschließlich Aufruf.Warum ist das eine versteckte Funktion? Das VB-Team hat eine Richtlinie 1 veröffentlicht , die von der Verwendung
DirectCast
(obwohl sie tatsächlich schneller ist!) Abrät, um den Code einheitlicher zu gestalten. Ich behaupte, dass dies eine schlechte Richtlinie ist, die umgekehrt werden sollte: Wenn immer möglich, bevorzugenDirectCast
Sie den allgemeinerenCType
Operator. Es macht den Code viel klarer.CType
sollte dagegen nur aufgerufen werden, wenn dies tatsächlich beabsichtigt ist, dh wenn ein sich verengenderCType
Operator (vgl. Operatorüberladung ) aufgerufen werden soll.1) Ich kann keinen Link zu der Richtlinie finden, aber ich habe Paul Vicks Einstellung dazu gefunden (Chefentwickler des VB-Teams):
(EDIT von Zack: Erfahren Sie hier mehr: Wie soll ich in VB.NET umwandeln? )
quelle
TryCast
da ich hauptsächlich einen Knochen hatte, den ich mit dem allgegenwärtigen Gebrauch von pflücken konnteCType
.TryCast
gemäß der Dokumentation nur für Referenztypen funktionieren.If
Bedingter und KoaleszenzoperatorEs ist weniger versteckt als veraltet ! VB 9 hat den
If
Operator, der viel besser ist und genau wie der Bedingungs- und Koaleszenzoperator von C # funktioniert (je nachdem, was Sie wollen):Bearbeitet, um ein weiteres Beispiel zu zeigen:
Dies funktioniert mit
If()
, verursacht aber eine Ausnahme mitIIf()
quelle
:?
Operator von C und Perl , es ist nicht nur eine vereinfachte Version.Das ist schön. Die Select Case-Anweisung in VB.Net ist sehr leistungsfähig.
Klar gibt es den Standard
Aber es gibt noch mehr ...
Sie können Bereiche ausführen:
Und noch mehr...
Sie können (obwohl dies möglicherweise keine gute Idee ist) mehrere Variablen boolesch prüfen:
quelle
Select Case True
ist, dass es so aussieht, als würde es jede derCase
Anweisungen auswerten und den Code für jede wahr ausführen, was wahr ist. Tatsächlich wertet es sie jedoch einzeln aus und führt nur den Code für den ersten aus , der wahr ist. Die Syntax fürIf
ist in dieser Hinsicht viel klarer (If...Else If...Else If...Else
).Eine wichtige Zeitersparnis, die ich ständig verwende, ist das Schlüsselwort With :
Ich schreibe einfach nicht mehr als ich muss!
quelle
Der beste und einfachste CSV-Parser:
Durch Hinzufügen eines Verweises auf Microsoft.VisualBasic kann dieser in jeder anderen .NET-Sprache verwendet werden, z. B. C #
quelle
(BEARBEITEN: Weitere Informationen finden Sie hier: Soll ich immer die Operatoren AndAlso und OrElse verwenden? )
quelle
Statische Elemente in Methoden.
Beispielsweise:
In der obigen Funktion wird der reguläre Musterausdruck immer nur einmal erstellt, unabhängig davon, wie oft die Funktion aufgerufen wird.
Eine andere Verwendung besteht darin, eine Instanz von "zufällig" zu behalten:
Dies ist auch nicht dasselbe, als es einfach als gemeinsames Mitglied der Klasse zu deklarieren. Artikel, die auf diese Weise deklariert wurden, sind garantiert auch threadsicher. In diesem Szenario spielt es keine Rolle, da sich der Ausdruck niemals ändern wird, aber es gibt andere, bei denen dies der Fall sein könnte.
quelle
In vb gibt es einen Unterschied zwischen diesen Operatoren:
/
wirdDouble
\
sichInteger
der Rest ignoriertquelle
Der in Visual Basic 2005 eingeführte Namespace "My" gefällt mir sehr gut . My ist eine Verknüpfung zu mehreren Gruppen von Informationen und Funktionen. Es bietet schnellen und intuitiven Zugriff auf die folgenden Arten von Informationen:
quelle
Benutzerdefinierte Ereignisse
Obwohl selten nützlich, kann die Ereignisbehandlung stark angepasst werden:
Dies kann dann folgendermaßen getestet werden:
quelle
Ich habe gerade einen Artikel über das "!" Operator, auch als "Dictionary Lookup Operator" bekannt. Hier ist ein Auszug aus dem Artikel unter: http://panopticoncentral.net/articles/902.aspx
quelle
Dies ist eingebaut und ein klarer Vorteil gegenüber C #. Die Möglichkeit, eine Schnittstellenmethode zu implementieren, ohne denselben Namen verwenden zu müssen.
Sowie:
quelle
ByVal erzwingen
Wenn Sie in VB Ihre Argumente in zusätzliche Klammern setzen, können Sie die ByRef-Deklaration der Methode überschreiben und in ein ByVal umwandeln. Der folgende Code erzeugt beispielsweise 4, 5, 5 anstelle von 4,5,6
Siehe Argument, das nicht durch Prozeduraufruf - zugrunde liegende Variable geändert wird
quelle
Übergeben von Parametern nach Namen und, um sie neu zu ordnen
Verwendung:
Kann auch mit der Parameterspezifikation ": =" in beliebiger Reihenfolge aufgerufen werden:
quelle
Die Using-Anweisung ist ab VB 8 neu, C # hatte sie von Anfang an. Es ruft die automatische Entsorgung für Sie auf.
Z.B
quelle
Import-Aliase sind ebenfalls weitgehend unbekannt:
quelle
Beachten Sie die folgende Ereignisdeklaration
In C # können Sie mithilfe der folgenden Syntax nach Ereignisabonnenten suchen:
Der VB.NET-Compiler unterstützt dies jedoch nicht. Es wird tatsächlich ein verstecktes privates Mitgliedsfeld erstellt, das in IntelliSense nicht sichtbar ist:
Mehr Informationen:
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
quelle
Wenn Sie einen Variablennamen benötigen, der mit dem eines Schlüsselworts übereinstimmt, schließen Sie ihn in Klammern ein. Nicht notwendig. Die beste Vorgehensweise - aber sie kann mit Bedacht eingesetzt werden.
z.B
zB Beispiel aus Kommentaren (@Pondidum):
quelle
Es gibt einige Antworten zu XML-Literalen, jedoch nicht zu diesem speziellen Fall:
Sie können XML-Literale verwenden, um Zeichenfolgenliterale einzuschließen, die sonst maskiert werden müssten. String-Literale, die beispielsweise doppelte Anführungszeichen enthalten.
An Stelle von:
Du kannst das:
Dies ist besonders nützlich, wenn Sie ein Literal für die CSV-Analyse testen:
(Sie müssen das
<string>
Tag natürlich nicht verwenden; Sie können jedes beliebige Tag verwenden.)quelle
<q>
wäre ein gutes Tag, ähnlich der Verwendung in Perl / Ruby. Wie auch immer, das ist eine nette Redewendung. MÖGEN!DateTime kann initialisiert werden, indem Sie Ihr Datum mit # umgeben
Sie können zusammen mit dieser Syntax auch die Typinferenz verwenden
Das ist viel schöner als die Verwendung des Konstruktors
quelle
Sie können 2 Codezeilen in nur einer Zeile haben. daher:
quelle
Call (New Something).CallAMethod()
Optionale Parameter
Optionale Optionen sind so viel einfacher als das Erstellen neuer Überladungen, wie z.
quelle
Title Case in VB.Net kann mit einem alten VB6 fxn erreicht werden:
quelle
Eigenschaften mit Parametern
Ich habe einige C # -Programmierungen durchgeführt und eine Funktion entdeckt, die VB.Net fehlte, aber hier nicht erwähnt wurde.
Ein Beispiel dafür (sowie die c # -Einschränkung) finden Sie unter: Verwenden der typischen get set-Eigenschaften in C # ... mit Parametern
Ich habe den Code aus dieser Antwort extrahiert:
quelle