• C#基础:类class与结构struct的区别


    一、类class

    类class是引用类型,可以直接赋值为null,默认值也是null

    XClass xClass = null;//语法正确

        一般来说,某个类对象使用另一个类的对象赋值时,则两者共用一个内存地址【节约内存空间】,ReferenceEquals引用比较此时返回true

    1. XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
    2. XClass xClass4 = xClass3;

    类的构造函数(构造方法)

    如果一个类没有显示定义构造函数,则默认有一个无参构造函数,

    如果一个类已定义了带参数的构造函数,如果不手动定义无参构造函数,则没有无参构造函数

    特殊类String:

    特殊类【字符串String】虽然是引用类型,但对字符串的更新并不会修改字符串的原实际值,

    字符串作为参数传递并不能篡改原来的值,

    可以认为字符串虽然是引用类型,但使用时按值类型处理

    二、结构struct

    结构struct是值类型,不能直接赋值为null,结构的默认值为0,false,类型名称字符串等

    XStruct xStruct=null;//语法错误,不能为值类型赋值为null

    如果想为值类型赋值为null,请使用可空类型Nullable

    public struct Nullable where T : struct

    比如如下代码即可编译通过:

    Nullable xStruct = null;//可空值类型

    或者简化为

    XStruct? xStruct = null;//可空值类型的简化

        某个结构对象使用另一个结构的对象赋值时,则两者的内存地址完全不同,第二个结构对象新开一个内存空间,只不过内存的值完全一致【内存空间增加】,ReferenceEquals引用比较此时返回false

    结构的构造函数

    所有结构都自动继承抽象值类型基类ValueType,有个默认无参构造函数ValueType(),因此无法在自定义结构中定义无参构造函数

    1. using System.Runtime.InteropServices;
    2. using System.Security;
    3. namespace System
    4. {
    5. //
    6. // 摘要:
    7. // 为值类型提供基类。
    8. [ComVisible(true)]
    9. public abstract class ValueType
    10. {
    11. //
    12. // 摘要:
    13. // 初始化 System.ValueType 类的新实例。
    14. protected ValueType();
    15. //
    16. // 摘要:
    17. // 指示此实例与指定对象是否相等。
    18. //
    19. // 参数:
    20. // obj:
    21. // 要与当前实例进行比较的对象。
    22. //
    23. // 返回结果:
    24. // 如果 true 和该实例具有相同的类型并表示相同的值,则为 obj;否则为 false。
    25. [SecuritySafeCritical]
    26. public override bool Equals(object obj);
    27. //
    28. // 摘要:
    29. // 返回此实例的哈希代码。
    30. //
    31. // 返回结果:
    32. // 一个 32 位带符号整数,它是此实例的哈希代码。
    33. [SecuritySafeCritical]
    34. public override int GetHashCode();
    35. //
    36. // 摘要:
    37. // 返回此实例的完全限定类型名称。
    38. //
    39. // 返回结果:
    40. // 完全限定的类型名称
    41. public override string ToString();
    42. }
    43. }

    值类型重写了Equals方法,如果一个值类型的具体属性值完全一致时,两个对象是相等的

    三、测试控制台应用程序GenericTemplateDemo:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace GenericTemplateDemo
    7. {
    8. class Program
    9. {
    10. static void Main(string[] args)
    11. {
    12. Console.SetWindowSize(120, 30);
    13. Console.WriteLine($"结构的默认值为类型名(一定不为null):{default(XStruct)},类型名为【{typeof(XStruct)}】");
    14. Console.WriteLine($"类的默认值为null?【{default(XClass) == null}】");
    15. Console.WriteLine("---------------------------------结构的Equal比较---------------------------------");
    16. XStruct xStruct1 = new XStruct() { Id = 5, Name = "ABC" };
    17. XStruct xStruct2 = new XStruct("ABC") { Id = 5 };
    18. Console.WriteLine($"结构一的内容{{Id:{xStruct1.Id},Name:{xStruct1.Name}}}");
    19. Console.WriteLine($"结构二的内容{{Id:{xStruct2.Id},Name:{xStruct2.Name}}}");
    20. Console.WriteLine();
    21. Console.WriteLine($"比较两个结构的实例值是否相等:{xStruct1.Equals(xStruct2)}");
    22. Console.WriteLine($"比较两个结构的引用是否指向同一个实例:{ReferenceEquals(xStruct1, xStruct2)}");
    23. XStruct xStruct3 = new XStruct("修吾") { Id = 8 };
    24. XStruct xStruct4 = xStruct3;
    25. Console.WriteLine($"结构三的内容{{Id:{xStruct3.Id},Name:{xStruct3.Name}}}");
    26. Console.WriteLine($"结构四的内容{{Id:{xStruct4.Id},Name:{xStruct4.Name}}}");
    27. Console.WriteLine();
    28. Console.WriteLine($"比较两个结构的实例值是否相等:{xStruct3.Equals(xStruct4)}");
    29. Console.WriteLine($"比较两个结构的引用是否指向同一个实例:{ReferenceEquals(xStruct3, xStruct4)}");
    30. Console.WriteLine("---------------------------------类的Equal比较---------------------------------");
    31. XClass xClass1 = new XClass() { Id = 6, Name = "毒瘴泉" };
    32. XClass xClass2 = new XClass("毒瘴泉") { Id = 6 };
    33. Console.WriteLine($"类一的内容{{Id:{xClass1.Id},Name:{xClass1.Name}}}");
    34. Console.WriteLine($"类二的内容{{Id:{xClass2.Id},Name:{xClass2.Name}}}");
    35. Console.WriteLine();
    36. Console.WriteLine($"比较两个类的实例值是否相等:{xClass1.Equals(xClass2)}");
    37. Console.WriteLine($"比较两个类的引用是否指向同一个实例:{ReferenceEquals(xClass1, xClass2)}");
    38. Console.WriteLine();
    39. XClass xClass3 = new XClass() { Id = 7, Name = "天晴之海" };
    40. XClass xClass4 = xClass3;
    41. Console.WriteLine($"类三的内容{{Id:{xClass3.Id},Name:{xClass3.Name}}}");
    42. Console.WriteLine($"类四的内容{{Id:{xClass4.Id},Name:{xClass4.Name}}}");
    43. Console.WriteLine();
    44. Console.WriteLine($"比较两个类的实例值是否相等:{xClass3.Equals(xClass4)}");
    45. Console.WriteLine($"比较两个类的引用是否指向同一个实例:{ReferenceEquals(xClass3, xClass4)}");
    46. Console.ReadLine();
    47. }
    48. }
    49. ///
    50. /// 测试用的结构,结构继承ValueType,而ValueType重写了Equals(object obj)方法,因此比较
    51. /// 结构不允许显式定义无参的构造函数,因 结构struct一经定义,自动会生成一个无参构造函数
    52. ///
    53. struct XStruct
    54. {
    55. public XStruct(string name)
    56. {
    57. Id = 0;
    58. Name = name;
    59. }
    60. public int Id { get; set; }
    61. public string Name { get; set; }
    62. }
    63. ///
    64. /// 测试用的类
    65. ///
    66. class XClass
    67. {
    68. public XClass()
    69. {
    70. }
    71. public XClass(string name)
    72. {
    73. Id = 0;
    74. Name = name;
    75. }
    76. public int Id { get; set; }
    77. public string Name { get; set; }
    78. }
    79. }

    四、程序运行如图:

  • 相关阅读:
    【yolov8系列】yolov8的目标检测、实例分割、关节点估计的原理解析
    cpu和gpu已过时,npu和apu的时代开始
    2022 CCPC桂林 G. Group Homework
    这是二叉搜索树吗?
    数据增强系列(补充ing...)
    安装free IPA与CDH6.3.2结合
    基于PHP+MySQL毕业生档案管理系统
    《Deep learning Based Text Classification:A comprehensive Review》文本综述
    腾讯云轻量应用服务器性能如何?值得入手吗?
    AVL平衡树的插入
  • 原文地址:https://blog.csdn.net/ylq1045/article/details/127648836