你真的了解:类与结构吗?(细谈类与结构)

前言:在面向对象的动态编程中,封装已经成为了必不可少的需求,但是在封装时我们又会遇到结构和类这两种方法,那么它们有什么不同呢?我们分别在什么情况下使用它们呢?下面跟随脚步我们一起去一探究竟......

一.类与结构的概念:

1.类:

类是对于某一类对象的一个统称,类是对象的抽象化,对象是类的实例。定义一个类时,相当于定义了一个数据类型的蓝图。但实际上并没有定义任何的数据,但它定义了类的名称意味着什么,也就是说,类的对象由什么组成及在这个对象上可执行什么操作,就是单纯的进行了一个定义。详情请访问:类的概念以及应用

2.结构:

结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。结构体是用来代表一个记录,一般的我们主要用结构体来封装一些方法或者属性,以便于调用,使用结构体一定程度上减少了代码运算量,也可以说比较方便。详情请访问:结构体(sturt)的详解

二.类与结构的特点:

1.类的特点:

类就是对象的抽象化概念,一个类就是一个对象集合的总称,通俗的来讲就是对象需要什么这个类就提供什么给对象,加入对象需要什么数据这个类就提供什么数据,对象需要什么功能这个类就提供什么功能;

2.结构体的特点:

  1. 结构可带有方法、字段、索引、属性、运算符方法和事件;
  2. 结构可定义构造函数,但不能定义析构函数。但是,不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变;
  3. 结构不能继承其他的结构或类;
  4. 结构不能作为其他结构或类的基础结构;
  5. 结构可实现一个或多个接口;
  6. 结构成员不能指定为 abstractvirtualprotected;
  7. 结构可以不使用 New 操作符即可被实例化;
  8. 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。

三.类与结构的声明:

1.类的声明以及引用:

一般的类的声明为:修饰符 class class_name { };
举例:我们在下代码中声明了一个类,其中包含三个属性:

    class student
    {
        public string name;
        public int age;
        public string sex;
    }

引用:
一般会用到new关键字进行对其的实例化操作:

 class Program
    {
        static void Main(string[] args)
        {
            student ss = new student();
            ss.name = "张三";
            Console.WriteLine("我的名字叫:{0}",ss.name);
            Console.ReadLine();
        }
    }

结果:
在这里插入图片描述

2.结构的声明以及引用:

结构的声明,一般形式为:

struct struct_name
{
   //一些方法或属性
}

举例:

    struct SS
    {
        public string Name;
        public int Age;
        public string Sex;
    }

那么我们应该如何调用我们所声明的结构体呢?,其实方法和类特别相似,如下所示:

 class Program
    {
        static void Main(string[] args)
        {
            SS Ss = new SS();
            Ss.Name = "李四";
            Console.WriteLine("我的名字叫: {0}",Ss.Name);
            //student ss = new student();
            //ss.name = "张三";
            //Console.WriteLine("我的名字叫:{0}",ss.name);
            Console.ReadLine();
        }
     }

那么估计会有小伙伴充满疑惑,既然两者看起来基本上都一样,那么会有什么区别呢?,下面我们来主要说一说其的区别…

四.类与结构的区别(举例说明):

  1. 类是引用类型,结构是值类型。
    引用类型:引用类型 由类型的实际值引用(类似于指针)表示的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值。不创建任何副本。引用类型包括类、接口、委托和装箱值类型。
    值类型:值类型直接将内存存储在栈内,由系统自动释放资源的数据类型。
  2. 结构不支持继承。
    为什么结构不支持继承呢?,原来结构也属于密封类,密封类不能被继承。将密封类用作基类是错误的。在类声明中使用 sealed 修饰符可防止继承此类。
    如果将结构继承就会出现如下错误:
    在这里插入图片描述
    但是在类继承时就不会出现错误:
    在这里插入图片描述
  3. 结构不能声明默认的构造函数。
    默认的构造函数:默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化时就会使用默认构造函数。
    但是当我们采用面向对象方法编程,写一个类的时候,其本身有一个默认的构造函数。struct结构体所写的是一个数据对象不是一个类,只是一种编程者自己构造的数据类型,在其中我们不能手动创建无参的构造函数
    举例:
        struct Person
        {
            public string name;
            public int age;
            public string sex;
          
            public Person() { }
         }

当然此代码在编写时会报错,如下:
在这里插入图片描述
所以我们得谨记这些差别,不能将类与结构混淆!!

五.类与结构使用场景:

结构和类的适用场合:
1、当堆栈的空间很有限,且有大量的逻辑对象时,创建类要比创建结构好一些;
2、对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低;
3、在表现抽象和多级别的对象层次时,类是最好的选择,因为结构不支持继承。
4、大多数情况下,目标类型只是含有一些数据,或者以数据为主。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章