【问题标题】:VB.Net object list cleared unexpectedly after errorVB.Net 对象列表在出错后意外清除
【发布时间】:2013-08-21 09:30:41
【问题描述】:

这可能是我写这篇文章的一个相当基本的问题,但我需要一些帮助: 我有一个定义为具有两个字段的公共类的对象,都是字符串

Public Class mp
    Dim _fg As String
    Dim _scode As String

    Property fg As String
        Get
            Return _fg
        End Get
        Set(ByVal value As String)
            _fg = value
        End Set
    End Property
    Property scode As String
        Get
            Return _scode
        End Get
        Set(ByVal value As String)
            _scode = value
        End Set
    End PropertyEnd Class

然后我定义一个数组:

Dim mps As New List(Of mp)()

然后在一个循环中,我先清除后开始添加到列表中:

        Dim mpholder As New mp
        cmd.CommandText = 'Query here
        cmd.ExecuteNonQuery()
        reader = cmd.ExecuteReader

        mp.Clear()


        Try

            Do While reader.Read()
                    mpholder.fg = ""
                    mpholder.scode = ""

                    mpholder.fg = reader(0)
                    mpholder.scode = reader(1)

                    mps.Add(mpholder)
            Loop

        Catch ex As Exception
            MP_Res.Text = "error"
        End Try

如果我在某个阶段遇到错误并抓住了问题,则列表“mp”中的条目数量相同,但它们都是空的

【问题讨论】:

  • 如果您在开始添加之前尝试清除列表,则应该是 mps.Clear(),而不是 mp.Clear()。

标签: vb.net list class object


【解决方案1】:

您不断将相同的项目添加到列表中。

尝试移动线

Dim mpholder As New mp

在读取/添加循环中:

Do While reader.Read()
  Dim mpholder As New mp

  mpholder.fg = reader(0)
  mpholder.scode = reader(1)

  mps.Add(mpholder)
Loop

由于mp 被声明为class,这意味着它是一个引用类型,即mp 类型的变量不是对象本身,而只是对它们的引用。所以如果我这样做:

Dim mp1 As New mp
Dim mp2 = mp1

我不会有两个 mp 对象,我会有两个对单个 mp 对象的引用。如果我更改对象的一个​​属性,则该更改将通过每个引用可见。

mp1.fg = "Test" 
mp2.fg = "Test2";
Console.WriteLine(mp1.fg) ' "Test2"

【讨论】:

  • 谢谢,我认为这将是一些基本的东西。当我单步执行代码时, mps 似乎填充了正确的信息,并且在检查 Visual Studio 时,所有正确的数据都已到位,直到出现异常,这是预期的吗?顺便说一句,更改解决了这个问题。
【解决方案2】:

试试上面的。您只需要将对象创建到循环中。

    cmd.CommandText = 'Query here
    cmd.ExecuteNonQuery()
    reader = cmd.ExecuteReader




    Try

        Do While reader.Read()
                Dim mpholder As New mp


                mpholder.fg = reader(0)
                mpholder.scode = reader(1)

                mps.Add(mpholder)
        Loop

    Catch ex As Exception
        MP_Res.Text = "error"
    End Try

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2017-03-16
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    相关资源
    最近更新 更多