C#——类与结构

[复制链接]
发表于 2026-1-29 16:02:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在未学习面向对象语言时,我经常将类比作一种结构体,实在类与结构体也确实很相似,类用来做函数的聚集,结构用来做变量的聚集,接下来将从几个角度刨析类与结构的差异。
类 vs 结构

类和结构在计划和使用时有差异的思量因素,类得当体现复杂的对象和举动,支持继承和多态性,而结构则更得当体现轻量级数据和值范例,以进步性能并制止引用的管理开销。
类和结构有以下几个根本的差异点:
值范例 vs 引用范例:


  • 结构是值范例(Value Type): 结构是值范例,它们在栈上分配内存,而不是在堆上。当将结构实例转达给方法或赋值给另一个变量时,将复制整个结构的内容。
  • 类是引用范例(Reference Type): 类是引用范例,它们在堆上分配内存。当将类实例转达给方法或赋值给另一个变量时,实际上是转达引用(内存所在)而不是整个对象的副本。
继承和多态性:


  • 结构不能继承: 结构不能继承其他结构或类,也不能作为其他结构或类的基类。
  • 类支持继承: 类支持继承和多态性,可以通过派生新类来扩显现有类的功能。
默认构造函数:


  • 结构不能有无参数的构造函数: 结构不能包罗无参数的构造函数(不带传参的)。每个结构都必须有至少一个有参数的构造函数(有传参的)。
  • 类可以有无参数的构造函数: 类可以包罗无参数的构造函数(不带传参的),假如没有提供构造函数,体系会提供默认的无参数构造函数。
名词表明:构造函数(Constructor)是一种特殊的方法,紧张用于在创建对象时初始化对象(构造函数的紧张目标是在对象被创建时设置对象的初始状态或初始值。)。
赋值举动:


  • 范例为类的变量在赋值时存储的是引用,因此两个变量指向同一个对象。
  • 结构变量在赋值时会复制整个结构,因此每个变量都有本身的独立副本。
转达方式:


  • 范例为类的对象在方法调用时通过引用转达,这意味着在方法中对对象所做的更改会影响到原始对象。
  • 结构对象通常通过值转达,这意味着转达的是结构的副本,而不是原始结构对象本身。因此,在方法中对结构所做的更改不会影响到原始对象。
可空性:


  • 结构体是值范例,不能直接设置为 null:由于 null 是引用范例的默认值,而不是值范例的默认值。假如你须要体现结构体变量的缺失或无效状态,可以使用 Nullable<T> 或称为 T? 的可空范例。
  • 类默认可为null: 类的实例默认可以为 null,由于它们是引用范例。
  •         性能和内存分配:
  • 结构通常更轻量: 由于结构是值范例且在栈上分配内存,它们通常比类更轻量,实用于简朴的数据体现。
  • 类大概有更多开销: 由于类是引用范例,大概涉及更多的内存开销和管理。
  1. using System;
  2. using System.Text;
  3. struct Books
  4. {
  5.     private string title;
  6.     private string author;
  7.     private string subject;
  8.     private int book_id;
  9.     public void setValues(string t, string a, string s, int id)
  10.     {
  11.         title = t;
  12.         author = a;
  13.         subject = s;
  14.         book_id = id;
  15.     }
  16.     public void display()
  17.     {
  18.         Console.WriteLine("Title : {0}", title);
  19.         Console.WriteLine("Author : {0}", author);
  20.         Console.WriteLine("Subject : {0}", subject);
  21.         Console.WriteLine("Book_id :{0}", book_id);
  22.     }
  23. };
  24. public class testStructure
  25. {
  26.     public static void Main(string[] args)
  27.     {
  28.         Books Book1 = new Books(); /* 声明 Book1,类型为 Books */
  29.         Books Book2 = new Books(); /* 声明 Book2,类型为 Books */
  30.         /* book 1 方法调用 */
  31.         Book1.setValues("C Programming",
  32.         "Nuha Ali", "C Programming Tutorial", 6495407);
  33.         /* book 2 方法调用 */
  34.         Book2.setValues("Telecom Billing",
  35.         "Zara Ali", "Telecom Billing Tutorial", 6495700);
  36.         /* 打印 Book1 信息 */
  37.         Book1.display();
  38.         /* 打印 Book2 信息 */
  39.         Book2.display();
  40.         Console.ReadKey();
  41.     }
  42. }
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表