Обычно, чтобы использовать какой-нибудь класс, мы должны создать его объект. Однако если данный класс имеет статические или разделяемые методы, то чтобы получить к ним доступ, мы не обязательно должны использовать объекты. Например, создадим новый класс Algorithm и добавим в него две функции для вычисления числа Фибоначчи и факториала:
Public Class Algorithm
Public Shared pi As Double = 3.14
Public Shared Function Factorial(x As Integer) As Integer
If (x = 1) Then
Return 1
Else
Return x * Factorial(x - 1)
End If
End Function
Public Shared Function Fibbonachi(x As Integer) As Integer
If x = 0 Then
Return 1
ElseIf x = 1 Then
Return 1
Else
Return Fibbonachi(x - 1) + Fibbonachi(x - 2)
End If
End Function
End Class
Обратите внимание на модификатор Shared, он указывает, что данные члены будут доступны для всего класса, то есть будут общими. В этом случае мы их можем использовать следующим образом:
Sub Main()
Dim num1 As Integer = Algorithm.Factorial(5)
Dim num2 As Integer = Algorithm.Fibbonachi(5)
Algorithm.pi = 3.14159
Console.WriteLine("Более точное значение числа PI = {0}", Algorithm.pi)
End Sub
В данном случае нам не надо создавать экземпляр или объект класса, мы можем обратиться к общему члену напрямую, указав только имя класса.
Мы можем объявлять в классах также и статические конструкторы:
Public Class State
Shared Sub New()
Console.WriteLine("Создано первое государство")
End Sub
End Class
Статические конструкторы выполняются при самом первом создании объекта данного класса:
Sub Main()
'В этом месте выполняется обычный и статический конструктор,
' Так как это первое создание объекта State в программе
Dim s1 As State = New State()
'В этом месте выполняется обычный конструктор
Dim s2 As State = New State()
End Sub
Чтобы понять смысл модификатора Static, сначала посмотрим на примере, в котором целесообразно его использование. Итак, у нас определен цикл:
For i As Integer = 0 To 4
Dim temp As Integer = 4
Console.WriteLine(temp)
temp += 1
Next
В этом цикле у нас определена переменная temp, которая после вывода на экран ее значения увеличивается на единицу. Однако
при каждом новом проходе цикла эта переменная создается заново, и ее значение при выводе на экран всегда будет равно 4. Однако если
мы заменим Dim на Static, то значение переменной при каждом новом проходе будет сохраняться, и при выводе на экран мы увидим, что ее значение увеличивается:
For i As Integer = 0 To 4
Static temp As Integer = 4
Console.WriteLine(temp)
temp += 1
Next
Посмотрим на другом примере. Создадим метод со статической переменной, которая будет увеличиваться на единицу и отображаться на экране. И затем дважды вызовем этот метод:
Private Sub Display()
Static i As Integer = 6
i += 1
Console.WriteLine(i)
End Sub
Sub Main()
Display()
Display()
End Sub
Мы увидим, что несмотря на то, что вызов метода был завершен, значение переменной сохранилось, а при следующем вызове оно равно не 6, а 7. Тогда как если бы мы заменили слово Static на Dim, переменная после работы метода уничтожалась, а при следующем вызове метода создавалась бы вновь. В тоже время вместо переменной Static, мы можем использовать глобальную переменную на уровне класса или модуля.
И Static, и Shared могут использоваться в качестве модификаторов переменных. Однако отличие между ними состоит в том, что с помощью Static определяются переменные внутри методов, а с помощью Shared - переменные на уровне классов и модулей.