gpt4 book ai didi

c# - 分配给引用类型变量的指针/引用的隐藏值是多少?

转载 作者:行者123 更新时间:2023-11-30 15:55:43 26 4
gpt4 key购买 nike

int number = 1

number的值为1,因为它是值类型

分配给引用类型变量的指针的实际值是多少?

它是整数还是字符串?或者它是一些比特?如果你把它写出来会是什么样子?是否可以使用该值分配对变量的引用?

Question harrysQuestion = new Question();

harrysQuestion 只是对新问题的指针或引用。那么该指针的值是多少?如果我这样做,分配给另一个问题变量的值相同:

Question harrysQuestionAgain = harrysQuestion;

它是指向我计算机内存中某个位置的数字吗?它是幕后实际的 C# 值变量吗?

最佳答案

Is it a number that points to some position in my computers memory?

从概念上讲,引用和指针是分开但又相关的。实际上,它们实际上是可以互换的,区别在于 GC 知道如何遍历和修复引用(垃圾收集等),但不知道指针(关于如何修复 的工作原理是修改值,允许在堆栈上找到的引用 被廉价地解释为“固定”)。实际上,它们在所有实现中都如此接近(出于性能原因),您可以认为它们有点相同。

您实际上想要获取引用的“值”(而不是取消引用)的情况非常少,除非您先固定对象您需要非常小心地这样做,因为地址可能会改变(并且指针版本不会被更正)。随着即将到来的“管道”工作,对该用例的需求实际上增加,因此 Unsafe 实用程序类型的 corefxlab/myget 版本实际上提供了一些方法来促进交换引用/指针(包括内部指针/对对象的引用),但是:除非你正在做一些低级别的事情,否则你可能永远不需要它。


每个请求(评论):我提到了“固定”和“固定”——这里的问题是 .NET 有一个“压缩”垃圾收集器,允许在运行时移动对象 ,只要它 promise 修复所有引用,确保您永远不会从托管代码中注意到这一点。它 promise 的是修复指针。所以:如果您要将任何对象视为指针,您需要告诉运行时(尤其是:垃圾收集器)不要移动该对象 完全没有,或者至少直到你告诉它你已经完成了。这就是“固定”。有两种“固定”方式:

  • 对于长期引脚(通常是诸如 byte[] 缓冲区之类的东西,您要将其作为字段存储在对象中并作为指针传递给非托管代码),您可以采用针对对象的 GCHandle,该对象记录在 GC 知道要查看的全局结构中
  • 对于在堆栈上 的引用的短期引脚,fixed 关键字起到一些巫术作用,让 GC(始终查看每个堆栈)知道一个引用——因此对象被引用(那个地址的对象)——应该被认为是固定的,不需要不断地添加/删除到一个全局结构

作为一个可能有趣的旁注:“内部引用”和对值类型的引用是仅存在在堆栈上的概念 - 而不是字段可能最终在堆上(这意味着任何 classstruct 除了新的 ref struct 概念)。它们的工作方式与常规引用相同,但这些引用的目标是内容本身,而不是对象 header 的开头。也就是说

var fieldReference = ref this._someField;

SomeOtherMethod(ref this._someField);

SomeOtherMethod(ref someArray[index]);

在方法内部工作只要内部引用只在堆栈上(即没有async/yield/captured-variables/ETC); GC 乐于承担解析指向对象的内部指针的开销,但仅限于堆栈 - 以减少所涉及工作的总体规模。

关于c# - 分配给引用类型变量的指针/引用的隐藏值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48094431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com