【问题标题】:Please clarify my understanding regarding object and reference and value type is current?请澄清我对对象和引用的理解,并且值类型是最新的?
【发布时间】:2011-01-20 04:22:42
【问题描述】:

请澄清我对对象和引用的理解以及值类型是最新的吗?

对象是指RAM中的内存位置,我们在执行程序时分配内存

引用表示内存中的位置(地址)。

通过引用传递意味着 - 我们将一个内存位置传递或指向函数以获取传递内存地址的函数的值。

按值传递意味着我们没有给出任何地址,而是为函数提供了实际值。这个值从 RAM 哪里来?执行时它不接触ram吗?它仅来自另一个内存位置..但是在视觉上下文中的执行方面有什么区别?我怎么能想象?

【问题讨论】:

标签: .net memory-management clr pass-by-reference


【解决方案1】:

我不会担心 RAM/等。

从概念上讲,这里的主要区别在于您传递给方法的内容。

当您通过引用(C# 中的 ref 或 out)传递时,您传递的是原始对象在内存中的位置。

当您按值传递时,您正在复制实际变量的值,并且该方法会按值接收上一个调用堆栈中使用的变量的完整副本。

如果变量是引用类型,则传递的值是对对象的引用,该对象基本上是一个内存位置。引用被复制到方法中。

如果所讨论的对象是值类型,则复制整个对象,并且该方法接收该对象的副本。

【讨论】:

  • 我不会担心 RAM/等。 ----------> 但我需要知道当以两种方式执行此操作时 RAM 中发生了什么:-) 你告诉的其他事情我已经知道了!
  • 我个人会在第 3 和第 4 段中使用“值”(或“参数”)而不是“对象”。我发现将“对象”作为类(或其他值类型)实例的实际数据所在的内存部分来讨论是很有用的。
  • @SmartestVEGA:一切都与被复制的内容有关。如果你通读我写的内容,你会看到内存被复制到哪里。当您使用 CLR 时,很难/不可能知道您当前的代码是否将在 RAM、本地缓存等上运行……但是您可以知道何时复制内存,这就是真的很重要。该内存存储位置的详细信息确实被抽象掉了......
【解决方案2】:

objectclass 的一个实例。对象的内存和任何成员都存储在堆上。通常,这称为 [Reference Type][2],这意味着它被处理为对某个位置的引用(指针)。

相比之下,struct 是直接处理的Value Type

传递一个项目By Referenceref 关键字,或 Reed 指出的 out 关键字)传递一个指向相关项目的引用(指针)。这意味着,如果您通过引用传递 object,则您传递的是指向内存中对象的指针。

对象

arg(堆栈)-> oRef(堆)-> oData(堆)

这意味着我们可以将指针更改为另一个位置(即完全不同的对象)。

按值传递项目意味着传递有问题的项目本身。在结构的情况下,整个事物都在堆栈上传递。在对象的情况下,引用在堆栈上传递。这意味着当一个对象被传递时,该对象仍然可以被操作并且它的成员被修改,但是它不能被另一个对象完全替换。

arg(堆栈)-> oData(堆)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2013-12-17
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多