学习C#只需一个系列(二)—— 类和结构

系列文章目录

学习C#只需一个系列—— 快速入门C#

学习C#只需一个系列(一)—— C#导论

学习C#只需一个系列(二)—— 类和结构


前言

类和结构是.NET通用类型系统中的两种基本构造,因此它们的重要性也就可想而知了。本文章将详细的介绍类的定义,结构的定义,类和结构的相同点与不同点,两者的声明格式。如果有任何说的不对的地方,请在评论区留言或私聊。

一、定义

类是什么?

既然类在C#中占有及其重要的地位,那我们要先知道类的定义,简单来说,就是类是什么东西?

先来看看微软官方对于类的定义:

1.本质上是一种数据结构,其中封装了同属一个逻辑单元的一组数据和行为。 数据和行为是类或结构的成员,包括方法、属性和事件等。

2.类或结构声明类似于一张蓝图,用于在运行时创建实例或对象。

3.类是引用类型。 创建类的对象后,向其分配对象的变量仅保留对相应内存的引用。 将对象引用分配给新变量后,新变量会引用原始对象。 通过一个变量所做的更改将反映在另一个变量中,因为它们引用相同的数据。

这是从微软文档上节选的对类的定义,可以看到类和结构是密不可分的,它们有很多相似的地方,但也有不同的地方,暂且先抛开这些抽象的理论。

有些人遇到这样的文档就会觉得头大,以下是我看文档的一些经验和总结。看到任意一篇文档基本都可以用4步解决。

  1. 根据名称从大段的文字中找到你所需要的部分。比如说我们要找的定义,那我们就只找它。
  2. 根据顺序将找到的话分成一个个小段。这步非常简单,只要像上面那样将找到的内容一一罗列出来就行了。如果找到的段落很长,那么你可能需要自己将它分个段落。
  3. 从每一小段中找到关键的字或词,并标记一下。像我在上文中一样,将关键字标红即可。如果实在不会找,总结性的语句一般会在段落的开头或结尾,这样一样也可以找到关键的段落。
  4. 总结,用自己的话将关键字组织起来就可以啦~~。

现在,我们来总结一下,

  • 类是一种数据类型,是一种引用类型的数据类型。
  • 类是一个蓝图,用来封装了零个或多个成员
  • 类仅在运行时,才会创建实例或对象。

如果你也想尝试一下自己总结,可以点击下面的链接。可以用我提供的方法试试,熟悉之后你可能会找到属于自己的方法。每个人应该有自己的记忆和理解方法,所以不必拘泥于别人的定义,甚至是官方的,这只是一种“参考答案”。你只需要在自己的总结上添加,而不是替换全部的内容,否定原来的答案,因为定义是人赋予的,没有哪个定义是本身就存在的,就正确的。

微软文档中对类的定义

结构是什么?

一样先来看看微软的定义:

1.本质上是一种数据结构,其中封装了同属一个逻辑单元的一组数据和行为。 数据和行为是类或结构的成员,包括方法、属性和事件等。

2.类或结构声明类似于一张蓝图,用于在运行时创建实例或对象。

3.结构是值类型。 创建结构时,向其分配结构的变量保留结构的实际数据。 将结构分配给新变量时,会复制结构。 因此,新变量和原始变量包含相同数据的副本(共两个)。 对一个副本所做的更改不会影响另一个副本。

结构和类在1,2两点上完全一致,这会造成很多初学者觉得,既然这两个东西一样为什么要设计两个呢。这一点将在之后进行讲解,现在让我们来总结一下结构的定义,

  • 结构是一种数据类型,是一种值类型的数据类型。
  • 结构也是一张蓝图,可以封装零个或多个成员
  • 结构只有在运行时,才会创建实例或对象。

二、类和结构的区别

1.相同点

  1. 它们都是数据结构
  2. 它们都可以封装零个或多个成员
  3. 它们都只在运行时,创建实例或对象

你会在三句话中看到一些陌生的名词,比如说数据结构、成员、实例或对象。这对于你是十分惧怕的,因为你对这些名词经常是一知半解的,甚至是没有意义的。所以,下面我归纳了一下上文中出现的部分名词,方便理解。

数据结构

数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。

如果你学过其他语言,那你应该知道数组就是一种数据结构。

int a[10] = {
    
    12345678910};

成员
类和结构具有表示其数据和行为的成员。成员是它们的一部分,用来具体实现这个类或结构的功能。以下介绍了类和结构的全部成员,你不必记住所有的,比较常用的成员有字段、属性、方法、事件。当然,这些成员也会在之后的系列中逐一进行解析,如果你想马上知道它们的作用,下面我提供了链接。

成员介绍

成员 描述
字段 字段是在类范围声明的变量。
常量 常量是在编译时设置其值并且不能更改其值的字段。
属性 属性是类中可以像类中的字段一样访问的方法。 属性可以为类字段提供保护,以避免字段在对象不知道的情况下被更改。
方法 方法定义类可以执行的操作。 方法可接受提供输入数据的参数,并可通过参数返回输出数据。 方法还可以不使用参数而直接返回值。
事件 事件向其他对象提供有关发生的事情(如单击按钮或成功完成某个方法)的通知。 事件是使用委托定义和触发的。
运算符 重载运算符被视为类型成员。 重载运算符时,将其定义为类型中的公共静态方法。
索引器 使用索引器可以用类似于数组的方式为对象建立索引。
构造函数 构造函数是首次创建对象时调用的方法。 它们通常用于初始化对象的数据。
终结器 C# 中很少使用终结器。 终结器是当对象即将从内存中移除时由运行时执行引擎调用的方法。 它们通常用来确保任何必须释放的资源都得到适当的处理。
嵌套类型 嵌套类型是在其他类型中声明的类型。 嵌套类型通常用于描述仅由包含它们的类型使用的对象。

实例与对象
实例和对象基本上是同义词,它们常常可以互换使用。

对象就是客观世界中存在的人、事、物体等实体在计算机逻辑中的映射。

在面向对象程序设计中,“类”在实例化之后叫做一个“实例”。 “类”是静态的,不占进程内存,而“实例”拥有动态内存。

对象就是类的实例,所有的对象都是实例,但并不是所有的实例都是对象。只有类的实例是对象外,其他的都不是对象。

2.不同点

  1. 类是引用类型,结构是值类型
  2. 类的对象是存储在堆空间中,结构存储在中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。
  3. 结构不能声明默认的构造函数
  4. 结构体中声明的字段无法赋予初值,类可以。
  5. 结构不支持继承

想要了解它们的不同,就先要知道它们在C#庞大的家族中的位置,如下图:
C#数据类型

1.引用类型与值类型
C#的数据类型分为值类型和引用类型,类属于引用类型,而结构是值类型。引用类型在赋值给其他变量时,传递的是它的引用,相当于将另一个标签贴在变量上,这个变量有两个名字。值类型在赋值给其他变量时,只传递它的值。

这部分对于你来说可能直接理解会有一定的难度,在下面将会用代码示例演示:

	class Program
	{
    
    
        static void Main(string[] args)
        {
    
    
            //值类型
            MyStruct s = new MyStruct();//创建结构体类型的实例s
            s.num = 0;//为s实例内的num赋值0
            MyStruct s2 = s;//创建结构体类型的实例s2,将s赋值给s2
            s2.num = 100;//为s2实例内的num赋值100
            Console.WriteLine(s.num);//打印结果 0
            
            //引用类型
            MyClass c = new MyClass();//创建类类型的实例c
            c.num = 0;//为c实例内的num赋值0
            MyClass c2 = c;//创建类类型的实例c2
            c2.num = 100;//为c2实例内的num赋值100
            Console.WriteLine(c.num);//打印结果 100

            Console.ReadLine();
        }
    }

    class MyClass
    {
    
    
        public int num; //声明公开的字段num
    }

    struct MyStruct
    {
    
    
        public int num;//声明公开的字段num
    }

这段代码展示了类和结构的不同,引用类型在赋值时地址是相同的,所以内部的值num会同时被赋值。值类型在赋值时地址是不同的,所以内部的值num不会同时被赋值。

注意:这部分的内容对你来说可能需要将代码复制到编译器内去感受一下区别,自己去修改数值试一试能更好的理解。如果不方便的话,可以使用菜鸟提供的C#在线编译器,链接:菜鸟C#在线编译器

2.默认构造函数
默认构造函数,也被称为无参构造函数。构造函数是一种成员,构造函数内的代码会在创建实例时执行,而结构体的默认构造函数已被程序占用,所以我们不能创建,以防出现"二义性"。

注意:结构只是不能有默认的构造函数,有参的构造函数它是可以声明的。以后会深入讲解,只要记住结构只是不能有默认的构造函数就行了。

    //试验类 
    class MyClass2
    {
    
    
        //类中创建默认构造函数是可以√
        public MyClass2()
        {
    
    
            
        }
    }

    //试验结构体
    struct MyStruct2
    {
    
    
        //结构体内创建默认构造函数是不可以的x
        //public MyStruct2()
        //{
    
    
            
        //}
    }

3.结构体中声明字段无法赋初值

struct MyStruct4
{
    
    
	int num;//int num = 1;是错误的
}

4.继承
C#中类是可以继承或被继承的,标志性的记号就是冒号 “:”。以后也会进行深入的讲解,现在只需要记住这条就行。

class MyClass3 : MyClass2//类可以继承或被继承
{
    
    
    
}

//struct MyStruct3 : MyStruct2 //结构体不能继承或被继承
//{
    
    

//}

总结

类和结构是.NET通用类型系统的基本构造,构成了C#程序的主体。

1.类和结构的定义

  • 类和结构是一种数据结构类是引用类型,而结构是值类型。
  • 类和结构是一张“蓝图”,封装了一个或多个成员。
  • 类和结构只有在运行时,才会创建对象或实例。

2.类和结构的异同

  • 类和结构都是数据结构
  • 类和结构都可以封装零个或多个成员。
  • 类和结构只在运行时,创建实例或对象

  • 类的对象是存储在堆空间中,结构存储在中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。
  • 结构不能声明默认的构造函数
  • 结构体中声明的字段无法赋予初值,类可以。
  • 结构不支持继承

3.类和结构的声明格式
类的声明格式:“class”关键字 + 类名 + {}

class MyClass
{
    
    
	//成员
}

结构的声明格式:“struct”关键字 + 结构名 + {}

struct MyStruct
{
    
    
	//成员
}

最后
1.工具和网站
菜鸟
微软文档
2.对初学者的话
最后,是我想对学习编程语言的初学者说的话,如果你们有看到这里的话,我想说:“优秀的判断力来自经验,但经验来自于错误的判断。”,因此,不要害怕失败,失败在编程中是很正常的事。

猜你喜欢

转载自blog.csdn.net/qq_45164916/article/details/112525747