Скрытые возможности VB.NET?

Я попробовал вышеуказанное решение, но я счел его непригодным для больших объемов данных. Затем я обнаружил функцию потока:

MongoClient.connect("...", function(err, db){
    var c = db.collection('yourCollection');
    var s = c.find({/* your query */}).stream();
    s.on('data', function(doc){
        c.update({_id: doc._id}, {$set: {name : doc.firstName + ' ' + doc.lastName}}, function(err, result) { /* result == true? */} }
    });
    s.on('end', function(){
        // stream can end before all your updates do if you have a lot
    })
})
121
задан 5 revs, 2 users 40% 23 May 2017 в 12:10
поделиться

59 ответов

Exception When пункт в основном неизвестен.

Рассмотрите это:

Public Sub Login(host as string, user as String, password as string, _
                            Optional bRetry as Boolean = False)
Try
   ssh.Connect(host, user, password)
Catch ex as TimeoutException When Not bRetry
   ''//Try again, but only once.
   Login(host, user, password, True)
Catch ex as TimeoutException
   ''//Log exception
End Try
End Sub
128
ответ дан 24 November 2019 в 01:26
поделиться

Вы заметили Подобный оператор сравнения?

Dim b As Boolean = "file.txt" Like "*.txt"

Больше из MSDN

Dim testCheck As Boolean

' The following statement returns True (does "F" satisfy "F"?)'
testCheck = "F" Like "F"

' The following statement returns False for Option Compare Binary'
'    and True for Option Compare Text (does "F" satisfy "f"?)'
testCheck = "F" Like "f"

' The following statement returns False (does "F" satisfy "FFF"?)'
testCheck = "F" Like "FFF"

' The following statement returns True (does "aBBBa" have an "a" at the'
'    beginning, an "a" at the end, and any number of characters in '
'    between?)'
testCheck = "aBBBa" Like "a*a"

' The following statement returns True (does "F" occur in the set of'
'    characters from "A" through "Z"?)'
testCheck = "F" Like "[A-Z]"

' The following statement returns False (does "F" NOT occur in the '
'    set of characters from "A" through "Z"?)'
testCheck = "F" Like "[!A-Z]"

' The following statement returns True (does "a2a" begin and end with'
'    an "a" and have any single-digit number in between?)'
testCheck = "a2a" Like "a#a"

' The following statement returns True (does "aM5b" begin with an "a",'
'    followed by any character from the set "L" through "P", followed'
'    by any single-digit number, and end with any character NOT in'
'    the character set "c" through "e"?)'
testCheck = "aM5b" Like "a[L-P]#[!c-e]"

' The following statement returns True (does "BAT123khg" begin with a'
'    "B", followed by any single character, followed by a "T", and end'
'    with zero or more characters of any type?)'
testCheck = "BAT123khg" Like "B?T*"

' The following statement returns False (does "CAT123khg" begin with'
'    a "B", followed by any single character, followed by a "T", and'
'    end with zero or more characters of any type?)'
testCheck = "CAT123khg" Like "B?T*"
49
ответ дан 24 November 2019 в 01:26
поделиться

Пользовательский Enums

Одна из реальных скрытых функций VB completionlist Тег документации XML, который может использоваться для создания собственный Enum- как типы с расширенной функциональностью. Эта функция не работает в C#, все же.

Один пример из недавнего моего кода:

'
''' <completionlist cref="RuleTemplates"/>
Public Class Rule
    Private ReadOnly m_Expression As String
    Private ReadOnly m_Options As RegexOptions

    Public Sub New(ByVal expression As String)
        Me.New(expression, RegexOptions.None)
    End Sub

    Public Sub New(ByVal expression As String, ByVal options As RegexOptions)
        m_Expression = expression
        m_options = options
    End Sub

    Public ReadOnly Property Expression() As String
        Get
            Return m_Expression
        End Get
    End Property

    Public ReadOnly Property Options() As RegexOptions
        Get
            Return m_Options
        End Get
    End Property
End Class

Public NotInheritable Class RuleTemplates
    Public Shared ReadOnly Whitespace As New Rule("\s+")
    Public Shared ReadOnly Identifier As New Rule("\w+")
    Public Shared ReadOnly [String] As New Rule("""([^""]|"""")*""")
End Class

Теперь, при присвоении значения переменной, объявленной как Rule, IDE предлагает список IntelliSense возможных значений от RuleTemplates.

/ РЕДАКТИРОВАНИЕ:

Так как это - функция, которая полагается на IDE, трудно показать, как это смотрит, когда Вы используете его, но я буду просто использовать снимок экрана:

Список завершения в действии http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png

На самом деле IntelliSense на 100% идентичен тому, что Вы получаете при использовании Enum.

82
ответ дан 24 November 2019 в 01:26
поделиться

О! и не забывайте литералы XML.

Dim contact2 = _
        <contact>
          <name>Patrick Hines</name>
          <%= From p In phoneNumbers2 _
            Select <phone type=<%= p.Type %>><%= p.Number %></phone> _
          %>
        </contact>
45
ответ дан 24 November 2019 в 01:26
поделиться

Определения типов

VB знает примитив отчасти typedef через Import псевдонимы:

Imports S = System.String

Dim x As S = "Hello"

Это более полезно при использовании в сочетании с универсальными типами:

Imports StringPair = System.Collections.Generic.KeyValuePair(Of String, String)
48
ответ дан 24 November 2019 в 01:26
поделиться

Объектная инициализация там также!

Dim x as New MyClass With {.Prop1 = foo, .Prop2 = bar}
39
ответ дан 24 November 2019 в 01:26
поделиться

DirectCast

DirectCast чудо. На поверхности это работает подобное CType оператор в этом это преобразовывает объект из одного типа в другого. Однако это работает намного более строгим подшипником. CTypeфактическое поведение поэтому часто непрозрачно, и это нисколько не очевидно, какой вид преобразования выполняется.

DirectCast только поддержки две отличных операции:

  • Распаковывание типа значения, и
  • upcasting в иерархии классов.

Любой другой бросок не будет работать (например, пытающийся распаковать Integer к a Double) и закончится во время компиляции / ошибка периода выполнения (в зависимости от ситуации и что может быть обнаружено статической проверкой типа). Я поэтому использую DirectCast когда это возможно, поскольку это получает мое намерение лучше всего: в зависимости от ситуации я или хотите распаковать значение известного типа или выполнить восходящее. Конец истории.

Используя CType, с другой стороны, оставляет читателя кода, задающегося вопросом, что действительно предназначил программист, потому что он решает ко всем видам различных операций, включая вызов пользовательского кода.

Почему это - скрытая функция? Команда VB опубликовала guideline1, который препятствует использованию DirectCast (даже при том, что это на самом деле быстрее!) для создания кода большим количеством универсальной формы. Я утверждаю, что это - плохая инструкция, которая должна быть инвертирована: Каждый раз, когда возможно, польза DirectCast по более общему CType оператор. Это делает код намного более четким. CType, с другой стороны, должен только быть назван, если это действительно предназначается, т.е. когда сужение CType оператор (cf. перегрузка оператора) нужно назвать.


1) Я не могу придумать ссылку на инструкцию, но я нашел, что Paul Vick берет ее (главный разработчик команды VB):

В реальном мире Вы почти никогда не собираетесь замечать различие, таким образом, Вы могли бы также пойти с более гибкими операторами преобразования как CType, CInt, и т.д.


(РЕДАКТИРОВАНИЕ Zack: Узнайте больше здесь: Как я должен бросить в VB.NET?)

38
ответ дан 24 November 2019 в 01:26
поделиться

If условное выражение и объединяет оператор

Я не знаю, как скрытый Вы назвали бы его, но Iif ([выражение], [оценивают, если верный], [оценивают, если ложь]), Поскольку Объектная функция могла бы рассчитать.

Это не так скрыто, как удерживается от использования! VB 9 имеет If оператор, который намного лучше и работает точно условным выражением C# и объединяет оператор (в зависимости от того, что Вы хотите):

Dim x = If(a = b, c, d)

Dim hello As String = Nothing
Dim y = If(hello, "World")

Отредактированный для показа другого примера:

Это будет работать с If(), но вызовите исключение с IIf()

Dim x = If(b<>0,a/b,0)
37
ответ дан 24 November 2019 в 01:26
поделиться

Это - хорошее. Избранный Оператор выбора в VB.Net очень мощен.

Уверенный существует стандарт

Select Case Role
  Case "Admin"
         ''//Do X
  Case "Tester"
         ''//Do Y
  Case "Developer"
         ''//Do Z
  Case Else
       ''//Exception case
End Select

Но существует больше...

Можно сделать диапазоны:

Select Case Amount
 Case Is < 0
    ''//What!!
 Case 0 To 15
   Shipping = 2.0
 Case 16 To 59
    Shipping = 5.87
 Case Is > 59
    Shipping = 12.50
 Case Else
    Shipping = 9.99
 End Select

И еще больше...

Вы можете (хотя может не быть хорошая идея), делают булевская переменная проверяет несколько переменных:

Select Case True
 Case a = b
    ''//Do X
 Case a = c
    ''//Do Y
 Case b = c
    ''//Do Z
 Case Else
   ''//Exception case
 End Select
32
ответ дан 24 November 2019 в 01:26
поделиться

Одно главное средство экономии времени, которое я использую все время, С ключевым словом:

With ReallyLongClassName
    .Property1 = Value1
    .Property2 = Value2
    ...
End With

Мне просто не нравится вводить больше, чем я имею к!

31
ответ дан 24 November 2019 в 01:26
поделиться
  • Логические операторы AndAlso/OrElse

(РЕДАКТИРОВАНИЕ: Узнайте больше здесь: я должен всегда использовать операторы AndAlso и OrElse?)

26
ответ дан 24 November 2019 в 01:26
поделиться

Статические участники в методах.

Например:

Function CleanString(byval input As String) As String
    Static pattern As New RegEx("...")

    return pattern.Replace(input, "")
End Function

В вышеупомянутой функции регулярное выражение шаблона будет только когда-либо создаваться однажды, неважно, сколько раз вызвана функция.

Другое использование должно сохранить экземпляр "случайных" вокруг:

Function GetNextRandom() As Integer
    Static r As New Random(getSeed())

    Return r.Next()
End Function 

Кроме того, это не то же как простое объявление его как Общий член класса; объекты объявили, что этот путь, как гарантируют, будет ориентирован на многопотоковое исполнение также. Это не имеет значения в этом сценарии, так как выражение никогда не будет изменяться, но существуют другие, где это могло бы.

25
ответ дан 24 November 2019 в 01:26
поделиться

Пользовательские события

Хотя редко полезный, обработка событий может быть в большой степени настроена:

Public Class ApplePie
    Private ReadOnly m_BakedEvent As New List(Of EventHandler)()

    Custom Event Baked As EventHandler
        AddHandler(ByVal value As EventHandler)
            Console.WriteLine("Adding a new subscriber: {0}", value.Method)
            m_BakedEvent.Add(value)
        End AddHandler

        RemoveHandler(ByVal value As EventHandler)
            Console.WriteLine("Removing subscriber: {0}", value.Method)
            m_BakedEvent.Remove(value)
        End RemoveHandler

        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            Console.WriteLine("{0} is raising an event.", sender)
            For Each ev In m_BakedEvent
                ev.Invoke(sender, e)
            Next
        End RaiseEvent
    End Event

    Public Sub Bake()
        ''// 1. Add ingredients
        ''// 2. Stir
        ''// 3. Put into oven (heated, not pre-heated!)
        ''// 4. Bake
        RaiseEvent Baked(Me, EventArgs.Empty)
        ''// 5. Digest
    End Sub
End Class

Это может затем быть протестировано следующим способом:

Module Module1
    Public Sub Foo(ByVal sender As Object, ByVal e As EventArgs)
        Console.WriteLine("Hmm, freshly baked apple pie.")
    End Sub

    Sub Main()
        Dim pie As New ApplePie()
        AddHandler pie.Baked, AddressOf Foo
        pie.Bake()
        RemoveHandler pie.Baked, AddressOf Foo
    End Sub
End Module
23
ответ дан 24 November 2019 в 01:26
поделиться

Мне действительно нравится "Мое" Пространство имен, которое было представлено в Visual Basic 2005. Мой - ярлык на несколько групп информации и функциональности. Это обеспечивает быстрый и интуитивный доступ к следующим типам информации:

  • Мой. Компьютер: Доступ к информации, связанной с компьютером, таким как файловая система, сеть, устройства, информация о системе, и т.д. Это обеспечивает доступ ко многим очень важным ресурсам включая Мой. Компьютер. Сеть, Мой. Компьютер. FileSystem и Мой. Компьютер. Принтеры.
  • Мой. Приложение: Доступ к информации, связанной с конкретным приложением, таким как имя, версия, текущий каталог, и т.д.
  • Мой. Пользователь: Доступ к информации, связанной с текущим аутентифицируемым пользователем.
  • Мой. Ресурсы: Доступ к ресурсам используется приложением, находящимся в файлах ресурсов способом со строгим контролем типов.
  • Мой. Настройки: Доступ к параметрам конфигурации приложения способом со строгим контролем типов.
23
ответ дан 24 November 2019 в 01:26
поделиться

Это встроено, и определенное преимущество перед C#. Способность реализовать метод интерфейса, не имея необходимость использовать то же имя.

Такой как:

Public Sub GetISCSIAdmInfo(ByRef xDoc As System.Xml.XmlDocument) Implements IUnix.GetISCSIInfo

End Sub
19
ответ дан 24 November 2019 в 01:26
поделиться

Передающие параметры по имени и, таким образом переупорядочивая их

Sub MyFunc(Optional msg as String= "", Optional displayOrder As integer = 0)

    'Do stuff

End function

Использование:

Module Module1

    Sub Main()

        MyFunc() 'No params specified

    End Sub

End Module

Может также быть назван с помощью ": =" спецификация параметра в любом порядке:

MyFunc(displayOrder:=10, msg:="mystring")
16
ответ дан 24 November 2019 в 01:26
поделиться

Оператор Using является новым с VB 8, C# имел его от запуска. Это звонит, располагают автоволшебно для Вас.

Например.

Using lockThis as New MyLocker(objToLock)

End Using
15
ответ дан 24 November 2019 в 01:26
поделиться

Псевдонимы импорта также в основном неизвестны:

Import winf = System.Windows.Forms

''Later
Dim x as winf.Form
14
ответ дан 24 November 2019 в 01:26
поделиться

При необходимости в имени переменной для соответствия имени переменной ключевого слова, включите его со скобками. Не NEC. лучшая практика, хотя - но это может использоваться мудро.

например.

Class CodeException
Public [Error] as String
''...
End Class

''later
Dim e as new CodeException
e.Error = "Invalid Syntax"

например, Пример из комментариев (@Pondidum):

Class Timer
Public Sub Start()
''...
End Sub

Public Sub [Stop]()
''...
End Sub
14
ответ дан 24 November 2019 в 01:26
поделиться

Рассмотрите следующее объявление события

Public Event SomethingHappened As EventHandler

В C# можно проверить на подписчиков события при помощи следующего синтаксиса:

if(SomethingHappened != null)
{
  ...
}

Однако компилятор VB.NET не поддерживает это. Это на самом деле создает скрытое поле члена парламента, не занимающего официального поста, которое не видимо в IntelliSense:

If Not SomethingHappenedEvent Is Nothing OrElse SomethingHappenedEvent.GetInvocationList.Length = 0 Then
...
End If

Больше информации:

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

14
ответ дан 24 November 2019 в 01:26
поделиться

Я просто нашел статью, говорящую о"!" оператор, также знайте как "оператор поиска по словарю". Вот выборка от статьи в: http://panopticoncentral.net/articles/902.aspx

Техническое имя для! оператор является "оператором поиска по словарю". Словарь является любым типом набора, который индексируется ключом, а не числом, точно так же, как способ, которым записи в английском словаре индексируются словом, из которого Вы хотите определение. Наиболее распространенным примером типа словаря является Система. Наборы. Хеш-таблица, которая позволяет Вам добавлять (ключ, значение) пар в хеш-таблицу и затем получать значения с помощью ключей. Например, следующий код добавляет три записи в хеш-таблицу и смотрит один из них использование ключевой "Свинины".

Dim Table As Hashtable = New Hashtable
Table("Orange") = "A fruit"
Table("Broccoli") = "A vegetable"
Table("Pork") = "A meat" 
Console.WriteLine(Table("Pork"))

! оператор может использоваться для поиска значений от любого типа словаря, который индексирует его значения с помощью строк. Идентификатор после! используется в качестве ключа в операции поиска. Таким образом, вышеупомянутый код, возможно, вместо этого был написан:

Dim Table As Hashtable = New Hashtable
Table!Orange = "A fruit"
Table!Broccoli = "A vegetable"
Table!Pork = "A meat"
Console.WriteLine(Table!Pork)

Второй пример абсолютно эквивалентен первому, но просто выглядит намного более хорошим, по крайней мере, моим глазам. Я нахожу, что существует много мест где! может использоваться, особенно когда дело доходит до XML и сети, где существуют только тонны наборов, которые индексируются строкой. Одно неудачное ограничение то, что вещь после! все еще должен быть допустимый идентификатор, поэтому если строка, которую Вы хотите использовать в качестве ключа, имеет некоторый недопустимый символ идентификатора в нем, Вы не можете использовать! оператор. (Вы не можете, например, сказать "Таблицу! AB$CD = 5 дюймов, потому что $ не законен в идентификаторах.) В VB6 и прежде, Вы могли использовать скобки для выхода из недопустимых идентификаторов (т.е. "Таблица! [AB$CD]"), но когда мы начали использовать скобки для выхода из ключевых слов, мы потеряли способность сделать это. В большинстве случаев, однако, это не слишком много ограничения.

Стать действительно техническим, x! y работает, если x имеет свойство по умолчанию, которое берет Строку или Объект в качестве параметра. В этом случае, x! y изменяется в x. DefaultProperty ("y"). Интересное примечание стороны - то, что существует специальное правило в лексической грамматике языка для создания этой всей работы.! символ также используется в качестве символа текста на языке, и символы текста едят перед операторами. Таким образом без специального правила, x! y был бы просканирован как "x! y" вместо "x! y". К счастью, с тех пор нет никакого места на языке, где два идентификатора подряд допустимы, мы просто представили правило что если следующий символ после! запуск идентификатора, мы рассматриваем! быть оператором и не символом текста.

21
ответ дан 24 November 2019 в 01:26
поделиться

У Вас может быть 2 строки кода во всего одной строке. следовательно:

Dim x As New Something : x.CallAMethod
12
ответ дан 24 November 2019 в 01:26
поделиться

Дополнительные параметры

Optionals настолько легче, чем создание новые перегрузки, таковы как:

Function CloseTheSystem(Optional ByVal msg AS String = "Shutting down the system...")
   Console.Writeline(msg)
   ''//do stuff
End Function
11
ответ дан 24 November 2019 в 01:26
поделиться

Случай заголовка в VB.Net может быть достигнут старым VB6 fxn:

StrConv(stringToTitleCase, VbStrConv.ProperCase,0) ''0 is localeID
9
ответ дан 24 November 2019 в 01:26
поделиться

Свойства с параметрами

Я делал некоторое программирование C# и обнаружил функцию, которая пропускала это, VB.Net имел, но не был упомянут здесь.

Пример того, как сделать это (а также c# ограничение) виден в: Используя типичное получают установленные свойства в C#... с параметрами

Я извлек код из того ответа:

Private Shared m_Dictionary As IDictionary(Of String, Object) = _
             New Dictionary(Of String, Object)

Public Shared Property DictionaryElement(ByVal Key As String) As Object
    Get
        If m_Dictionary.ContainsKey(Key) Then
            Return m_Dictionary(Key)
        Else
            Return [String].Empty
        End If
    End Get
    Set(ByVal value As Object)
        If m_Dictionary.ContainsKey(Key) Then
            m_Dictionary(Key) = value
        Else
            m_Dictionary.Add(Key, value)
        End If

    End Set
End Property
9
ответ дан 24 November 2019 в 01:26
поделиться

Лучший и простой парсер CSV:

Microsoft.VisualBasic.FileIO.TextFieldParser

Добавив ссылку на Microsoft.VisualBasic, можно использовать его на любом другом языке .Net, например C #

31
ответ дан 24 November 2019 в 01:26
поделиться

DateTime можно инициализировать, заключив дату в #

Dim independanceDay As DateTime = #7/4/1776#

. Вы также можете использовать вывод типа вместе с этим синтаксисом

Dim independanceDay = #7/4/1776#

Это намного лучше, чем использование конструктора

Dim independanceDay as DateTime = New DateTime(1776, 7, 4)
12
ответ дан 24 November 2019 в 01:26
поделиться

В vb эти операторы различаются:

/ равно Двойное значение
\ равно Целое число без остатка

Sub Main()
    Dim x = 9 / 5  
    Dim y = 9 \ 5  
    Console.WriteLine("item x of '{0}' equals to {1}", x.GetType.FullName, x)
    Console.WriteLine("item y of '{0}' equals to {1}", y.GetType.FullName, y)

    'Results:
    'item x of 'System.Double' equals to 1.8
    'item y of 'System.Int32' equals to 1
End Sub
25
ответ дан 24 November 2019 в 01:26
поделиться

Есть несколько ответов о XML-литералах, но не об этом конкретном случае:

Вы можете использовать XML-литералы для включения строковых литералов, которые в противном случае потребовалось бы экранировать. Например, строковые литералы, содержащие двойные кавычки.

Вместо этого:

Dim myString = _
    "This string contains ""quotes"" and they're ugly."

Вы можете сделать это:

Dim myString = _
    <string>This string contains "quotes" and they're nice.</string>.Value

Это особенно полезно, если вы тестируете литерал для синтаксического анализа CSV:

Dim csvTestYuck = _
    """Smith"", ""Bob"", ""123 Anywhere St"", ""Los Angeles"", ""CA"""

Dim csvTestMuchBetter = _
    <string>"Smith", "Bob", "123 Anywhere St", "Los Angeles", "CA"</string>.Value

(Вы не Конечно, не нужно использовать тег ; вы можете использовать любой тег, который вам нравится.)

13
ответ дан 24 November 2019 в 01:26
поделиться

Форсирование ByVal

В VB, если вы заключите свои аргументы в дополнительный набор круглых скобок, вы можете переопределить объявление метода ByRef и превратить его в ByVal. Например, следующий код производит 4, 5, 5 вместо 4,5,6

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim R = 4
    Trace.WriteLine(R)
    Test(R)
    Trace.WriteLine(R)
    Test((R))
    Trace.WriteLine(R)
End Sub
Private Sub Test(ByRef i As Integer)
    i += 1
End Sub

См. Аргумент, не изменяемый вызовом процедуры - базовая переменная

17
ответ дан 24 November 2019 в 01:26
поделиться