实例化和初始化仅在与按钮单击相关时才起作用吗?

时间:2011-09-30 15:47:35

标签: vb.net instantiation

初学者问题。我怎么能这样做:

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 个答案:

答案 0 :(得分:2)

这是因为实现需要在一个方法中,你拥有它的方式意味着代码不可能被执行,你将如何从其他地方引用这些代码?

然而,它不必与点击相关联:

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

会工作。

答案 1 :(得分:1)

我不会告诉你如何直接修复这些代码,而是要解释我认为你的思考过程出了什么问题,这样你也可以在以后更好地编写代码。

我在这里看到的是一个简单的误解,对于一个新的编程类如何工作的人。当您构建和定义一个类时,您还没有(还)在计算机中分配任何内存,而您还没有告诉计算机做任何事情。您所做的就是告诉计算机一个对象在未来某个时刻的外观。直到你真正创建该类的实例才会发生任何事情:

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

类只能包含几种特定类型的东西:字段,属性,代理(事件)和方法(子和函数)。课堂上的所有这些东西都是declarations的东西,而不是东西本身。

查看您的示例,第二个示例中的代码属于方法内部。

如果您希望每次使用类的新实例时都运行此代码,那么您可以使用一种称为constructor的特殊方法。这是这样宣布的:

Public Class MyClass
    Public MyField As String

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

然而,即使在最后一个例子之后,你仍然没有告诉计算机做任何工作。同样,您必须在该构造函数中的代码运行之前创建该类的实例

所有.Net程序中的所有代码都是如此。程序启动的方式是.Net框架创建一个特殊对象或表单的实例,然后调用(运行)该表单中的特定方法,以便为您的程序滚动。其他一切都来自那里。

最终,您还将了解共享项目和模块,它们可以(有点)破坏此规则,因为您在使用它之前不必创建对象的实例。但是在你习惯使用实例之前,你不应该太担心它。

最后,我想在您的代码中指出专业程序员认为糟糕的做法的两种做法。第一个是ArrayLists。我可以原谅这一点,因为我怀疑你正在学习一门尚未涵盖仿制药的课程。我只是提起它,所以你可以知道不要过于依赖它们:有更好的东西会来。第二个是你的“obj”前缀。这曾经被认为是一种很好的做法,但不再流行,现在被认为对代码的可读性有害。你不应该使用这些前缀。