【问题标题】:How can I force the Integer type to be used as a Reference type without wrapping?如何强制 Integer 类型用作引用类型而不进行包装?
【发布时间】:2019-05-27 15:16:20
【问题描述】:

我正在尝试通过引用将一个变量分配给另一个变量,因此更改一个变量的值会同时更改两个变量的值,如以下伪代码示例所示:

Dim x as Integer = 0
Dim y as Integer = x [byRef] 
x = 1
Debug.print("x = " & x)
Debug.print("y = " & y)
'should print x = 1, y = 1

当然,它会打印 x = 1, y = 0,因为默认情况下 Integer 是 Value 类型。所以问题是,如何通过引用强制将 y 分配给 x ?我知道 Object 是一种引用类型,所以我尝试了y = Cobj(x),但没有成功。我想在不包装的情况下做到这一点(很长一段时间要解释原因,但我不能在这里使用包装)。谁能给点建议好吗?

编辑:我忘了说我正在用 VB.NET 进行编码。

【问题讨论】:

  • 您应该为您使用的语言或环境添加标签,以吸引合适的人。
  • 我不能使用包装是什么意思?包装的目的是什么?装箱/拆箱不是包装吗?还有什么可以不包装?您不能使用具有单个字段/属性的类吗?
  • 澄清一下:通过包装,我的意思是在这个问题的答案中:link(声明数据类然后使用它)。
  • 如果您不能/不会使用引用类型,那么您可以使用指针(内存位置)。
  • 我该怎么做,吉米?在 C 语言中这似乎很容易,但是当我在 .NET 中搜索时,它似乎是一种非常规且记录不充分的方式。

标签: vb.net object types pass-by-reference reference-type


【解决方案1】:

您不能让整数类型在 vb 中保持引用。它将始终保存一个值,而不是对另一个对象的引用。但是,您可以通过引用函数或子例程来传递整数变量,以便函数或子例程可以修改该值。这是一个例子:

Sub Main()
    Dim x As Integer = 0

    PassByValue(x)
    Debug.Print("x = " & x) 'Prints x = 0

    PassByReference(x)
    Debug.Print("x = " & x) 'Prints x = 2
End Sub

Sub PassByValue(x As Integer)
    x = 2
End Sub

Sub PassByReference(ByRef x As Integer)
    x = 2
End Sub

【讨论】:

  • 所以如果写 Dim y = PassByReference(x),那么 y 将被引用到 x (意味着改变一个的值会改变两个的值),对吗?因为这就是我要在这里实现的目标。我需要让两个整数在同一个函数中引用同一事物,而不是两个不同的函数。
  • 不,你永远不能创建一个整数变量作为对 int 的引用。如果您需要同时引用同一事物,请使用相同的变量名两次。如果您可以发布一个示例说明为什么需要两个不同的名称来引用同一事物,这将允许某人展示一种解决问题的方法,但是没有办法使两个整数类型的变量引用完全相同的对象,并且两个变量一起更改(您可以使用自定义类,但不能使用整数类型)。
  • 对不起,如果我的回答不清楚,但我并不是要建议创建两个函数,只是演示 VB 如何处理传递给函数 ByVal 与 ByRef 的值之间的区别。通常,使用 ByRef 的原因是将值类型的变量传递给函数,并且能够直接在函数内修改变量。
  • 下面是我想要实现的更具体的示例:link。如您所见,我想将来自不同地方的一堆变量放入一个容器(列表,数组等)中,然后在各个周期中修改它们的值。我只想在班级顶部声明一次该列表。问题是,这些变量是按值而不是按引用添加到列表中的,因此您在我的文章中看到的这些子项不起作用。这就是为什么我试图找到一种通过引用分配这些变量的方法。我怎样才能做到这一点?
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2015-08-17
  • 1970-01-01
相关资源
最近更新 更多