【问题标题】:Reference to a non-shared member requires an object reference in VB.net对非共享成员的引用需要 VB.net 中的对象引用
【发布时间】:2015-08-01 01:37:02
【问题描述】:

我有一个从别人那里得到的 VB.net 程序。它由一个主窗体和 6 个其他模块(所有 .vb 文件)组成。在资源管理器窗格中,这些文件旁边都有一个“VB”图标。我正在尝试从主窗体调用其中一个模块中的子例程。我的代码行是:

QuoteMgr.StartGettingQuotesLevel2(sSym)

其中 QuoteMgr 是模块的名称,StartGettingQuotesLevel2(sSym) 是子例程的名称。当我输入这个时,我收到错误消息:

Reference to a non-shared member requires an object reference.  

子程序在 QuoteMgr 模块中定义如下:

 Public Sub StartGettingQuotesLevel2(ByVal oSymbol As String)

奇怪的是当我进入时:

QuoteMgr.

(带句点的模块名称),它不会显示模块中的所有子例程和函数。它只显示:

Update_Level1
Update_Level12
Update_Level2

这些是模块中的公共常量。

你能告诉我我需要做什么吗?

【问题讨论】:

  • QuoteMgr 听起来像是一个类(不是模块),需要创建一个实例。打开文件并查看它。

标签: vb.net


【解决方案1】:

这意味着您尝试调用的例程需要引用表单的一个实例才能访问该例程。您可以像 Alex 所说的那样引用实例,也可以将例程设为“共享”,因此它不需要实例。为此,请将 QuoteMgr.vb 中的定义更改为

Friend Shared Sub StartGettingQuotesLevel2(ByVal oSymbol As String)

如果例程访问表单控件或模块级变量,将其切换到“共享”可能会开始显示编译器错误。这些将需要添加到参数列表中。

【讨论】:

  • 这篇文章也可能有帮助:msdn.microsoft.com/en-us/library/ms973875.aspx
  • 这是一个子程序而不是函数,所以我输入了 Friend Sub StartGettingQuotesLevel2。但错误仍然存​​在于主窗体中,行:QuoteMgr.StartGettingQuotesLevel2(sSym)
  • 感谢您的参考。看起来“公共”应该让任何人都可以使用它。
  • 抱歉,我误读了您的原帖。如果例程在Form(或Class)内,那么您将需要一个表单实例。或者声明例程Friend Shared(或Public Shared)。如果例程依赖于包含表单中的控件,您可能需要重新编写例程。
【解决方案2】:

编译器试图通过此错误消息告诉您什么

对非共享成员的引用需要对象引用

StartGettingQuotesLevel2 子例程是 instance method 不是 shared 或类方法,请参阅更详细的解释here

要调用实例方法,您需要有一个对象实例来调用它。在您的情况下,类类型 QuoteMgr 的对象实例。如下例所示:

' create a new QuoteMgr object instance
Dim myQuoteMgr As QuoteMgr = New QuoteMgr()

' call its instance method with "abc" as its oSymbol argument.
myQuoteMgr.StartGettingQuotesLevel2("abc")

您可能只希望主窗体创建和使用一个QuoteMgr 对象实例。在这种情况下,您可以将其设为主表单的成员变量并创建一次。

Public Partial Class MainForm

    ' Create it as a private member variable of the main form
    Private m_QuoteMgr As QuoteMgr = New QuoteMgr()

    ' Use it when "some" button is pressed
    Private Sub btnSome_Click(sender As Object, e As EventArgs) Handles btnSome.Click
        m_QuoteMgr.StartGettingQuotesLevel2(txtSymbol.Text)
        ' And possibly do something with the results.
    End Sub        

End Class

此外,如果您的 QuoteMgr 类的实例依赖于其他对象实例来完成它们的任务,您必须将这些实例作为 提供给 QuoteMgr 类的 constructor 方法其构造函数的方法参数的参数。构造函数 (Sub New(...)) 如下所示:

Public Class QuoteMgr

    ' This is a constructor that takes two arguments
    ' - oMainSymbol: a string value
    ' - oKernel: an instance of the type Kernel
    Public Sub New(oMainSymbol As String, ByRef oKernel As Kernel)

        ' ....

    End Sub

End Class

也就是说,当你创建一个QuoteMgr 实例时,你必须使用它需要的东西来调用它的构造方法,例如

' There must be an instance of Kernel created somewhere. 
Dim myKernel As Kernel = ....

' create a new QuoteMgr object instance with these arguments:
' - oMainSymbol = "SYMABC"
' - oKernel = myKernel
Dim myQuoteMgr As QuoteMgr = New QuoteMgr("SYMABC", myKernel)

其他一些建议

  • 我提供的解释是关于基本的 VB.NET 语言功能(例如,以粗体突出显示的术语)。我建议您在对现有代码进行任何更改之前,(1) 对其进行备份,(2) 尝试阅读教程并练习一些较小的内容。
  • 编译器(实际上)总是正确的。当它给您一条错误消息时,请仔细阅读,它会指出错误所在的行以及一条消息,告诉您它需要什么或缺少什么。
  • Stack Overflow 的目的不是提供教程或代码。这是一个问答网站,其中最好的问题和答案涉及特定的、描述的编程问题,并且可以提供简洁的答案。

【讨论】:

  • 谢谢。我尝试输入“Dim myQuoteMgr As QuoteMgr = New QuoteMgr()”但收到错误消息:Argument not specified for parameter 'oKernel' of 'Public Sub New(oMainSymbol As String, ByRef oKernel As Kernel)'。
  • @AliceMeade - 这意味着您需要为oMainSymboloKernel 传递适当的值。
  • @AliceMeade 我添加了一些额外的解释和更一般的建议。对于这个问题,我能做的就这些了。
【解决方案3】:

右键单击您的应用程序并转到“属性”。 确保您的应用程序类型是“Windows 窗体应用程序”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2016-01-06
    • 2016-02-27
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多