初学者问题。我怎么能这样做:
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都会下划线并且会显示“声明预期”。它是相同的代码,但现在它不依赖于单击按钮。无法弄清楚有什么区别。
答案 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”前缀。这曾经被认为是一种很好的做法,但不再流行,现在被认为对代码的可读性有害。你不应该使用这些前缀。