【问题标题】:Structs in collections集合中的结构
【发布时间】:2011-10-28 11:56:23
【问题描述】:

我想在一个集合中存储对一堆结构的引用。一般的脚手架是这样的:

Structure myStructType
  Dim prop1 as String
  Dim prop2 as int
End Structure


Dim myList as new List(Of myStructType)()

'Wrongness below
Dim myStruct as new myStructType()
myStruct.prop1 = "struct1"
myStruct.prop2 = 1
myList.Add(myStruct)

myStruct = new myStructType()
mystruct.prop1 = "number two"
mystruct.prop2 = 2
myList.Add(myStruct)

现在这不起作用,因为它引用了相同的内存。我真正想要的是也用于引用类型的“按值传递引用”行为,以便我可以轻松地继续生成更多引用类型。

除了将结构变成类之外,还有什么方法可以解决这个问题?这实际上是使用结构的正确方法,还是我完全错了?

【问题讨论】:

  • 代码运行良好,myStructType 是一个值类型。该列表存储结构的副本。试试看。
  • @Hans,谢谢。因此,如果我对您的理解正确,当我传递一个持有值类型的变量时,我实际上是在传递该变量所持有的值的副本?似乎有道理。

标签: vb.net pass-by-reference structure pass-by-value


【解决方案1】:

无论是结构体还是类,这段代码的作用都是一样的,因为您正在为每个对象调用new myStructType()。话虽如此,请注意,稍后检索和修改这些 myStructType 对象的行为会有所不同。如果它是从结构派生的,那么您将在检索时复制数据,而将原始数据保留在列表中。如果它是从一个类派生的,那么您将获得对该对象的引用,并且使用该引用所做的更改会更改列表中的实例。

我仍然想知道您试图通过使用结构而不是类来完成(或避免)什么?

【讨论】:

  • 只有3位数据,没有任何操作。这样的结构就是它本来的样子。
  • 但是您认为结构相对于类有什么优势?我想你会发现没有。如果您打算稍后修改成员,那么您绝对应该使用一个类。
  • 对于我的用例,只是因为它们更轻。但也因为它们非常小,如果它们具有相等的值,我认为它们是相等的(不是我打算使用它),并且它们在初始化后不会改变。
  • 请注意,传递一个结构(每个赋值或用作参数)会复制结构的整个大小。因此,如果您的结构有三个 4 字节字段(例如整数或字符串引用),那么您每次复制 12 个字节。在同一场景中,类中的相同数据只会复制 4 字节引用。效率更高。
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 2010-09-23
  • 2012-01-17
  • 1970-01-01
相关资源
最近更新 更多