VB.Net表单非共享方法是否像共享一样引用?

VB.Net表单非共享方法是否像共享一样引用?,vb.net,winforms,Vb.net,Winforms,虽然我主要是一名C#开发人员,但我在VB.Net应用程序上提供支持。我遇到了我认为是“奇怪”的代码,因为我的C思维模式告诉我代码是错误的,不应该编译,但它确实如此。我查找了一个特定表单上的所有引用,以查看它的使用位置,并找到了对该表单的引用,在该表单中,类的非分解方法被直接引用,而没有实例化该类。换句话说,我看到的代码如下: FrmCareer.ShowDialog(careerId) FrmCareer = Nothing 现在ShowDialog不是一个共享成员,它引用了实例成员变量,所以

虽然我主要是一名C#开发人员,但我在VB.Net应用程序上提供支持。我遇到了我认为是“奇怪”的代码,因为我的C思维模式告诉我代码是错误的,不应该编译,但它确实如此。我查找了一个特定表单上的所有引用,以查看它的使用位置,并找到了对该表单的引用,在该表单中,类的非分解方法被直接引用,而没有实例化该类。换句话说,我看到的代码如下:

FrmCareer.ShowDialog(careerId)
FrmCareer = Nothing

现在ShowDialog不是一个共享成员,它引用了实例成员变量,所以我不希望intellisense列出ShowDialog方法。但它确实如此,而且它是编译的。有人能解释一下这是怎么回事吗

表单的名称是
FrmCareer
吗?如果是这样的话,我认为对于您可以像这样访问的每个表单,都有一种神奇的“单例”变量。其想法是开发人员可能只需要一个
FrmCareer
,这样任何代码都可以像这样访问它(在本例中是为了显示表单)。用C#术语来说,这就像一个全局静态

啊,是的,请看-它有一个更好的解释。

VB.NET有一个(非常好的)特性,即将所有表单的集合作为对象下的属性保存。那里的对象在您第一次访问它们时被实例化。通过这种方式,您可以获得每个表单的默认实例

在不太好的方面,VB坚持全局导入
My.Forms
对象的属性,而您无法改变这一点


换句话说,应用程序中任何表单的类名都会作为该表单的全局实例加倍。

谢谢,Rob。这个链接很好地解释了这一点但现在我明白了,我将取出全局引用,并用表单类的实际实例化来替换它们!;)谢谢你的帮助,谢谢你的解释,康拉德。因此,我看到的前一位开发人员将全局引用设置为Nothing的代码可能是错误的,并且在下次访问全局引用时可能会导致空异常?@BruceHill啊,不,我忘了提到这一点。每次尝试访问表单时,表单都会自动重新实例化。将它们设置为
Nothing
有点奇怪,但应该可以工作。这让我们回想起VB6是如何做到的——第一个VB.NET版本没有这一功能,VB6开发人员极力要求将其包括在内。我不会评论我对总体设计的看法,除了说你不应该在药物的影响下设计框架……哈哈,我非常同意!)我觉得这个特性确实会在表单和引用的其他类之间引入不一致性。但至少我现在明白了!谢谢你的详细解释。