Visual Studio 2013中无法从其他类获取Form1值的问题求助
解决Form1公共成员无法被其他类访问的问题
嘿,我看你在VS2013里碰到了其他类没法获取Form1公共字段值的问题,核心原因是你的SomeClass没有拿到Form1的实例引用,所以没法直接访问那些公共成员。我给你两种可行的解决方案,还有几个代码里的小坑要注意:
先提下代码里的小问题
- 变量名大小写不一致:你定义的是
SomeValue,但在Form1_Load里写的是Somevalue,虽然VB不区分大小写,但统一写法能避免混淆 - 类名和变量名冲突:你把
SomeClass的实例命名为MyClass,和类名(VB不区分大小写)重名了,这会导致歧义,建议把变量名改成mySomeClass这类不冲突的名字
方案一:实例化时传递Form1引用(推荐)
这种方式更符合面向对象的设计,把Form1的实例传给SomeClass,让它持有引用就能访问公共成员:
- 修改
SomeClass的定义,添加接收Form1实例的构造函数:
Public Class SomeClass Private _form1 As Form1 ' 构造函数,接收Form1的实例 Public Sub New(formInstance As Form1) _form1 = formInstance End Sub Public Sub mysub() ' 现在可以正常访问Form1的公共变量了 Dim hourFromForm As DateTime = _form1.MyHour Dim valueFromForm As String = _form1.SomeValue ' 这里可以写你的业务逻辑,比如弹窗显示值 MessageBox.Show($"从Form1拿到的时间:{hourFromForm},值:{valueFromForm}") End Sub End Class
- 更新Form1里的实例化代码:
Public Class Form1 Public MyHour As DateTime Public SomeValue As String Private mySomeClass As SomeClass ' 改个不冲突的变量名 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load MyHour = DateTime.Now() SomeValue = "asjdasd" ' 把当前Form1实例(Me)传给SomeClass的构造函数 mySomeClass = New SomeClass(Me) End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click mySomeClass.mysub() End Sub End Class
方案二:用静态实例全局访问(简单场景可用,不推荐复杂项目)
如果你的项目比较简单,不想传递实例,可以给Form1加个静态的自身引用,让其他类直接调用:
- 修改Form1的代码:
Public Class Form1 Public Shared CurrentForm As Form1 ' 静态实例引用 Public MyHour As DateTime Public SomeValue As String Private mySomeClass As SomeClass Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load CurrentForm = Me ' 初始化静态实例 MyHour = DateTime.Now() SomeValue = "asjdasd" mySomeClass = New SomeClass() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click mySomeClass.mysub() End Sub End Class
- 修改SomeClass的mysub方法:
Public Class SomeClass Public Sub mysub() ' 通过静态引用直接访问Form1的公共成员 Dim hour As DateTime = Form1.CurrentForm.MyHour Dim value As String = Form1.CurrentForm.SomeValue MessageBox.Show($"时间:{hour},值:{value}") End Sub End Class
小提醒
- 优先用方案一,因为全局静态实例容易导致内存泄漏,而且在多窗体场景下会出问题
- 尽量不要把字段设为Public,更好的做法是用属性(
Public Property MyHour As DateTime)来封装,更安全可控
内容的提问来源于stack exchange,提问作者Jose David
相关产品推荐
相关产品推荐

