什么是价值等级,什么是C#中的参考类?

时间:2009-11-02 01:06:45

标签: c# .net oop terminology

C#中value classreference class的定义是什么?

这与value typereference type

有何不同?

我问这个问题是因为我在MCTS Self-Paced Training Kit(考试70-536)中读到了这个问题。第1章,第1课,课程回顾4:

  

你需要创建一个简单的类或   仅包含值的结构   类型。您必须创建类或   结构,使其运行   尽可能高效。你一定是   能够将类或结构传递给   一个程序,无需担心   程序会修改它。哪一个   您应该创建以下内容吗?

     

参考类

     

B参考结构

     

C值类

     

D值结构

     

正确答案:D

     

不正确:你可以创建一个   参考类;然而,它可能是   传递给程序时修改。

     

B不正确:您无法创建   参考结构。

     

C不正确:您可以创建一个值   类;然而,结构倾向于   效率更高。

     

D正确:价值结构是   通常效率最高。

7 个答案:

答案 0 :(得分:3)

请参阅有关该主题的the overview,但请严格按照msnd链接阅读完整的Common Type system章节。 (您也可以在第一个问题的评论中提问)

答案 1 :(得分:2)

值类型按值传递,而引用类型按引用传递。

编辑:值/参考类
在C#中没有“值类”或“引用类”的概念,因此要求它的定义是没有意义的。

答案 2 :(得分:2)

您可能正在考虑C ++ / CLI,它与C#不同,允许用户声明“值类”或“ref类”。 在C#中,您声明的任何类都将隐式地成为引用类 - 只有内置类型,结构和枚举具有值语义。 要阅读C ++ / CLI中的值类,请在此处查看: http://www.ddj.com/cpp/184401955

与ref类相比,值类的功能非常少,对“普通旧数据”很有用;也就是说,没有身份的数据。由于您在将数据分配给另一个时复制数据,系统会为您提供默认(和强制)复制构造函数,该构造函数只是将数据复制到另一个对象。

要将值类转换为引用类(从而将其放在垃圾收集堆上),您可以“装箱”它。

要确定您正在撰写的课程是否是其中一个,请问自己是否有自己的身份。这通常意味着它具有某种状态,或者具有标识符或名称,或者其自身上下文的概念(例如,指向附近节点的节点)。

如果没有,那可能是一个价值类。

但是,在C#中,值类被声明为“结构”。

答案 3 :(得分:1)

值类型存储实际数据,而引用类型存储对数据的引用。引用类型动态存储在堆上,而值类型存储在堆栈中。

价值类型:http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx 参考类型:http://msdn.microsoft.com/en-us/library/490f96s2.aspx

答案 4 :(得分:1)

当您引用值类型(即使用其名称)时,您谈论的是内存中数据所在的位置。因此,值类型不能为null,因为内存位置无法说“我不代表任何东西”。默认情况下,您按值传递值类型(即,传递给方法的对象不会因方法的执行而更改。)

使用引用类型对象时,实际上是在伪装中使用指针。该名称指的是一个内存位置,然后引用该对象实际存在的内存中的一个位置。因此,您可以为引用类型指定null,因为它们可以说“我指向无处”。引用类型还允许在执行方法时更改对象,因此您可以通过将myReferenceObject的属性传递给方法调用来更改它。

答案 5 :(得分:0)

引用类型按引用传递给方法,值按类型传递给值;在后一种情况下,方法接收变量的副本,并且在前者中,它接收对原始数据的引用。如果您更改副本,原件不会更改。如果更改了您引用的原始数据,则数据会随着对数据的引用的更改而发生变化。如果在C中创建了与C#程序类似的程序,通常引用类型就像使用指针的数据一样,值类型将是堆栈上的普通数据。

数字类型,字符,日期,枚举和结构都是值类型。字符串,数组,委托和类(实际上,大多数情况下)都是引用类型。

答案 6 :(得分:0)

如果我的理解是正确的,你可以通过使用通过构造函数初始化的readonly成员变量来完成“值类”或不可变类。一旦创建,这些就无法改变。