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

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

这与value typereference type有何不同?

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

您需要创建一个仅包含值类型的简单类或结构。 您必须创建类或结构,以使其尽可能高效地运行。 您必须能够将类或结构传递给过程,而无需担心过程将对其进行修改。 您应该创建以下哪项?

参考类

B参考结构

C值类

D值结构

正确答案:D

不正确:你可以创建一个引用类; 但是,它可以在传递给程序时进行修改。

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

C不正确:您可以创建一个值类; 然而,结构往往更有效。

D正确:价值结构通常是最有效的。

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

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

请参阅有关该主题的概述 ,但请严格遵循msnd链接并阅读完整的Common Type系统章节。 (您也可以在第一个问题的评论中提出问题)

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

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

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

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

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

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

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

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

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

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

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

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

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