Sporo się nauczyłem przeglądając ukryte funkcje języka C # i byłem zaskoczony, gdy nie mogłem znaleźć czegoś podobnego dla VB.NET.
Jakie są więc niektóre z jego ukrytych lub mniej znanych funkcji?
vb.net
hidden-features
Sean Gough
źródło
źródło
Niestandardowe
Enum
sJedną z prawdziwych ukrytych funkcji VB jest
completionlist
znacznik dokumentacji XML, którego można użyć do tworzenia własnychEnum
typów o rozszerzonej funkcjonalności. Ta funkcja nie działa jednak w języku C #.Jeden przykład z mojego niedawnego kodu:
Teraz podczas przypisywania wartości do zmiennej zadeklarowanej jako
Rule
środowisko IDE oferuje listę IntelliSense z możliwymi wartościami zRuleTemplates
./EDYTOWAĆ:
Ponieważ jest to funkcja, która opiera się na IDE, trudno jest pokazać, jak to wygląda, gdy jej używasz, ale użyję tylko zrzutu ekranu:
Lista ukończenia w akcji http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png
W rzeczywistości IntelliSense jest w 100% identyczny z tym, co otrzymujesz podczas korzystania z
Enum
.źródło
friend
lub używając tej samej klasy co enum:Rule
zamiastRuleTemplate
.Czy zauważyłeś operator porównania Like?
Dim b As Boolean = "file.txt" Like "*.txt"
Więcej z MSDN
źródło
Typedefs
VB zna prymitywny rodzaj aliasów
typedef
viaImport
:Jest to bardziej przydatne w połączeniu z typami ogólnymi:
źródło
Imports
powinno być. ;-) Jakoś ten błąd pozostał niewykryty (i zebrał 28 głosów pozytywnych) przez prawie cały rok.Imports Assert = xUnit.Assert
O! i nie zapomnij o literałach XML .
źródło
<string>This string contains "quotes" and it's OK.</string>.Value
(Znalazłem to szczególnie przydatne przy pisaniu testów na parsowanie plików CSV, gdzie każdy polu została w cudzysłowie Byłoby. Nie były zabawy na ucieczkę te wszystkie cytaty ręcznie w moim linie testowe)Inicjalizacja obiektu też jest tam!
źródło
DirectCast
DirectCast
jest cudem. Na powierzchni działa podobnie doCType
operatora, ponieważ konwertuje obiekt z jednego typu na inny. Jednak działa na znacznie bardziej rygorystycznych zasadach.CType
W związku z tym rzeczywiste zachowanie jest często nieprzejrzyste i nie jest wcale jasne, jaki rodzaj konwersji jest wykonywany.DirectCast
obsługuje tylko dwie różne operacje:Każde inne rzutowanie nie zadziała (np. Próba rozpakowania
Integer
do aDouble
) i spowoduje błąd kompilacji / czasu wykonania (w zależności od sytuacji i tego, co można wykryć przez statyczne sprawdzanie typu). Dlatego używam,DirectCast
gdy tylko jest to możliwe, ponieważ najlepiej oddaje to mój zamiar: w zależności od sytuacji chcę albo rozpakować wartość znanego typu, albo wykonać upcast. Koniec opowieści.CType
Z drugiej strony, użycie pozostawia czytelnika z pytaniem o to, co tak naprawdę zamierzał programista, ponieważ rozwiązuje to wszelkiego rodzaju różne operacje, w tym wywoływanie kodu zdefiniowanego przez użytkownika.Dlaczego jest to ukryta funkcja? Zespół VB opublikował wytyczną 1, która zniechęca do używania
DirectCast
(mimo że jest w rzeczywistości szybszy!) W celu ujednolicenia kodu. Twierdzę, że jest to zła wskazówka, którą należy odwrócić: jeśli to możliwe, faworyzujDirectCast
bardziej ogólnyCType
operator. Dzięki temu kod jest znacznie bardziej przejrzysty.CType
z drugiej strony, powinno być wywoływane tylko wtedy, gdy jest to rzeczywiście zamierzone, tj. gdy należy wywołaćCType
operator zawężający (por. przeciążanie operatorów ).1) Nie mogę znaleźć linku do wytycznych, ale znalazłem podejście Paula Vicka (głównego programisty zespołu VB):
(EDIT by Zack: Dowiedz się więcej tutaj: Jak przesyłać w VB.NET? )
źródło
TryCast
ponieważ miałem głównie kość do skubania przy powszechnym użyciuCType
.TryCast
działają tylko na typach referencyjnych, zgodnie z dokumentacją.If
operator warunkowy i koalescencyjnyJest nie tyle ukryty, co przestarzały ! VB 9 ma
If
operator, który jest znacznie lepszy i działa dokładnie tak, jak operator warunkowy i koalescencyjny C # (w zależności od tego, co chcesz):Edytowano, aby pokazać inny przykład:
To zadziała
If()
, ale spowoduje wyjątek w przypadkuIIf()
źródło
:?
operatora C i Perla , nie jest to tylko uproszczona wersja.To jest fajne. Instrukcja Select Case w VB.Net ma bardzo duże możliwości.
Jasne, że jest standard
Ale jest więcej ...
Możesz robić zakresy:
I nawet więcej...
Możesz (chociaż może to nie być dobry pomysł) sprawdzać wartości logiczne wielu zmiennych:
źródło
Select Case True
jest to, że wygląda tak, jakby ocenia każdy zCase
wypowiedzi i uruchamia kod dla każdego z nich, który jest prawdziwy. Ale w rzeczywistości ocenia je pojedynczo i uruchamia kod tylko dla pierwszego, który jest prawdziwy. Pod tym względem składnia forIf
jest znacznie jaśniejsza (If...Else If...Else If...Else
).Jednym z głównych sposobów oszczędzania czasu, których używam cały czas, jest słowo kluczowe With :
Po prostu nie lubię pisać więcej niż muszę!
źródło
Najlepszy i łatwy parser CSV:
Dodając odniesienie do Microsoft.VisualBasic, można to wykorzystać w dowolnym innym języku .Net, np. C #
źródło
(EDYCJA: Dowiedz się więcej tutaj: Czy zawsze powinienem używać operatorów AndAlso i OrElse? )
źródło
Statyczne składowe w metodach.
Na przykład:
W powyższej funkcji wyrażenie regularne wzorca zostanie utworzone tylko raz, bez względu na to, ile razy funkcja zostanie wywołana.
Innym zastosowaniem jest utrzymywanie wystąpienia „losowego” w pobliżu:
Nie jest to również to samo, co zwykłe zadeklarowanie go jako współdzielonego członka klasy; Elementy zadeklarowane w ten sposób również są bezpieczne dla wątków. W tym scenariuszu nie ma to znaczenia, ponieważ wyrażenie nigdy się nie zmieni, ale są inne, gdzie może.
źródło
In vb jest różnica między tymi operatorami:
/
jestDouble
\
toInteger
pomijając pozostałąźródło
Bardzo podoba mi się „My” Namespace, która została wprowadzona w Visual Basic 2005. My to skrót do kilku grup informacji i funkcji. Zapewnia szybki i intuicyjny dostęp do następujących rodzajów informacji:
źródło
Zdarzenia niestandardowe
Chociaż rzadko jest przydatna, obsługa zdarzeń może być mocno dostosowana:
Można to następnie przetestować w następujący sposób:
źródło
Właśnie znalazłem artykuł mówiący o „!” operator, zwany także „operatorem wyszukiwania w słowniku”. Oto fragment artykułu pod adresem : http://panopticoncentral.net/articles/902.aspx
źródło
Jest to wbudowane i stanowi zdecydowaną przewagę nad C #. Możliwość zaimplementowania metody interfejsu bez konieczności używania tej samej nazwy.
Jak na przykład:
źródło
Wymuszanie ByVal
W VB, jeśli zawiniesz swoje argumenty w dodatkowym zestawie nawiasów, możesz przesłonić deklarację ByRef metody i przekształcić ją w ByVal. Na przykład poniższy kod daje 4, 5, 5 zamiast 4,5,6
Zobacz Argument niezmodyfikowany przez wywołanie procedury - zmienna bazowa
źródło
Przekazywanie parametrów według nazwy i zmiana ich kolejności
Stosowanie:
Można go również wywołać przy użyciu specyfikacji parametru „: =” w dowolnej kolejności:
źródło
Instrukcja Using jest nowa od wersji VB 8, C # miała ją od początku. Wzywa do automatycznego usuwania.
Na przykład
źródło
Aliasy importu są również w dużej mierze nieznane:
źródło
Rozważ następującą deklarację zdarzenia
W języku C # można sprawdzić, czy subskrybenci zdarzeń są dostępni przy użyciu następującej składni:
Jednak kompilator VB.NET tego nie obsługuje. W rzeczywistości tworzy ukryte prywatne pole członkowskie, które nie jest widoczne w IntelliSense:
Więcej informacji:
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
źródło
Jeśli chcesz, aby nazwa zmiennej pasowała do słowa kluczowego, umieść ją w nawiasach. Nie gdzie indziej. najlepsza praktyka - ale można ją mądrze stosować.
na przykład
np. przykład z komentarzy (@Pondidum):
źródło
Istnieje kilka odpowiedzi dotyczących literałów XML, ale nie dotyczących tego konkretnego przypadku:
Możesz użyć literałów XML, aby ująć literały ciągów, które w innym przypadku wymagałyby zmiany znaczenia. Na przykład literały ciągów zawierające cudzysłowy.
Zamiast tego:
Możesz to zrobić:
Jest to szczególnie przydatne, jeśli testujesz literał do analizy CSV:
(Oczywiście nie musisz używać
<string>
tagu; możesz użyć dowolnego tagu, który chcesz).źródło
<q>
byłby dobrym tagiem, podobnym do użycia w Perlu / Ruby. W każdym razie to całkiem niezły idiom. LUBIĆ!DateTime można zainicjować, otaczając datę #
Możesz również użyć wnioskowania o typie razem z tą składnią
To o wiele przyjemniejsze niż użycie konstruktora
źródło
Możesz mieć 2 linie kodu w jednej linii. W związku z tym:
źródło
Call (New Something).CallAMethod()
Parametry opcjonalne
Opcje są o wiele łatwiejsze niż tworzenie nowych przeciążeń, takich jak:
źródło
Przypadek tytułu w VB.Net można uzyskać za pomocą starego fxn VB6:
źródło
Właściwości z parametrami
Zajmowałem się programowaniem w C # i odkryłem brakującą funkcję, którą miał VB.Net, ale nie została tutaj wspomniana.
Przykład, jak to zrobić (a także ograniczenie języka C # ) można zobaczyć na stronie: Używanie typowych właściwości get set w C # ... with parameters
Wyciągnąłem kod z tej odpowiedzi:
źródło