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

时间:2015-07-21 04:48:47

标签: 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;
}

没有与上述相同的内容。你能用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;
}

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

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

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

2 个答案:

答案 0 :(得分:7)

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

这里有两个不同的概念:
引用类型,其中&#34;引用&#34;是一个,它引用一个类实例,和 通过引用传递,其中&#34;引用&#34; 某事是指一个变量。

&#34;参考&#34;在两种情况下意味着略有不同的东西,将它们分开是很重要的 IIRC,Skeet很好地解释了变量,名称,值和参考&#34;的不同含义之间的区别。

(如果你把一个变量描绘成一个可以放东西的盒子,把参考文献作为一个字符串片段,第一个&#34;参考&#34;是一个字符串绑在一个东西上,第二个&#34; ; reference&#34;是一个绑在盒子上的字符串。)

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

答案 1 :(得分:2)

如果我理解你的问题,你很难知道它是引用还是值类型。

简单的做法是知道你在使用一个调用或结构。

所有类都是引用类型,所有结构都是值类型。 甚至int也是struct

    public struct Int32

以同样的方式bool也是

    public struct Boolean 

要了解课程的详细信息,您必须在关键字上按'f12'。