Я работаю в .NET уже некоторое время, но иногда я все еще путаюсь из-за несоответствия между платформой и моим предыдущим опытом работы в C ++.
В .NET все объекты являются типами значений или ссылочными типами. Типы ссылок размещаются в куче, а типы значений - в стеке (во всяком случае, в текущей реализации CLR). Я понимаю. Однако, по крайней мере, в VB.NET вы все еще можете определить конструктор для типа значения. Вы можете сделать это:
Public Structure Coordinates
Public x As Integer
Public y As Integer
Public z As Integer
Sub New(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer)
Me.x = x
Me.y = y
Me.z = z
End Sub
End Structure
Имея этот код, я могу написать Dim c As Coordinates
и затем получить доступ к членам c
сам, или я могу написать Dim c As New Coordinates(10, 20, 30)
. В чем разница между этими двумя подходами? Очевидно, что ключевое слово new
не выделяет объект в куче, так как это тип значения. Мне просто не ясно, являются ли конструкторы в типах значений просто удобством или они действительно делают что-то отличное от выполнения, как любой другой метод.
Возможно, чтобы прояснить мою точку зрения: я мог бы легко удалить определение для New
в приведенном выше коде, и все же я мог бы сделать это:
Dim c1 As Coordinates
Dim c2 As New Coordinates
Эти две строки делают что-то другое?
РЕДАКТИРОВАТЬ : Гуффа указал, что декларирование и конструирование не одно и то же. Следующий код демонстрирует это:
For i As Integer = 1 To 3
Dim c1 As Coordinates
Dim c2 As New Coordinates
c1.x += 1
c2.x += 1
Console.WriteLine("c1.x = {0}, c2.x = {1}", c1.x, c2.x)
Next
' output: '
' c1.x = 1, c2.x = 1 '
' c1.x = 2, c2.x = 1 '
' c1.x = 3, c2.x = 1 '
Итак, в сценарии, включающем итерацию, локальные переменные, представляющие типы значений, не перераспределяются в стеке ; они остаются на месте. Я взглянул на этот же сценарий, используя простые старые целые числа, и обнаружил то же поведение:
For i As Integer = 1 To 3
Dim x As Integer
Dim y As New Integer
x += 1
y += 1
Console.WriteLine("x = {0}, y = {1}", x, y)
Next
' output: '
' x = 1, y = 1 '
' x = 2, y = 1 '
' x = 3, y = 1 '