Vb.net 使用另一个类的属性访问一个类将返回空值
我正在制作一个应用程序,从通过串行电缆连接到我的计算机的仪表中读取数值。当我按下一个按钮时,我会向仪表发送一个命令,几毫秒后,仪表会回复我的答案。 我将这些值保存到具有init属性的类中,以便可以从任何地方访问这些值 因此,我的问题是,当我试图取回这些值时,它返回一个“nothing value”,这可能是因为我的初始化中有一个“New”像这样“Dim clsSavedValues As New clsSavedValues”,因此,当我试图从属性类中获取值时,我创建了一个新实例,如果我没有弄错的话,该实例是空的 我将在下面发布代码,但以下是代码的流程: 我有三节课。MainClass、ProtocolClass、PropertieClass。 我从main调用ProtocolClass中的一个方法,该方法向meter发送一个命令。几毫秒后,我在ProtocolClass内部收到一个回调,该方法称为“私有Sub-SerialPort_DataReceived”(ByVal sender作为对象,ByVal e作为System.IO.Ports.SerialDataReceivedEventArgs),它处理SerialPort.DataReceived,并将返回值保存到PropertiesClass。 DataReceived方法完成后,我返回main类并调用另一个方法,从我刚刚保存的PropertiesClass中获取值,但返回null。我知道它们被正确保存,因为如果我从ProtocolClass中调用它们,我可以访问它们。但它们在MainClass中为空 这是我的密码: MainClassVb.net 使用另一个类的属性访问一个类将返回空值,vb.net,Vb.net,我正在制作一个应用程序,从通过串行电缆连接到我的计算机的仪表中读取数值。当我按下一个按钮时,我会向仪表发送一个命令,几毫秒后,仪表会回复我的答案。 我将这些值保存到具有init属性的类中,以便可以从任何地方访问这些值 因此,我的问题是,当我试图取回这些值时,它返回一个“nothing value”,这可能是因为我的初始化中有一个“New”像这样“Dim clsSavedValues As New clsSavedValues”,因此,当我试图从属性类中获取值时,我创建了一个新实例,如果我没有弄错
'Here i call the ProtocolClass
Private Sub btnGetLastTransaction_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetLastTransaction.Click
clsProtocol.GetLastTransaction(1, Integer.Parse(tbxTransactionPosition.Text))
End Sub
'Here i try to read the valies from PropertiesClass
Public Sub RetrieveMeterSerialNumber()
Dim clsSavedValues As New clsSavedValues
lblMeterSerialNumber.Text = clsSavedValues.SaveMeterSerialNumber
End Sub
Public Sub GetLastTransaction(ByVal destinationAddress As String, ByVal transactionNum As Integer)
clsSavedValues = New clsSavedValues 'Creating Instance of the properties class
Try
Dim v_bodyOfMessage As [Byte]() = {ASCIItoHEX("G"), _
ASCIItoHEX("r")}
Dim v_bytearray As [Byte]() = ConstructCommand(v_bodyOfMessage)
SendCommand(v_bytearray)
Catch ex As Exception
Console.WriteLine("Meter serial number button click exception: {0}", ex)
End Try
End Sub
Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
If comOpen Then
Try
ReDim rx(rxPacketSize)
Console.WriteLine("RESPONSE")
For i = 0 To rxPacketSize - 1
readByte = SerialPort.ReadByte.ToString
Console.WriteLine(i.ToString & ": " & Conversion.Int(readByte).ToString)
rx(i) = Conversion.Int(readByte).ToString
If i <> 0 Then
If Convert.ToByte(rx(i)) = vDelimeterFlag(0) Then Exit For
End If
Next
DecodeResponse()
Catch ex As Exception
MsgBox("SerialPort_DataReceived Exception: " & ex.Message)
End Try
End If
End Sub
Private Sub GetMeterSerialNumber()
Dim i_startPosition As Integer = 5
Dim meterSerialNumber As String = GetRemainingPortionOfString(i_startPosition)
clsSavedValues.SaveMeterSerialNumber = meterSerialNumber
frmExplorer.RetrieveMeterSerialNumber() 'This is the call to the main class
End Sub
Public Property SaveMeterSerialNumber() As String
Get
Return _MeterSerialNumber
End Get
Set(ByVal meterSerialNumber As String)
_MeterSerialNumber = meterSerialNumber
End Set
End Property
协议类
'Here i call the ProtocolClass
Private Sub btnGetLastTransaction_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetLastTransaction.Click
clsProtocol.GetLastTransaction(1, Integer.Parse(tbxTransactionPosition.Text))
End Sub
'Here i try to read the valies from PropertiesClass
Public Sub RetrieveMeterSerialNumber()
Dim clsSavedValues As New clsSavedValues
lblMeterSerialNumber.Text = clsSavedValues.SaveMeterSerialNumber
End Sub
Public Sub GetLastTransaction(ByVal destinationAddress As String, ByVal transactionNum As Integer)
clsSavedValues = New clsSavedValues 'Creating Instance of the properties class
Try
Dim v_bodyOfMessage As [Byte]() = {ASCIItoHEX("G"), _
ASCIItoHEX("r")}
Dim v_bytearray As [Byte]() = ConstructCommand(v_bodyOfMessage)
SendCommand(v_bytearray)
Catch ex As Exception
Console.WriteLine("Meter serial number button click exception: {0}", ex)
End Try
End Sub
Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
If comOpen Then
Try
ReDim rx(rxPacketSize)
Console.WriteLine("RESPONSE")
For i = 0 To rxPacketSize - 1
readByte = SerialPort.ReadByte.ToString
Console.WriteLine(i.ToString & ": " & Conversion.Int(readByte).ToString)
rx(i) = Conversion.Int(readByte).ToString
If i <> 0 Then
If Convert.ToByte(rx(i)) = vDelimeterFlag(0) Then Exit For
End If
Next
DecodeResponse()
Catch ex As Exception
MsgBox("SerialPort_DataReceived Exception: " & ex.Message)
End Try
End If
End Sub
Private Sub GetMeterSerialNumber()
Dim i_startPosition As Integer = 5
Dim meterSerialNumber As String = GetRemainingPortionOfString(i_startPosition)
clsSavedValues.SaveMeterSerialNumber = meterSerialNumber
frmExplorer.RetrieveMeterSerialNumber() 'This is the call to the main class
End Sub
Public Property SaveMeterSerialNumber() As String
Get
Return _MeterSerialNumber
End Get
Set(ByVal meterSerialNumber As String)
_MeterSerialNumber = meterSerialNumber
End Set
End Property
我想从PropertiesClass中获取这些值,因为我会从仪表中获得超过wan的响应,这会导致线程问题,我无法跟踪它们。所以我把这些值保存在一个类中,然后我想从那个类中访问它们。
很抱歉写了这么长的文章,请询问我任何需要澄清的问题。SerialPort_DataReceived()和主类RetrieveMeterSerialNumber()中的clsSavedValues是两个不同的对象(具有相同的变量名,但每个“new”都创建了一个新的clsSavedValues实例)也许您应该将clsSavedValues变量作为参数从协议传递到Main 主要内容:
Public Sub RetrieveMeterSerialNumber(clsSavedValues As clsSavedValues )
lblMeterSerialNumber.Text = clsSavedValues.SaveMeterSerialNumber
End Sub
协议:
Private Sub GetMeterSerialNumber()
Dim i_startPosition As Integer = 5
Dim meterSerialNumber As String = GetRemainingPortionOfString(i_startPosition)
clsSavedValues.SaveMeterSerialNumber = meterSerialNumber
frmExplorer.RetrieveMeterSerialNumber(clsSavedValues) 'This is the call to the main class
End Sub
或者在PropertiesClass中使用静态属性如果只想为应用程序域(exe)存储一个值,则需要使用静态属性。在这种情况下没有必要做出“新的”,只需引用类propertyit就相当简单了。我没有想到这一点谢谢伊曼纽尔:)