Visual Basic .NET Language
Введение в синтаксис
Поиск…
Комментарии
Первое, что нужно знать, - это написать комментарии.
В VB .NET вы пишете комментарий, написав апостроф или напишите REM
. Это означает, что остальная часть строки не будет учитываться компилятором.
'This entire line is a comment
Dim x As Integer = 0 'This comment is here to say we give 0 value to x
REM There are no such things as multiline comments
'So we have to start everyline with the apostrophe or REM
Помощник Intellisense
Еще одна интересная возможность - добавить свои собственные комментарии в Visual Studio Intellisense. Таким образом, вы можете сделать свои собственные письменные функции и классы понятными. Для этого вы должны ввести символ комментария три раза подряд над вашей функцией.
После этого Visual Studio автоматически добавит XML-документацию:
''' <summary>
''' This function returns a hello to your name
''' </summary>
''' <param name="Name">Your Name</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Test(Name As String) As String
Return "Hello " & Name
End Function
После этого, если вы введете свою тестовую функцию где-нибудь в своем коде, эта небольшая помощь будет отображаться:
Объявление переменной
В VB.NET каждая переменная должна быть объявлена до того, как она будет использоваться (если опция Explicit установлена в On ). Существует два способа объявления переменных:
- Внутри
Function
илиSub
:
Dim w 'Declares a variable named w of type Object (invalid if Option Strict is On)
Dim x As String 'Declares a variable named x of type String
Dim y As Long = 45 'Declares a variable named y of type Long and assigns it the value 45
Dim z = 45 'Declares a variable named z whose type is inferred
'from the type of the assigned value (Integer here) (if Option Infer is On)
'otherwise the type is Object (invalid if Option Strict is On)
'and assigns that value (45) to it
См. Этот ответ для получения полной информации о Option Explicit
, Strict
и Infer
.
- Внутри
Class
илиModule
:
Эти переменные (также называемые полями в этом контексте) будут доступны для каждого экземпляра Class
они объявлены. Они могут быть доступны извне объявленного Class
зависимости от модификатора ( Public
, Private
, Protected
, Protected Friend
или Friend
)
Private x 'Declares a private field named x of type Object (invalid if Option Strict is On)
Public y As String 'Declares a public field named y of type String
Friend z As Integer = 45 'Declares a friend field named z of type Integer and assigns it the value 45
Эти поля также могут быть объявлены с помощью Dim
но значение изменяется в зависимости от типа окружения:
Class SomeClass
Dim z As Integer = 45 ' Same meaning as Private z As Integer = 45
End Class
Structure SomeStructure
Dim y As String ' Same meaning as Public y As String
End Structure
Модификаторы
Модификаторы - это способ указать, как внешние объекты могут обращаться к данным объекта.
- общественного
Означает, что любой объект может получить к нему доступ без ограничений
- Частный
Значит, только объект объявления может получить доступ и просмотреть это
- защищенный
Означает, что только объявляющий объект и любой объект, который наследует его, могут получить доступ и просмотреть это.
- Друг
Означает только объект delcaring, любой объект, который наследует его, и любой объект в том же пространстве имен может получить доступ и просмотреть это.
Public Class MyClass
Private x As Integer
Friend Property Hello As String
Public Sub New()
End Sub
Protected Function Test() As Integer
Return 0
End Function
End Class
Написание функции
Функция представляет собой блок кода, который будет вызываться несколько раз во время выполнения. Вместо того, чтобы писать один и тот же фрагмент кода снова и снова, этот код можно записать внутри функции и вызвать эту функцию всякий раз, когда это необходимо.
Функция :
- Должен быть объявлен в классе или модуле
- Возвращает значение (заданное типом возврата)
- Имеет модификатор
- Может принимать параметры для обработки
Private Function AddNumbers(X As Integer, Y As Integer) As Integer
Return X + Y
End Function
Имя функции может использоваться как оператор return
Function sealBarTypeValidation() as Boolean
Dim err As Boolean = False
If rbSealBarType.SelectedValue = "" Then
err = True
End If
Return err
End Function
это то же самое, что и
Function sealBarTypeValidation() as Boolean
sealBarTypeValidation = False
If rbSealBarType.SelectedValue = "" Then
sealBarTypeValidation = True
End If
End Function
Инициализаторы объектов
Именованные типы
Dim someInstance As New SomeClass(argument) With { .Member1 = value1, .Member2 = value2 '... }
Эквивалентно
Dim someInstance As New SomeClass(argument) someInstance.Member1 = value1 someInstance.Member2 = value2 '...
Анонимные типы (опция Infer должна быть включена)
Dim anonymousInstance = New With { .Member1 = value1, .Member2 = value2 '... }
Хотя подобный
anonymousInstance
someInstance
не имеет такого же типа, какsomeInstance
Имя пользователя должно быть уникальным в анонимном типе и может быть взято из переменной или другого имени участника
Dim anonymousInstance = New With { value1, value2, foo.value3 '... } ' usage : anonymousInstance.value1 or anonymousInstance.value3
Каждому члену может предшествовать
Key
словоKey
. Этими членами будут свойстваReadOnly
, те, которые не будут доступны для чтения / записиDim anonymousInstance = New With { Key value1, .Member2 = value2, Key .Member3 = value3 '... }
Два анонимных экземпляра, определенные с теми же членами (имя, тип, наличие
Key
и порядка), будут иметь одинаковый анонимный тип.Dim anon1 = New With { Key .Value = 10 } Dim anon2 = New With { Key .Value = 20 } anon1.GetType Is anon2.GetType ' True
Анонимные типы структурно равнозначны. Два экземпляра тех же анонимных типов, имеющих по крайней мере одно свойство
Key
с одинаковыми значениямиKey
будут равны. Вы должны использовать методEquals
для его проверки, используя=
не будет компилироваться, аIs
будет сравнивать ссылку на объект.Dim anon1 = New With { Key .Name = "Foo", Key .Age = 10, .Salary = 0 } Dim anon2 = New With { Key .Name = "Bar", Key .Age = 20, .Salary = 0 } Dim anon3 = New With { Key .Name = "Foo", Key .Age = 10, .Salary = 10000 } anon1.Equals(anon2) ' False anon1.Equals(anon3) ' True although non-Key Salary isn't the same
Инициализатор имен и анонимных типов может быть вложенным и смешанным
Dim anonymousInstance = New With {
value,
Key .someInstance = New SomeClass(argument) With {
.Member1 = value1,
.Member2 = value2
'...
}
'...
}
Инициализатор коллекции
Массивы
Dim names = {"Foo", "Bar"} ' Inferred as String() Dim numbers = {1, 5, 42} ' Inferred as Integer()
Контейнеры (
List(Of T)
,Dictionary(Of TKey, TValue)
и т. Д.)Dim names As New List(Of String) From { "Foo", "Bar" '... } Dim indexedDays As New Dictionary(Of Integer, String) From { {0, "Sun"}, {1, "Mon"} '... }
Эквивалентно
Dim indexedDays As New Dictionary(Of Integer, String) indexedDays.Add(0, "Sun") indexedDays.Add(1, "Mon") '...
Элементы могут быть результатом конструктора, вызова метода, доступа к свойствам. Его также можно смешивать с инициализатором Object.
Dim someList As New List(Of SomeClass) From { New SomeClass(argument), New SomeClass With { .Member = value }, otherClass.PropertyReturningSomeClass, FunctionReturningSomeClass(arguments) '... }
Невозможно использовать синтаксис инициализатора инициализатора AND и инициализатор коллекции для одного и того же объекта одновременно. Например, они не будут работать
Dim numbers As New List(Of Integer) With {.Capacity = 10} _ From { 1, 5, 42 } Dim numbers As New List(Of Integer) From { .Capacity = 10, 1, 5, 42 } Dim numbers As New List(Of Integer) With { .Capacity = 10, 1, 5, 42 }
Пользовательский тип
Мы также можем разрешить синтаксис инициализатора коллекции, предоставляя настраиваемый тип.
Он должен реализовыватьIEnumerable
и иметь доступный и совместимый с помощью правил перегрузки методAdd
(instance, Shared или even extension)Продуманный пример:
Class Person Implements IEnumerable(Of Person) ' Inherits from IEnumerable Private ReadOnly relationships As List(Of Person) Public Sub New(name As String) relationships = New List(Of Person) End Sub Public Sub Add(relationName As String) relationships.Add(New Person(relationName)) End Sub Public Iterator Function GetEnumerator() As IEnumerator(Of Person) _ Implements IEnumerable(Of Person).GetEnumerator For Each relation In relationships Yield relation Next End Function Private Function IEnumerable_GetEnumerator() As IEnumerator _ Implements IEnumerable.GetEnumerator Return GetEnumerator() End Function End Class ' Usage Dim somePerson As New Person("name") From { "FriendName", "CoWorkerName" '... }
Если мы хотим добавить объект Person в
List(Of Person)
, просто поместив его в инициализатор коллекции (но мы не можем изменить класс List (Of Person)), мы можем использовать метод расширения' Inside a Module <Runtime.CompilerServices.Extension> Sub Add(target As List(Of Person), name As String) target.Add(New Person(name)) End Sub ' Usage Dim people As New List(Of Person) From { "Name1", ' no need to create Person object here "Name2" }