.net 请澄清我对对象和参考的理解,以及当前的值类型?

.net 请澄清我对对象和参考的理解,以及当前的值类型?,.net,memory-management,clr,pass-by-reference,.net,Memory Management,Clr,Pass By Reference,请澄清我对对象和参考的理解,以及当前的值类型 对象是指RAM中的一个内存位置,我们在执行程序时在其中分配内存 参考是指存储器中的一个位置(地址) 通过引用传递意味着——我们正在向函数传递或指向一个内存位置,以获取从中传递内存地址的函数的值 按值传递意味着我们没有给出任何地址,而是给函数提供了实际值。这个值从哪里来?它在执行时是否不接触ram?它只从另一个内存位置提交..但在视觉上下文中执行的区别是什么?我怎么能想象呢?我不会担心RAM/等等 从概念上讲,这里的主要区别在于传递给方法的内容 当您通

请澄清我对对象和参考的理解,以及当前的值类型

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

参考是指存储器中的一个位置(地址)

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


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

我不会担心RAM/等等

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

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

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

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


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

对象是对象的实例。对象和所有成员的内存都存储在堆上。通常,这称为[
引用类型][2]
,这意味着它被当作指向某个位置的引用(指针)处理

相比之下,a是直接处理的

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

反对

arg(stack) -> oRef(heap) -> oData(heap) arg(堆栈)->oRef(堆)->oData(堆) 这意味着我们可以将指针更改为另一个位置(即完全不同的对象)

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

arg(stack) -> oData(heap) arg(堆栈)->oData(堆)
看看这些是否有帮助:我应该通过Jeffrey Richter的c#book购买CLR。我不会担心RAM/等等。-------------->但我需要知道在RAM中发生了什么,当我以两种方式做这件事时:-)你告诉我的其他事情我已经知道了!我个人会在第三和第四段中使用“值”(或“参数”)而不是“对象”。我发现将“对象”作为类(或其他值类型)实例的实际数据所在的内存部分进行讨论是很有用的。@SmartestVEGA:这都是关于复制的内容。如果你通读我写的东西,你会看到内存被复制到哪里。当您使用CLR时,很难/不可能知道您当前的代码是否将使用RAM、本地缓存等。。。但是你可以知道什么时候内存被复制,这才是真正重要的。记忆存储位置的细节实际上被抽象掉了。。。