Я довольно много узнал, просматривая скрытые возможности C # и был удивлен, когда не смог найти что-то подобное для VB.NET.
Итак, каковы некоторые из его скрытых или менее известных особенностей?
vb.net
hidden-features
Шон Гоф
источник
источник
изготовленный на заказ
Enum
sОдной из реальных скрытых функций VB является
completionlist
тег XML-документации, который можно использовать для создания собственныхEnum
типов с расширенными функциями. Однако эта функция не работает в C #.Один пример из моего недавнего кода:
Теперь при присвоении значения переменной, объявленной как
Rule
, IDE предлагает список возможных значений IntelliSense изRuleTemplates
./РЕДАКТИРОВАТЬ:
Поскольку это функция, основанная на среде IDE, трудно показать, как это выглядит при использовании, но я просто воспользуюсь снимком экрана:
Список дополнений в действии http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png
Фактически, IntelliSense на 100% идентичен тому, что вы получаете при использовании
Enum
.источник
friend
или используя тот же класс, что и перечисление:Rule
вместоRuleTemplate
.Вы заметили оператор сравнения Like?
Dim b As Boolean = "file.txt" Like "*.txt"
Больше из MSDN
источник
Определения типов
VB знает примитивный вид псевдонимов
typedef
черезImport
:Это более полезно при использовании в сочетании с универсальными типами:
источник
Imports
так должно быть. ;-) Каким-то образом эта ошибка осталась незамеченной (и собрала 28 голосов) почти целый год.Imports Assert = xUnit.Assert
Ой! и не забывайте XML-литералы .
источник
<string>This string contains "quotes" and it's OK.</string>.Value
(Я нашел это особенно удобным при написании тестов по синтаксическому анализу файлов CSV, где каждое поле было заключено в кавычки. Было бы не интересно избегать всех этих кавычек вручную в моем тестовые строки.)Инициализация объекта тоже есть!
источник
DirectCast
DirectCast
это чудо. НаCType
первый взгляд, он работает аналогично оператору, поскольку преобразует объект из одного типа в другой. Однако он работает по гораздо более строгому набору правил.CType
поэтому фактическое поведение часто бывает непрозрачным, и совершенно не очевидно, какое преобразование выполняется.DirectCast
поддерживает только две различные операции:Любое другое приведение не будет работать (например, попытка распаковать a
Integer
в aDouble
) и приведет к ошибке времени компиляции / времени выполнения (в зависимости от ситуации и того, что может быть обнаружено проверкой статического типа). Поэтому я используюDirectCast
всякий раз, когда это возможно, так как это лучше всего отражает мое намерение: в зависимости от ситуации я хочу либо распаковать значение известного типа, либо выполнить восходящее преобразование. Конец истории.Использование
CType
, с другой стороны, оставляет читателя кода недоумением, что на самом деле задумал программист, потому что он разрешает все виды различных операций, включая вызов определяемого пользователем кода.Почему это скрытая функция? Команда VB опубликовала руководство 1, которое не рекомендует использовать
DirectCast
(даже если это на самом деле быстрее!), Чтобы сделать код более единообразным. Я утверждаю, что это плохой совет, который следует отменить: по возможности отдавайте предпочтение операторуDirectCast
более общего характераCType
. Это делает код намного понятнее.CType
, с другой стороны, должен вызываться только в том случае, если это действительно так, то есть когда должен быть вызван сужающийCType
оператор (см. перегрузку оператора ).1) Я не могу найти ссылку на руководство, но я нашел подход Пола Вика (главный разработчик команды VB):
(РЕДАКТИРОВАТЬ Заком: Узнайте больше здесь: Как мне использовать VB.NET? )
источник
TryCast
тогда, потому что в основном мне приходилось ковырять в повсеместном использованииCType
.TryCast
работают только со ссылочными типами в соответствии с документацией.If
условный оператор и оператор объединенияЭто не столько скрыто, сколько устарело ! В VB 9 есть
If
оператор, который намного лучше и работает точно так же, как условный оператор C # и оператор объединения (в зависимости от того, что вы хотите):Отредактировано, чтобы показать другой пример:
Это будет работать с
If()
, но вызовет исключение сIIf()
источник
:?
оператору C и Perl , это не просто упрощенная версия.Это хороший вариант. Оператор Select Case в VB.Net очень мощный.
Конечно, есть стандарт
Но это еще не все ...
Вы можете делать диапазоны:
И даже больше...
Вы можете (хотя это может быть не очень хорошая идея) выполнять логические проверки нескольких переменных:
источник
Select Case True
в том, что похоже, что он оценивает каждое изCase
операторов и запускает код для каждого из них, который является истинным. Но на самом деле он оценивает их один за другим и запускает код только для первого из них, которое является истинным. В этом отношении синтаксис для (If
) намного яснееIf...Else If...Else If...Else
.Одно из основных средств экономии времени, которое я использую постоянно, - это ключевое слово With :
Я просто не люблю печатать больше, чем нужно!
источник
Лучший и простой парсер CSV:
Добавив ссылку на Microsoft.VisualBasic, это можно будет использовать на любом другом языке .Net, например C #.
источник
(РЕДАКТИРОВАТЬ: Узнайте больше здесь: всегда ли мне использовать операторы AndAlso и OrElse? )
источник
Статические члены в методах.
Например:
В приведенной выше функции регулярное выражение шаблона будет создано только один раз, независимо от того, сколько раз функция вызывается.
Другое использование - сохранить экземпляр "random" вокруг:
Кроме того, это не то же самое, что просто объявить его как Shared-член класса; элементы, объявленные таким образом, также гарантированно будут потокобезопасными. В этом сценарии это не имеет значения, поскольку выражение никогда не изменится, но есть и другие, где это может измениться.
источник
В vb эти операторы отличаются:
/
этоDouble
\
будетInteger
игнорируя остальныеисточник
Мне очень нравится пространство имен «My», которое было введено в Visual Basic 2005. My - это ярлык для нескольких групп информации и функций. Он обеспечивает быстрый и интуитивно понятный доступ к следующим типам информации:
источник
Пользовательские события
Обработка событий редко бывает полезной, но ее можно сильно настроить:
Затем это можно проверить следующим образом:
источник
Я только что нашел статью, в которой говорится о "!" оператор, также известный как «оператор поиска по словарю». Вот отрывок из статьи по адресу: http://panopticoncentral.net/articles/902.aspx
источник
Это встроено, и это явное преимущество перед C #. Возможность реализовать метод интерфейса без использования того же имени.
Такие как:
источник
Форсирование ByVal
В VB, если вы заключите свои аргументы в дополнительный набор круглых скобок, вы можете переопределить объявление метода ByRef и превратить его в ByVal. Например, следующий код производит 4, 5, 5 вместо 4,5,6
См. Аргумент, не изменяемый вызовом процедуры - базовая переменная
источник
Передача параметров по имени и их переупорядочивание
Использование:
Также может вызываться с использованием спецификации параметра ": =" в любом порядке:
источник
Оператор Using появился в VB 8 впервые, в C # он был с самого начала. Он вызывает автоматическое удаление за вас.
Например
источник
Псевдонимы импорта также в значительной степени неизвестны:
источник
Рассмотрим следующее объявление события
В C # вы можете проверить подписчиков на события, используя следующий синтаксис:
Однако компилятор VB.NET не поддерживает это. Фактически он создает скрытое поле закрытого члена, которое не отображается в IntelliSense:
Больше информации:
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
источник
Если вам нужно, чтобы имя переменной соответствовало ключевому слову, заключите его в квадратные скобки. Не включенные в другие группы. хотя это лучшая практика, но ее можно использовать с умом.
например
например, пример из комментариев (@Pondidum):
источник
Есть несколько ответов о XML-литералах, но не об этом конкретном случае:
Вы можете использовать XML-литералы, чтобы заключить строковые литералы, которые в противном случае нужно было бы экранировать. Например, строковые литералы, содержащие двойные кавычки.
Вместо этого:
Ты можешь сделать это:
Это особенно полезно, если вы тестируете литерал для синтаксического анализа CSV:
(Вам, конечно, не обязательно использовать
<string>
тег; вы можете использовать любой тег, который вам нравится.)источник
<q>
был бы хорошим тегом, похожим на использование в Perl / Ruby. В любом случае, это неплохая идиома. ЛАЙК!DateTime можно инициализировать, заключив дату в #
Вы также можете использовать вывод типа вместе с этим синтаксисом
Это намного приятнее, чем использовать конструктор
источник
У вас может быть 2 строки кода всего в одной строке. следовательно:
источник
Call (New Something).CallAMethod()
Дополнительные параметры
Варианты намного проще, чем создавать новые перегрузки, такие как:
источник
Заглавный регистр в VB.Net можно получить с помощью старого VB6 fxn:
источник
Свойства с параметрами
Я занимался программированием на C # и обнаружил функцию, которая отсутствовала в VB.Net, но не упоминалась здесь.
Пример того, как это сделать (а также ограничение C #), можно увидеть по адресу: Использование типичных свойств get set в C # ... с параметрами
Я взял код из этого ответа:
источник