VB.Net表单中的非共享方法被引用,好像它们是共享的?

3

我目前负责支持VB.Net应用程序,尽管我主要是C#开发人员。我遇到了我认为是“奇怪”的代码,很明显从我的C#思维方式来看,这段代码是错误的,不应该编译,但它确实编译了。我在特定窗体上执行了“查找所有引用”操作,以查看其在哪里被使用,并发现对该类的非共享方法进行了直接引用,而没有实例化该类。换句话说,我看到了类似这样的代码:

FrmCareer.ShowDialog(careerId)
FrmCareer = Nothing

现在ShowDialog不是一个共享成员,并且引用实例成员变量,所以我不会期望Intellisense列出ShowDialog方法。但它确实列出了并且编译通过。有人能解释这里发生了什么吗?

2个回答

6

VB.NET有一个非常好的功能,就是将所有窗体作为属性保存在My.Forms对象下。当您首次访问它们时,这些对象会被实例化。通过这种方式,您可以获得每个窗体的默认实例,并对其进行引用。

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

换句话说,您应用程序中任何窗体的类名都兼作该窗体的全局实例。


谢谢你的解释,Konrad。所以我看到的代码中,前任开发人员将全局引用设置为“Nothing”可能是错误的,下一次访问全局引用时可能会导致空异常? - BruceHill
3
@BruceHill 啊,我忘了提到这一点。每次尝试访问表单时,表单都会自动重新实例化。将它们设置为“Nothing”有点奇怪,但应该有效。这回溯到VB6的做法——第一个VB.NET版本没有这个功能,而VB6开发人员在呼吁将其包括在内。我不会评论我对总体设计的看法,只能说你不应该在服用药物的情况下设计框架...... - Konrad Rudolph
哈哈,我非常同意! :) 我觉得这个功能会在表单和其他引用类之间引入不一致性。但至少现在我明白了!感谢详细的解释。 - BruceHill

1

FrmCareer是表单的名称吗?如果是,那么每个表单都有一种类似于“单例”变量的魔法变量,您可以像这样访问它。开发人员可能只想要一个FrmCareer,所以任何代码都可以像这样访问它(在这种情况下显示表单)。用C#的术语来说,它就像是一个全局静态变量。

啊,是的,请参见this question - 它有更好的解释。


谢谢,Rob。那个链接解释得很清楚。:) 但是现在我明白了,我会把全局引用去掉,并用表单类的实际实例化来替换它们!;) 感谢您的帮助。 - BruceHill

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