是否有更好的方法来解释.net中的结构和类之间的行为差异?
下面的代码显示了一个示例,我最近使用它来向刚接触开发的人员解释结构和类的不同行为。有没有更好的方法呢? (是的,代码仅出于简洁目的使用了公共字段)
namespace StructsVsClasses { class Program { static void Main(string[] args) { sampleStruct struct1 = new sampleStruct(); struct1.IntegerValue = 3; Console.WriteLine("struct1.IntegerValue: {0}", struct1.IntegerValue); sampleStruct struct2 = struct1; Console.WriteLine(); Console.WriteLine("struct1.IntegerValue: {0}", struct1.IntegerValue); Console.WriteLine("struct2.IntegerValue: {0}", struct2.IntegerValue); struct1.IntegerValue = 5; Console.WriteLine(); Console.WriteLine("struct1.IntegerValue: {0}", struct1.IntegerValue); Console.WriteLine("struct2.IntegerValue: {0}", struct2.IntegerValue); sampleClass class1 = new sampleClass(); class1.IntegerValue = 3; Console.WriteLine(); Console.WriteLine("class1.IntegerValue: {0}", class1.IntegerValue); sampleClass class2 = class1; Console.WriteLine(); Console.WriteLine("class1.IntegerValue: {0}", class1.IntegerValue); Console.WriteLine("class2.IntegerValue: {0}", class2.IntegerValue); class1.IntegerValue = 5; Console.WriteLine(); Console.WriteLine("class1.IntegerValue: {0}", class1.IntegerValue); Console.WriteLine("class2.IntegerValue: {0}", class2.IntegerValue); Console.ReadKey(); } } struct sampleStruct { public int IntegerValue; } class sampleClass { public int IntegerValue; } }
解决方案
我想可以通过这种方式显示出与值/引用类型有关的差异。不过,将方法用于控制台输出可能会更干净一些。
正如我们所说的,"某人"对开发来说是新手,这也许并不重要,但是在Chere中,类和结构之间的进一步区别列出了很多:
Cstruct /类差异
好吧,解释根本不是解释,而是对行为的观察,这是不同的。
如果我们想要解释区别是什么,那么我们需要一段文本来解释它。解释的行为可以用代码编辑。
由Grimtron链接到的页面非常适合详细说明类和结构之间的所有个体差异,其中的各个部分将作为概述说明,特别是请阅读以下内容:
- 存在于堆栈或者堆中吗?
- 继承差异?
但是我不会链接到该页面来解释不同之处。这就像试图描述汽车是什么,只是列出组成汽车的所有零件。我们仍然需要了解全局才能了解汽车是什么,而这样的清单将无法为我们提供帮助。
在我看来,一种解释可以告诉我们某些事物是如何工作的,然后所有细节自然而然地从中得出。
例如,如果我们了解值类型与引用类型背后的基本基本原理,那么考虑一下该页面上的许多详细信息就很有意义。
例如,可以说,将值类型(结构)分配给内联声明的位置。它会占用堆栈空间,或者使一个类的内存更大。但是,引用类型是指向内存中实际对象存储位置的固定大小的指针。
通过上面的解释,以下详细信息才有意义:
- struct变量不能为null(即,它始终占用必要的空间)
- 对象引用可以为空(即,指针不能指向任何内容)
- 一个结构不会给垃圾收集增加压力(垃圾收集与堆一起工作,这是对象生活在空间中的其他地方)
- 始终具有默认构造函数。由于我们可以声明任何value-type变量(基本上是一种struct),而无需给它赋值,因此必须有一些潜在的魔术来清除该空间(请记住我说过无论如何都要占用空间)
其他事物,如与继承有关的所有事物,都需要在解释中有自己的一部分。
等等...
- 我看不到我们要在样本中显示的内容。
- 我向人们解释的方式是"一个结构容纳东西。一个类用它来做某事"。
lassevk,
谢谢(感谢旁听者:=),但是,也许我不太清楚,我只是想展示而不是告诉某个正在开发中的新人,像这样的散文意味着大约星际迷航般的技术平均水平。
我敢肯定,一旦我的新手对.net和一般的编程更加熟悉/熟悉了,那么Grimtron链接到的页面以及文字肯定会有用。
当结构/类是另一个类的成员时,这种区别可能更容易理解。
类的示例:
class PointClass { int double X; int double Y; } class Circle { PointClass Center = new PointClass() { X = 0, Y = 0; } } static void Main() { Circle c = new Circle(); Console.WriteLine(c.Center.X); c.Center.X = 42; Console.WriteLine(c.Center.X); }
输出:
0 42
struct的示例:
struct Point { int double X; int double Y; } class Circle { PointStruct Center = new PointStruct() { X = 0, Y = 0; } } static void Main() { Circle c = new Circle(); Console.WriteLine(c.Center.X); c.Center.X = 42; Console.WriteLine(c.Center.X); }
输出:
0 0
结构是无用的,毫无生气的数据安排。 cc弱和被动。
一个类在构造函数的瞬间突然爆炸。充满活力的一堂课是现代编程世界的超级英雄。
最基本的区别是"结构"是"值类型",而"类"是"引用类型"