《C#图解教程》第3章 类型、存储和变量 读书笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Cyan1614/article/details/77982690
3.1 C#程序是一组类型声明
C#程序或DLL的源代码是一组一种或多种类型声明。
对于可执行程序,类型声明中必须有一个包含Main方法的类。
命名空间是一种把相关的类型声明分组并命名的方法。既然程序是一组相关的类型声明,那么通常会把程序声明在你创建的命名空间内部。
3.2 类型是一种模板
可以把类型想象成一个用来创建数据结构的模板。模板本身并不是数据结构,但它详细说明了由模板构造的对象的特征。
类型由下面的元素定义名称、用于保存数据成员的数据结构和一些行为及约束条件。
3.3 实例化类型
从某个类型模板创建实际的对象,被称为实例化该类型。
通过实例化类型而创建的对象被称为类型的对象或类型的实例。
在C#程序中,每个数据项都是某种类型的 实例。这些类型可以是语言自带的,可以是BCL或其他库提供的,也可以是程序员定义的。
3.4 数据成员和函数成员
像short、int和long等这样的类型称为简单类型。这种类型只能存储一个数据项。其他的类型可以存储多个数据项。
然而另外一些类型可包含许多不同类型的数据项。这些类型中的数据项个体称为成员,并且与数组中使用数字来引用成员不同,这些成员有独特的名称。
有两种成员:数据成员和函数成员。
数据成员:保存了与这个类的对象或作为一个整体的类相关的数据。
函数成员:执行代码。函数成员定义类型的行为。
3.5 预定义类型
C#提供了16种预定义类型。
所有预定义类型的名称都由全小写的字母组成。
3.6 用户定义类型
除了C#提供的16种预定义类型,还可以创建自己的用户定义类型。
有6种类型可以由用户自己创建,它们是:class、struct、array、enum、delegate和interface。
类型通过类型声明创建,类型声明包含以下信息:
要创建的类型的种类
新类型的名称
对类型中每个成员的声明(名称和规格)。
3.7 栈和堆
运行中的程序使用两个内存区域来存储数据:栈和堆。
3.7.1 栈
栈是一个内存数组,是一个LIFO(Last-In First Out,后进先出)的数据结构。栈存储几种类型的数据:某些类型变量的值、程序当前的执行环境和传递给方法的参数。
栈的特征数据只能从栈的顶端插入和删除、把数据放到栈顶称为入栈和从栈顶删除数据称为出栈。
3.7.2 堆
堆是一种内存区域,在堆里可以分配大块的内存用于存储某类型的数据对象。与栈不同,堆里内存能够以任意顺序存入和移除。
虽然程序可以在堆里保存数据,但并不能显式地删除它们。CLR的自动GC(Garbage Collector,垃圾收集器)在判断出程序的代码将不会再访问某数据项时,自动清除无主的堆对象。
3.8 值类型和引用类型
数据项类型定义了存储数据需要的内大小及组成该类型的数据成员。类型还决定了对象在内存中的存储位置---栈或堆。
类型被分为两种,值类型和引用类型,这两种类型的对象在内存中的存储方式不同。
值类型只需要一段单独的内存,用于存储实际的数据。
引用类型需要两段内存。第一段存储实际的数据,它总是位于堆中。第二段是一个引用,指向数据在堆中的存放位置。
3.8.1 存储引用类型对象的成员
引用类型对象的数据部分始终存放在堆里。
值类型对象或引用类型对象的引用部分可以存放在堆里,也可以存放在栈里,这依赖于实际环境。
3.8.2 C#类型的分类
值类型:sbyte、byte、float、short、ushort、double、int、uint、char、long、ulong、decimal、bool、object、string、dynamic、struct、enum。
引用类型:object、string、dynamic、class、interface、delegate、array。
3.9 变量
变量是一个名称,表示程序执行时在内存中的数据。
3.9.1 变量声明
变量在使用之前必须声明。
给变量命名,并为它关联一种类型。
让编译器为它分配一块内存。
除声明变量的名称和类型以外,声明还能把它的内存初始化为一个明确的值。
一些类型的变量如果在声明时没有初始化语句,那么会被自动设为默认值,而另一些则不能。
3.9.2 多变量声明
可以把多个变量声明在一条单独的声明语句中。
多变量声明中的变量必须类型相同。
变量名必须用逗号分隔,可以在变量名后包含初始化语句。
3.9.3 使用变量的值
变量名代表该变量保存的值,可以通过使用变量名来使用值。
3.10 静态类型和dynamic关键字
变量的类型在编译的时候确定并且不能在运行时修改,这叫做静态类型。
在编译时,编译器不会对dynamic类型的变量进行类型检查。相反,它将与该变量及该变量的操作有关的所有信息打包。在运行时,会对这些信息进行检查,以确保它与变量所代表的实际类型保持一致性。否则,将在运行时抛出异常。
3.11 可空类型
可空类型允许创建可以标记有效或无效的值类型,这样可以在使用它之前确定值的有效性。普通的值类型称作非可空类型。

猜你喜欢

转载自blog.csdn.net/Cyan1614/article/details/77982690