请澄清我对对象和参考的理解,价值类型是最新的?

时间:2010-02-23 17:17:02

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

请澄清我对对象和参考的理解,值类型是最新的吗?

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

参考表示内存中的位置(地址)。

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

按值传递意味着我们没有给出任何我们给函数赋予实际值的地址。这个值来自RAM?在执行时它不接触ram吗?它只来自另一个内存位置..但是在视觉上下文中执行的术语有什么不同?我怎么能想象?

2 个答案:

答案 0 :(得分:3)

我不担心RAM /等。

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

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

当您通过值传递时,您正在复制实际变量的值,并且该方法按值获取前一个调用堆栈中使用的变量的完整副本。

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

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

答案 1 :(得分:1)

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

相比之下,structValue Type,可直接处理。

传递项目By Referenceref关键字或out关键字作为Reed指出)将引用(指针)传递给相关项目。这意味着如果您通过引用传递object,则表示您正在向指向内存中对象的指针传递指针。

对象

    arg(stack) -> oRef(heap) -> oData(heap)

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

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

    arg(stack) -> oData(heap)