Скрытые возможности 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 ответов

В VB8 и бывших версиях, если Вы не указывали типа для переменной, Вы представляете, Тип объекта был автоматически обнаружен. В VB9 (2008), Dim действовал бы как C# var ключевое слово, если Опция Выводит, установлено на На (который является, по умолчанию),

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

может быть эта ссылка, должен помочь

http://blogs.msdn.com/vbteam/archive/2007/11/20/hidden-gems-in-visual-basic-2008-amanda-silver.aspx

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

Также важно помнить, что проекты VB.NET, по умолчанию, имеют корневое пространство имен, которое является частью свойств проекта. По умолчанию это корневое пространство имен будет иметь то же имя как проект. При использовании блочной структуры Пространства имен Имена на самом деле добавляются к тому корневому пространству имен. Например: если проект называют MyProject, то мы могли объявить переменную как:

Private obj As MyProject.MyNamespace.MyClass

Для изменения корневого пространства имен используйте пункт меню Project-> Properties. Корневое пространство имен может быть очищено также, означая, что все блоки Пространства имен становятся корневым уровнем для кода, который они содержат.

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

Ключевое слово MyClass позволяет относиться к участникам экземпляра класса, как первоначально реализовано, игнорируя любые переопределения производного класса.

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

VB также предлагает оператор OnError. Но это не большая часть использования эти дни.

On Error Resume Next
' Or'
On Error GoTo someline

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

Пространства имен Aliassing

Imports Lan = Langauge

Хотя не уникальный для VB.Net об этом часто забывают при столкновении с конфликтами пространства имен.

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

Можно использовать R.E.M, чтобы прокомментировать строку вместо '. Не супер полезный, но помогает важному безусловному победителю комментариев w/o использование"!!!!!!!" или что бы то ни было.

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

Не возможно Явно реализовать интерфейсных участников в VB, но возможно реализовать их с другим именем.

Interface I1
    Sub Foo()
    Sub TheFoo()
End Interface

Interface I2
    Sub Foo()
    Sub TheFoo()
End Interface

Class C
    Implements I1, I2

    Public Sub IAmFoo1() Implements I1.Foo
        ' Something happens here'
    End Sub

    Public Sub IAmFoo2() Implements I2.Foo
        ' Another thing happens here'
    End Sub

    Public Sub TheF() Implements I1.TheFoo, I2.TheFoo
        ' You shouldn't yell!'
    End Sub
End Class

Голосуйте за эту функцию в Microsoft Connect.

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

Я не знаю, как скрытый Вы назвали бы его, но If оператор мог рассчитать.

Это очень похоже, в некотором смысле, на ?: (троичный) или ?? оператор в большом количестве подобных языкам C. Однако важно отметить, что это действительно оценивает все параметры, таким образом, важно не передать в чем-либо, что может вызвать исключение (если Вы не хотите это к), или что-либо, что может вызвать непреднамеренные побочные эффекты.

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

Dim result = If(condition, valueWhenTrue, valueWhenFalse)
Dim value = If(obj, valueWhenObjNull)
2
ответ дан 24 November 2019 в 01:26
поделиться

Когда-нибудь Рядовые пользователи не представляли переменной. Они представили их только при помощи их. Явная Опция VB была представлена только, чтобы удостовериться, что Вы не представите переменной по ошибке плохим вводом. Можно всегда поворачивать его к Прочь, испытывать дни, мы работали с Основным.

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

Я раньше очень любил дополнительные параметры функции, но я использую их меньше теперь, когда я должен пойти назад и вперед между C# и VB много. Когда C# будет поддерживать их? C++ и даже C имел их (в некотором роде)!

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

Вы можете иметь Если в одной строке.

If True Then DoSomething()
7
ответ дан 24 November 2019 в 01:26
поделиться
  • Дочерние пространства имен находятся в объеме после импорта их родителя. Для exampe, вместо того, чтобы иметь необходимость импортировать Систему. IO или говорят Систему. IO.File для использования класса Файла можно просто сказать IO.File. Это - простой пример: существуют места, где функция действительно пригождается, и C# не делает этого.
7
ответ дан 24 November 2019 в 01:26
поделиться

Select Case in place of multiple If/ElseIf/Else statements.

Assume simple geometry objects in this example:

Function GetToString(obj as SimpleGeomertyClass) as String
  Select Case True
    Case TypeOf obj is PointClass
      Return String.Format("Point: Position = {0}", _
                            DirectCast(obj,Point).ToString)
    Case TypeOf obj is LineClass
      Dim Line = DirectCast(obj,LineClass)
      Return String.Format("Line: StartPosition = {0}, EndPosition = {1}", _
                            Line.StartPoint.ToString,Line.EndPoint.ToString)
    Case TypeOf obj is CircleClass
      Dim Line = DirectCast(obj,CircleClass)
      Return String.Format("Circle: CenterPosition = {0}, Radius = {1}", _
                            Circle.CenterPoint.ToString,Circle.Radius)
    Case Else
      Return String.Format("Unhandled Type {0}",TypeName(obj))
  End Select
End Function
5
ответ дан 24 November 2019 в 01:26
поделиться

Стек / группировка нескольких операторов using вместе:

Dim sql As String = "StoredProcedureName"
Using cn As SqlConnection = getOpenConnection(), _
      cmd As New SqlCommand(sql, cn), _
      rdr As SqlDataReader = cmd.ExecuteReader()

    While rdr.Read()

        ''// Do Something

    End While

End Using

Честно говоря, вы также можете сделать это на C #. Но многие люди не знают об этом ни на одном из языков.

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

Подобно ответу Парса , оператор like имеет много вещей, которые он может сопоставить помимо простых подстановочных знаков. Я чуть не упал со стула, когда читал об этом документ MSDN :-)

5
ответ дан 24 November 2019 в 01:26
поделиться
IIf(False, MsgBox("msg1"), MsgBox("msg2"))

Что в результате? два окна сообщений !!!! Это происходит потому, что функция IIf оценивает оба параметра при достижении функции.

VB имеет новый оператор If (точно так же, как C #?: Operator):

If(False, MsgBox("msg1"), MsgBox("msg2"))

Будет отображать только второй msgbox.

в общем, я бы рекомендовал заменить все IIF в вашем vb-коде, если вы не хотите, чтобы он оценивал оба элемента:

Dim value = IIf(somthing, LoadAndGetValue1(), LoadAndGetValue2())

вы можете быть уверены, что оба значения были загружены.

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

Если вы никогда не знали о следующем, вы действительно не поверите, что это правда, это действительно то, чего C # не хватает на самом деле:

(Это называется литералами XML)

Imports <xmlns:xs="System">

Module Module1

  Sub Main()
    Dim xml =
      <root>
        <customer id="345">
          <name>John</name>
          <age>17</age>
        </customer>
        <customer id="365">
          <name>Doe</name>
          <age>99</age>
        </customer>
      </root>

    Dim id = 1
    Dim name = "Beth"
    DoIt(
      <param>
        <customer>
          <id><%= id %></id>
          <name><%= name %></name>
        </customer>
      </param>
    )

    Dim names = xml...<name>
    For Each n In names
      Console.WriteLine(n.Value)
    Next

    For Each customer In xml.<customer>
      Console.WriteLine("{0}: {1}", customer.@id, customer.<age>.Value)
    Next

    Console.Read()
  End Sub

  Private Sub CreateClass()
    Dim CustomerSchema =
      XDocument.Load(CurDir() & "\customer.xsd")

    Dim fields =
      From field In CustomerSchema...<xs:element>
      Where field.@type IsNot Nothing
      Select
        Name = field.@name,
        Type = field.@type

    Dim customer = 
      <customer> Public Class Customer 
<%= From field In fields Select <f> 
Private m_<%= field.Name %> As <%= GetVBPropType(field.Type) %></f>.Value %>

                     <%= From field In fields Select <p> 
Public Property <%= field.Name %> As <%= GetVBPropType(field.Type) %>
 Get 
Return m_<%= field.Name %> 
End Get
 Set(ByVal value As <%= GetVBPropType(field.Type) %>)
 m_<%= field.Name %> = value 
End Set
 End Property</p>.Value %> 
End Class</customer>

    My.Computer.FileSystem.WriteAllText("Customer.vb",
                                        customer.Value,
                                        False,
                                        System.Text.Encoding.ASCII)

  End Sub

  Private Function GetVBPropType(ByVal xmlType As String) As String
    Select Case xmlType
      Case "xs:string"
        Return "String"
      Case "xs:int"
        Return "Integer"
      Case "xs:decimal"
        Return "Decimal"
      Case "xs:boolean"
        Return "Boolean"
      Case "xs:dateTime", "xs:date"
        Return "Date"
      Case Else
        Return "'TODO: Define Type"
    End Select
  End Function

  Private Sub DoIt(ByVal param As XElement)
    Dim customers =
      From customer In param...<customer>
      Select New Customer With
      {
        .ID = customer.<id>.Value,
        .FirstName = customer.<name>.Value
      }

    For Each c In customers
      Console.WriteLine(c.ToString())
    Next
  End Sub

  Private Class Customer
    Public ID As Integer
    Public FirstName As String
    Public Overrides Function ToString() As String
      Return <string>
ID : <%= Me.ID %>
Name : <%= Me.FirstName %>
             </string>.Value
    End Function

  End Class
End Module
'Results:

ID : 1
Name : Beth
John
Doe
345: 17
365: 99

Возьмите посмотрите Советы / хитрости XML-литералов Бет Масси.

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

Вы можете использовать зарезервированное ключевое слово для свойств и имен переменных, если вы заключите имя в [и]

Public Class Item
    Private Value As Integer
    Public Sub New(ByVal value As Integer)
        Me.Value = value
    End Sub

    Public ReadOnly Property [String]() As String
        Get
            Return Value
        End Get
    End Property

    Public ReadOnly Property [Integer]() As Integer
        Get
            Return Value
        End Get
    End Property

    Public ReadOnly Property [Boolean]() As Boolean
        Get
            Return Value
        End Get
    End Property
End Class

'Real examples:
Public Class PropertyException : Inherits Exception
    Public Sub New(ByVal [property] As String)
        Me.Property = [property]
    End Sub

    Private m_Property As String
    Public Property [Property]() As String
        Get
            Return m_Property
        End Get
        Set(ByVal value As String)
            m_Property = value
        End Set
    End Property
End Class

Public Enum LoginLevel
    [Public] = 0
    Account = 1
    Admin = 2
    [Default] = Account
End Enum
5
ответ дан 24 November 2019 в 01:26
поделиться

В отличие от C #, в VB вы можете полагаться на значения по умолчанию для элементов, не допускающих значения NULL:

Sub Main()
    'Auto assigned to def value'
    Dim i As Integer '0'
    Dim dt As DateTime '#12:00:00 AM#'
    Dim a As Date '#12:00:00 AM#'
    Dim b As Boolean 'False'

    Dim s = i.ToString 'valid
End Sub

Тогда как в C # это будет ошибка компилятора:

int x;
var y = x.ToString(); //Use of unassigned value
4
ответ дан 24 November 2019 в 01:26
поделиться
Private Sub Button1_Click(ByVal sender As Button, ByVal e As System.EventArgs)
        Handles Button1.Click
    sender.Enabled = True
    DisableButton(sender)
End Sub

Private Sub Disable(button As Object)
    button.Enabled = false
End Sub

В этом фрагменте у вас есть 2 (а может, и больше?) Вещи, которые вы никогда не смогли бы сделать в C #:

  1. Обрабатывает Button1.Click - прикрепляет обработчик к событию извне!
  2. VB's неявность позволяет вам объявить первый параметр обработчика как ожидаемый тип. в C # вы не можете адресовать делегата другому шаблону, даже ожидаемому типу.

Кроме того, в C # вы не можете использовать ожидаемую функциональность для объекта - в C # вы можете мечтать об этом (теперь они сделали ключевое слово dynamic, но оно далеко от В.Б.). В C #, если вы напишете (новый объект ()). Enabled, вы получите сообщение об ошибке, что объект типа не имеет метода «Enabled». Я не из тех, кто будет рекомендовать вам, безопасно это или нет, информация предоставляется КАК ЕСТЬ, делать самостоятельно, по-прежнему, иногда (например, при работе с COM-объектами) это очень хорошо. Я лично всегда пишу (отправитель как кнопка), когда ожидаемое значение обязательно является кнопкой.

Более того: возьмите этот пример:

Private Sub control_Click(ByVal sender As Control, ByVal e As System.EventArgs)
        Handles TextBox1.Click, CheckBox1.Click, Button1.Click
    sender.Text = "Got it?..."
End Sub
2
ответ дан 24 November 2019 в 01:26
поделиться

Это происходит потому, что вызов ShowDialog также изменяет состояние своего владельца.

Чтобы этого не происходило, необходимо сбросить DialogResult из первого модального диалогового окна в DialogResult.None после вызова ShowDialog второго диалогового окна:

private void Button1_Click(object sender, EventArgs e)
{
    InnerDialog inner = new InnerDialog()
    DialogResult innerResult = inner.ShowDialog(this);
    this.DialogResult = DialogResult.None;
}

Это давняя проблема (см. this сообщение).

Module Module1

    Sub Main()
        Dim str1 = "initial"
        Dim str2 = "initial"
        DoByVal(str1)
        DoByRef(str2)

        Console.WriteLine(str1)
        Console.WriteLine(str2)
    End Sub

    Sub DoByVal(ByVal str As String)
        str = "value 1"
    End Sub

    Sub DoByRef(ByRef str As String)
        str = "value 2"
    End Sub
End Module

'Results:
'initial
'value 2
1
ответ дан 24 November 2019 в 01:26
поделиться

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

Вот пример:

Public Function DoSomething(byval x as integer, optional y as boolean=True, optional z as boolean=False)
' ......
End Function

тогда вы можете назовите его так:

DoSomething(x:=1, y:=false)
DoSomething(x:=2, z:=true)
or
DoSomething(x:=3,y:=false,z:=true)

Это намного чище и без ошибок, тогда вызовите такую ​​функцию

DoSomething(1,true)
8
ответ дан 24 November 2019 в 01:26
поделиться

Ключевое слово Nothing может означать значение по умолчанию (T) или null, в зависимости от контекста. Вы можете использовать это, чтобы создать очень интересный метод:

'''<summary>Returns true for reference types, false for struct types.</summary>'
Public Function IsReferenceType(Of T)() As Boolean
    Return DirectCast(Nothing, T) Is Nothing
End Function
4
ответ дан 24 November 2019 в 01:26
поделиться

Улучшенная обработка ошибок с использованием When

Обратите внимание на использование , когда в строке Catch ex As IO.FileLoadException When try <3

Do
  Dim attempt As Integer
  Try
    ''// something that might cause an error.
  Catch ex As IO.FileLoadException When attempt < 3
    If MsgBox("do again?", MsgBoxStyle.YesNo) = MsgBoxResult.No Then
      Exit Do
    End If
  Catch ex As Exception
    ''// if any other error type occurs or the attempts are too many
    MsgBox(ex.Message)
    Exit Do
  End Try
  ''// increment the attempt counter.
  attempt += 1
Loop

Недавно просмотренные в VbRad

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

При объявлении массива в vb.net всегда используйте синтаксис «от 0 до xx».

Dim b(0 to 9) as byte 'Declares an array of 10 bytes

Он дает очень четкое представление о диапазоне массива. Сравните его с эквивалентом

Dim b(9) as byte 'Declares another array of 10 bytes

. Даже если вы знаете, что второй пример состоит из 10 элементов, он не кажется очевидным. И я не могу вспомнить, сколько раз я видел код от программиста, который хотел вышеизложенное, но вместо этого написал

Dim b(10) as byte 'Declares another array of 10 bytes

Это, конечно, совершенно неверно. Поскольку b (10) создает массив из 11 байтов. И это может легко вызвать ошибки, поскольку это выглядит правильным для любого, кто не знает, что искать.

Синтаксис «от 0 до xx» также работает со следующим

Dim b As Byte() = New Byte(0 To 9) {} 'Another way to create a 10 byte array
ReDim b(0 to 9) 'Assigns a new 10 byte array to b

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

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

Вот забавный эпизод, которого я не видел; Я знаю, что это работает в VS 2008, по крайней мере:

Если вы случайно завершите строку VB точкой с запятой , потому что вы слишком много работали с C #, точка с запятой автоматически удаляется . На самом деле невозможно (опять же, по крайней мере, в VS 2008) случайно закончить строку VB точкой с запятой. Попробуйте!

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

6
ответ дан 24 November 2019 в 01:26
поделиться
Sub Main()
    Select Case "value to check"
        'Check for multiple items at once:'
        Case "a", "b", "asdf" 
            Console.WriteLine("Nope...")
        Case "value to check"
            Console.WriteLine("Oh yeah! thass what im talkin about!")
        Case Else
            Console.WriteLine("Nah :'(")
    End Select


    Dim jonny = False
    Dim charlie = True
    Dim values = New String() {"asdff", "asdfasdf"}
    Select Case "asdfasdf"
        'You can perform boolean checks that has nothing to do with your var.,
        'not that I would recommend that, but it exists.'
        Case values.Contains("ddddddddddddddddddddddd")
        Case True
        Case "No sense"
        Case Else
    End Select

    Dim x = 56
    Select Case x
        Case Is > 56
        Case Is <= 5
        Case Is <> 45
        Case Else
    End Select

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

Ключевое слово Me

Ключевое слово "Me" является уникальным в VB.Net. Я знаю, что оно довольно распространено, но есть разница между "Me" и эквивалентом "this" в C#. Разница в том, что "this" доступен только для чтения, а "Me" - нет. Это ценно в конструкторах, где у вас есть экземпляр переменной, которой вы хотите, чтобы конструируемая переменная уже была равна, поскольку вы можете просто установить "Me = TheVariable", в отличие от C#, где вам придется копировать каждое поле переменной вручную (что может быть ужасно, если полей много, и чревато ошибками). Обходным решением в C# было бы выполнение присваивания вне конструктора. Это означает, что теперь, если объект самоконструируется в полный объект, вам понадобится еще одна функция.

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