在我们理解Class和Struct之间的区别之前,我们应该知道一些与它们相关的基本概念。 如果不了解概念,很难理解两者之间的差异。

什么是类和对象

这是与面向对象编程相关的两个重要概念,它们构成了框架功能和传递给其他功能的数据的基础。 为了更好地理解,我们可以将其与实际示例相关联。可以将“类”视为商店,“对象”可以是任何单独的特定商店,例如杂货店,文具,水果等。所有对象都具有主类(商店)的共同属性,因此, 这些对象可能具有自己的专有属性,例如特定的设计,照明等。通过这些对象,可以实际使用该类; 它们构成了一个类的实例。

类的语法

Class Store {
    public string things;
    public string design;

}

创建对象的语法

Store grocery = new Store();
Store Stationery = new Store();

什么是结构?

Struct仅包含数据,因此有助于通过Struct对象构造单个数据需求。 与类不同,它没有函数。下面是它的语法:

struct grocery_entrance{
    char entrance_name[50];
    int entrance_size;
} grocery_entrance;

什么是继承?

这类似于儿子继承父亲的财产,然后儿子也可以增加自己的其他财产。该类可以是基类,也可以是派生类,其中前者可以作为构成后者的基础。除了从基类获得的属性外,派生类还为其自身添加了一些其他属性。当我们考虑以上示例时,杂货店仍然可以派生到特定杂货店,例如XYZ杂货店。

既然我们已经熟悉了基本概念,那么就可以了解Class和Struct之间的实际区别。

Class和Struct有什么区别?

  • 可重用性:由于类构成了基本框架,因此可以被重用。但是,结构是具有特定属性的单个元素,因此无法重复使用。例如,杂货店类可以用于任何类型的杂货店,但是Struct杂货店_入口范围仅针对该杂货店,因此在其他类中重用它是没有意义的。
  • 可见性:类中的所有功能均公开提供给其对象。例如,在“商店”类下有一个名为“事物”的函数。 “事物”功能对其所有对象(例如“杂货店”,“文具店”等)都是可见的。对于Structs,这种可见性是不可能的,因为struct的数据仅限于自身,而其他Structs则不可见。为了清楚起见,可以说“grocery_entrance”的数据并非对所有其他商店都是公开可见的。
  • 按引用传递: - 仅向功能发送存储器位置,而不发送实际数据。这意味着只要值改变,该改变就会反映在相应的功能中。反过来,按值传递只是将值发送给函数。在这种情况下,发送后值的变化不会反映在函数中。类使用按引用传递,而Struct使用传递值。
  • 继承:类可以进一步继承以形成子类,但是Structs无法利用继承。例如,类别商店将其功能提供给子类别“杂货店”。但是Struct的“grocery_entrance”不能继承任何功能。我们可以说这里没有像子结构这样的概念。
  • 默认可见性:默认情况下,类的所有成员均保留为私有实体,而默认情况下,Struct的成员保留为公共实体。
  • 空的Class和Struct的大小:即使Class为空,Class也使用1 Byte的大小,而Struct在为空时从不使用任何内存。这意味着我们可以说一个空结构的大小等于0个字节。
  • 垃圾收集:类可以进行垃圾收集,因为它们使用引用传递。因此,更容易在存储数据的一个位置进行清理。另一方面,Struct无法进行垃圾收集,因为它使用按值传递并且数据分散在不同的位置。
  • 内存管理:因为Class允许垃圾回收,所以内存管理也很有效;但是,对Structs而言,效果并不理想。
  • 构造函数:构造函数通常使用某些指定的值初始化类。我们可以将其视为已使用值初始化的事物。如果必须创建一个新类,则调用构造函数为该实例分配内存。我们甚至可以在调用构造函数时将值作为参数传递。让我们现在开始我们的实际讨论。类允许所有类型的构造函数,例如带有或不带有参数的构造函数,而structs仅允许带有参数的构造函数,即参数化的构造函数。
  • 析构函数:每当我们需要删除类的实例时,都会调用析构函数。反之,析构函数将删除该实例并释放内存。类可以使用析构函数,而结构不能。
  • 成员变量初始化:在类中,可以直接初始化成员变量;使用Structs无法进行此类初始化。
  • 对象创建:在类中创建对象的一般语法为:
    Demo obj = new Demo();
    

何时使用类和何时使用结构?

由于类在将数据和函数一起处理时更加灵活,因此当所使用的对象复杂而又庞大时,我们可以使用它。在我们的示例中,购物中心可以使用“商店”类来更好地表示系统。但是,结构只限于较小的对象,因为它们的效果不如Class。因此,如果您设计自己的商店,则Structs是更好的选择。

如何将结构转换为类,反之亦然?
可能已经听说过“装箱”和“拆装箱”这两个术语,以将Struct转换为Class,反之亦然。尽管这些是有助于我们转换的有效流程,但应谨慎处理。由于这直接影响内存位置,因此会对我们系统的性能产生巨大影响。此外,它影响垃圾收集过程并导致整个系统效率低下。因此,仅在需要时才使用这些转换。

比较项 结构
可重用性 完全可重用 不可重用
可见性 一个类的所有功能对其对象都是可见的。 Struct的对象数据对于同一Struct的其他对象不可见。
按引用传递和按值传递 使用按引用传递 按值传递
继承 一个类的功能可以被其子类继承。 允许继承从不允许继承
默认可见性 默认情况下,类的所有成员均为私有; 默认情况下,所有Struct的成员均为公共
空时的大小 空类的大小为1字节空 结构的大小为0字节
垃圾收集 由于使用了按引用传递,因此可以进行垃圾收集 因为使用了按值传递,所以无法进行垃圾收集
内存管理 垃圾收集过程的简易性有助于有效的内存管理 缺少垃圾收集会导致较差的内存管理
构造函数 允许所有类型的构造函数,例如带有或不带有参数的构造函数 仅允许参数化的构造函数
析构函数 可以使用 它不能使用
成员变量初始化 允许直接初始化成员变量 不允许直接单词初始化成员变量
对象创建 在对象创建期间必须使用关键字“new”。 在对象创建期间使用关键字“new”是可选的
何时使用 更好地用于需要继承的较大和复杂的对象 更好地适合于对继承不太重要的较小和简单的对象。
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:类和结构体
本文链接:https://www.vsdiffer.com/vs/class-vs-struct.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。