【问题标题】:How can classes be passed by reference in .NET?如何在 .NET 中通过引用传递类?
【发布时间】:2015-08-28 15:42:48
【问题描述】:

众所周知,.NET 中的类是按引用传递的,而结构是按值传递的。

在不安全的代码中,你可以有指向结构的指针,但不能指向类,因为它们是由 GC 移动的。例如,当您有一个指向数组的指针时,您要么必须将其放入 fixed 语句(如果您在堆上分配)或 stackalloc(在堆栈上分配)。

话虽如此,如果类被 GC 移动,它们如何通过引用传递?

【问题讨论】:

  • @SamAxe 包括对象在内的所有参数都默认传值
  • @johnny5:错,是的。我在这方面的错误。我会调整的。
  • “类”是一种语言结构,除了源代码之外没有任何意义。一个类编译成一个类型。一个类型可以被实例化为一个对象,并被传递。

标签: c# .net pointers reference unsafe


【解决方案1】:

GC 移动了什么; GC 固定。由于 GC 必须find 对一个对象的所有引用(以查看它是否可以进行 GC),因此更改这些引用以指向新对象是一个额外的小步骤地址。

【讨论】:

    【解决方案2】:

    您可以将类类型实例视为句柄,那么对句柄的引用将只是一种方法调用的间接(一种指向句柄的指针)范围限制。由于对象本身隐藏在句柄后面,因此可以重新定位而不会产生任何可见的影响。

    【讨论】:

      猜你喜欢
      • 2016-02-29
      • 2013-01-08
      • 2017-01-05
      • 2013-05-02
      • 2017-12-04
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多