Работает ли инстанцирование и инициализация только при привязке к нажатию кнопки? - PullRequest
2 голосов
/ 30 сентября 2011

Вопрос новичка.Почему я могу это сделать:

Public Class Form1
    Private StudentsInMyRoom As New ArrayList

    Public Class student
        Public name As String
        Public courses As ArrayList
    End Class

    Private Sub btnCreateStudent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreateStudent.Click

        Dim objStudent As New student
        objStudent.name = "Ivan"
        objStudent.courses = New ArrayList
        StudentsInMyRoom.Add(objStudent)
    End Sub

End Class

Но я НЕ МОГУ это сделать:

Public Class Form1
    Private StudentsInMyRoom As New ArrayList

    Public Class student
        Public name As String
        Public courses As ArrayList
    End Class


    Dim objStudent As New student
    objStudent.name = "Ivan"
    objStudent.courses = New ArrayList
    StudentsInMyRoom.Add(objStudent)

End Class

Во втором примере все objStudent.etc подчеркнуто подчеркнуты и написано "объявление"Ожидается, "когда я наведусь на это.Это тот же код, но теперь он не привязан к нажатию кнопки.Не могу понять, в чем разница.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

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

Однако это не обязательно должно быть привязано к клику:

    Private Sub AnyNameYouLike
        Dim objStudent As New student
        objStudent.name = "Ivan"
        objStudent.courses = New ArrayList
        StudentsInMyRoom.Add(objStudent)
    End Sub

Будет работать.

1 голос
/ 30 сентября 2011

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

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

Public Class MyClass
    Public MyField As String
End Class

'Nothing has happened yet

Public myInstance As New MyClass() 

'Now finally we have something we can work with, 
' but we still haven't done anything

myInstance.MyField = "Hello World"

'It's only after this last line that we put a string into memory

Классы могут содержать только несколько определенных типов вещей: поля, свойства, делегаты (события),и Методы (Подставки и Функции).Все эти вещи в классе являются чем-то, а не самой вещью.

Глядя на ваши примеры, код из вашего второго примера принадлежит внутри метода.

Если вы хотите, чтобы этот код запускался каждый раз, когда вы работаете с новым экземпляром вашего класса, то есть специальный метод, называемый constructor, который вы можете использовать.Это объявляется так:

Public Class MyClass
    Public MyField As String

    'This is a constructor
    Public Sub New()
        MyField = "Hello World"
    End Sub
End Class

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

Это верно для всего кода во всех программах .Net в любом месте.Способ запуска вашей программы состоит в том, что .Net Framework создает экземпляр специального объекта или формы, а затем вызывает (запускает) конкретный метод в этой форме, чтобы как-то сдвинуть с мертвой точки вашу программу.Все остальное приходит оттуда.

В конце концов вы также узнаете об общих элементах и ​​модулях, которые могут (как бы) нарушить это правило, поскольку вам не нужно создавать экземпляр объекта перед его использованием.,Но до тех пор, пока вы не освоитесь с экземплярами, вам не следует об этом слишком беспокоиться.

Наконец, я хочу указать на две практики в вашем коде, которые профессиональные программисты сочли бы плохой практикой.Первый ArrayLists.Я могу простить это, потому что я подозреваю, что вы проходите курс обучения, который еще не охватывал дженерики.Я только поднимаю это, чтобы вы знали, чтобы не слишком привязываться к ним: впереди что-то лучшее.Второй - ваш префикс obj.Когда-то это считалось хорошей практикой, но уже не модно и теперь считается вредным для читабельности вашего кода.Вы не должны использовать эти префиксы.

...