阅读Jon Skeet关于参考与价值观的章节.仍然困惑

use*_*106 7 c# c++ optimization reference

我阅读了Skeet的书的第2.3.2节,根据我的理解,C#中没有真正的引用,就像在C++中一样.

值得注意的是,不仅神话中的"引用"位被破坏,而且"对象被传递"位也是如此.对象本身永远不会通过引用或值传递.当涉及引用类型时,要么通过引用传递变量,要么通过值传递参数(引用)的值.

请注意,这与C++不同(我来自C++背景),因为在C++中,您可以使用&符号直接使用参数列表中的对象 - 没有任何副本,甚至不是对象的内存地址的副本:

bool isEven ( int & i ) { return i % 2 == 0 } )

int main ()
{
    int x = 5; 
    std::cout << isEven(x); // is the exact same as if I had written 
                            // std::cout (x % 2 == 0)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有与上述相同的内容.你能用C#获得的最好成绩相当于

bool isEven ( int * i ) { return *i % 2 == 0 } )

int main ()
{
    int x = 5; 
    std::cout << isEven(&x); // is like 
                             // int * temp = &x;
                             // return *temp % 2 == 0;
                             // (garbage collect temp)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它传递的是一种引用(一个指针)的值,当然在我的例子中是没有意义的,因为传入的所有内容都是一个小的原语(int).

根据我的理解,没有C#语法明确地将元素指定为引用,而不是&在我的C++示例中.您知道自己是在处理值还是引用的唯一方法是记住复制时引用的元素类型以及值的类型.就像这方面的JavaScript一样.

请批评我对这个概念的理解.

mol*_*ilo 7

在C#中,所有类都是引用类型,而其他所有类(我认为)都不是.

这里有两个不同的概念:
引用类型,其中"参考"是一个是指一个类的实例,并
通过引用传递,其中的"参考"是什么这是指一个变量.

"引用"一词在两种情况下意味着略有不同,将它们分开是很重要的.
IIRC,Skeet对变量,名称,值和"参考"的不同含义之间的差异有一个很好的解释.

(如果您将变量描绘为可放置内容的框,并将引用描述为字符串,则第一个"引用"是绑定到某个内容的字符串,第二个"引用"是绑定到框的字符串. )

(并且通过传递地址实现C++引用参数- 这是引用存储在别处的东西的最简单,最有效的方式.)