【问题标题】:Why isn't my item in an array getting updated?为什么我的数组中的项目没有更新?
【发布时间】:2011-02-23 11:49:47
【问题描述】:

我有一个对象数组,我通过索引找到项目,分配一个值,但然后查看数组,项目没有显示更新的值。

Public Structure Cheque
    Public Id As String
    Public Status As Byte
    Public Amount As String
    Public WarrantNo As String
End Structure

Public Class ChequeCollection

    Private chequeColl() As Cheque 'This is populated ok

Public Sub UpdateChequeAmount(ByVal Id As String, ByVal Amount As String)
        SyncLock lockObject
            Dim idx As Integer = Get_idx(Id) 'Finds it ok
            If idx <> -1 Then
                Dim cheque As Cheque = chequeColl(idx)
                cheque.Amount = Amount 'Updates value ok but if you look in chequeColl the value isn't there
            End If
        End SyncLock
    End Sub

End Class

【问题讨论】:

  • 您有什么理由将Cheque 设为Structure 而不是Class

标签: .net vb.net arrays .net-2.0


【解决方案1】:

因为值类型在使用它们的任何地方都被复制 - 您正在更新检查变量中值类型的副本,而不是数组中的副本。

您需要更新数组中的副本:

            Dim cheque As Cheque = chequeColl(idx)
            cheque.Amount = Amount 'Updates value ok but if you look in chequeColl the value isn't there
            chequeColl(idx) = cheque

当然,总是值得一读 Lippert 先生的 "The Truth About Value Types"

【讨论】:

  • 但是检查肯定是一个引用类型,所以它应该被反射回数组中。
  • @Jon - 如果您将其声明为Class 而不是Structure,它将是一个引用类型。在这种情况下,对特定检查的所有引用(包括检查变量和数组中的槽)都将引用相同的检查实例,因此更改当然是可见的。
  • 那么结构是否被认为是值类型?
  • @Jon - 是的。阅读 MSDN msdn.microsoft.com/en-us/library/k69kzbs1(v=vs.80).aspx 上有关 Structure 的所有内容(请参阅备注部分 - “结构语句定义了一个复合值类型......”
  • 你每天都会学到一些东西。谢谢。我现在已经把它变成了一门课
【解决方案2】:
Dim cheque As Cheque = chequeColl(idx)
cheque.Amount = Amount

与:

chequeColl(idx).Amount = Amount

那么它是如何工作的呢?

【讨论】:

  • 这行得通。哇!奇怪的是,如果我执行与上述相同的逻辑并读取它的值。所以设置值时似乎发生了一些奇怪的事情。
  • @Jon:当你改变一个可变值类型时,改变的东西是一个变量。这就是变量被称为“变量”的原因,因为它们各不相同。在第一个代码片段中,值被复制到局部变量,因此“Amount”的赋值会改变该变量。在第二个片段中, chequeColl(idx) 是变量;数组槽是变量。所以这就是变化的东西。这非常令人困惑;这就是为什么可变值类型是 .NET 中的“最坏做法”。如果您打算让事物具有单独的可变字段,请使其成为一个类。
猜你喜欢
  • 1970-01-01
  • 2018-07-03
  • 2017-04-15
  • 2022-11-26
  • 2017-11-13
  • 2023-01-12
  • 2017-05-23
  • 2019-02-08
  • 1970-01-01
相关资源
最近更新 更多