是否有更好的方法来解释.net中的结构和类之间的行为差​​异?

时间:2020-03-06 14:25:20  来源:igfitidea点击:

下面的代码显示了一个示例,我最近使用它来向刚接触开发的人员解释结构和类的不同行为。有没有更好的方法呢? (是的,代码仅出于简洁目的使用了公共字段)

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弱和被动。

一个类在构造函数的瞬间突然爆炸。充满活力的一堂课是现代编程世界的超级英雄。

最基本的区别是"结构"是"值类型",而"类"是"引用类型"