在 VB.NET 中引用未实例化的对象

5

你好,我需要学习VB.net来适应新工作,之前一直使用C#。我刚刚发现了VB.net的一个有趣特性。我可以引用一个尚未实例化的第二个窗体上的对象!

因此,从Form1中,我可以获取以下方式在Form2上的textbox1的文本属性:

Dim txt As String = Form2.TextBox1.Text

有人能解释一下这是如何工作的吗?所有表格都会在程序开始时实例化,然后它们的可见性会���整个程序生命周期内进行切换吗?


1个回答

6
VB中的表单是一种特殊情况。编译器会在My命名空间的My.Forms对象中生成一个强类型表单列表。每个表单都作为属性My.Forms.TheNameOfTheForm暴露出来。这些属性总是返回有效的实例 - 也就是说,如果一个表单之前没有被实例化过,在您第一次使用该属性时它将被实例化。

到目前为止,一切都很好。

但微软还做了一个愚蠢的决定,即默认情况下从My.Forms对象导入属性,而且无论何时都是这样。您无法做任何事情。表面上,这是为了向后兼容VB6,但这是荒谬的,因为VB7(.NET 1.0)没有此功能,它是后来才出现的。

但只是为了澄清:

所有表单都在程序启动时实例化吗...?

不,幸运的是不是这样。它们在您第一次访问属性时被实例化。


+1。但是微软为了与VB6向后兼容性而添加了该功能。他们在第一个VB.Net中错过了它,但在接下来的几个版本中添加了更多功能以增加向后兼容性。 - MarkJ
值得注意的是,即使在将引用设置为“无”之后,当您引用属性时,表单也会自动重新实例化。 - MarkJ
这使得从VB6进行转换非常容易,但程序员需要额外小心,以免错误地使用此功能。 - Robert Beaubien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接