【问题标题】:Accesing a class with properties from another class returns null values访问具有来自另一个类的属性的类返回空值
【发布时间】:2016-01-21 10:43:49
【问题描述】:

我正在制作一个从通过串行电缆连接到我的计算机的仪表中读取值的应用程序。当我按下按钮时,我向仪表发送命令,几毫秒后,我得到仪表的回复,并给出了答案。 我将这些值保存到具有 init 属性的类中,以便我可以从任何地方访问这些值。

所以我的问题是,当我尝试取回值时,它返回一个“空值”,并且它可能来自初始化我有一个“New”这样的'Dim clsSavedValues As New clsSavedValues',所以当我尝试从该属性类中获取值时,我会创建一个新实例,如果没有记错,该实例为空。

我将在下面发布代码,但这里是代码的流程: 我有3节课。主类、协议类、属性类。 从 main 我调用 ProtocolClass 中的一个方法,该方法向仪表发送一个命令。几毫秒后,我在 ProtocolClass 中收到回调,并且此方法称为“Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived”和它将返回值保存到 PropertiesClass。 在 DataReceived 方法完成后,我返回 MainClass 并调用另一个方法从我刚刚保存的 PropertiesClass 中获取值,但它们返回 null。我知道它们已正确保存,因为如果我从 ProtocolClass 中调用它们,我可以访问它们。但它们在 MainClass 中为空。

这是我的代码: 主类

'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

PropertiesClass

Public Property SaveMeterSerialNumber() As String
    Get
        Return _MeterSerialNumber
    End Get
    Set(ByVal meterSerialNumber As String)
        _MeterSerialNumber = meterSerialNumber
    End Set
End Property

我想从 PropertiesClass 中获取值,因为我得到的不仅仅是来自仪表的 wan 响应,这会导致线程问题,我无法跟踪它们。所以我将值保存在一个类中,然后我想从该类中访问它们。 很抱歉发了这么长的帖子,有什么需要澄清的可以问我

【问题讨论】:

  • 如果您只想为应用程序域(exe)存储一个值,您需要使用静态属性。在这种情况下没有必要进行“新建”,只需参考类属性

标签: vb.net


【解决方案1】:

SerialPort_DataReceived() 和主类 RetrieveMeterSerialNumber() 中的 clsSavedValues 是两个不同的对象(具有相同的变量名称,但每个“新”创建一个新的 clsSavedValues 实例)也许您应该将 clsSavedValues var 从协议传递给 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 中使用静态属性

【讨论】:

  • 这很简单。我没想到,谢谢伊曼纽尔:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 2020-10-10
  • 2021-11-27
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多