笼统地来讲,如果你观察C\C++\C#这些语言,你会发现:
- C 程序是一组函数与数据类型
- C++ 程序是一组函数与类
- C# 程序的本质,则是一组类型声明
一个 C# 可执行程序(EXE)或动态链接库(DLL)的源代码,就是由一条或多条类型声明构成。
DLL没有Main程序入口,而可执行文件(EXE),代码中必须声明至少一个类,且该类包含名为 Main 的方法(程序入口).
一个大型的软件,可能源码里面有成千上万个类型(class等等),而且大型的项目可能有不同的程序员开发,每个人负责不同的模块,很难避免不会有同名的类型。那如何避免同名的冲突呢?这时候,就需要我们前面说的“命名空间”。
命名空间(namespace) 用于将一组相关的类型声明归类,并为这组类型赋予统一名称。由于程序本身就是一组关联的类型声明,开发者通常会自定义命名空间,将所有程序类型声明在其内部。
所谓命名空间,就是给一些类,增加一个分组名称。别的地方如果要访问这些类,需要带上这个分组名称。
就好比,在同一个班级里面,如果有两个同名同姓的同学,同学和老师可能会无法通过姓名来区别这两个同学,为了区别他们,可能会增加一些修饰词,例如A组的TOM同学,和B组的TOM同学,这里的A B就相当于命名空间。
下方代码展示了一个包含三条类型声明的程序,所有类型都定义在名为 MyProgram 的命名空间内。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloDemo // 声明一个命名空间
{
class A // 声明类型A(类)
{
void Fun1() //函数
{
// 程序逻辑
}
}
class B // 声明类型B(类)
{
void Fun1() //函数
{
// 程序逻辑
}
}
class C // 声明类型C(类)
{
static void Main(string[] args) //Main 程序入口
{
double pi = 3.14;
string webSite = "foxdevelop.com";
Console.WriteLine($"The Pi is {pi} and the website is {webSite}.");
}
}
}
Code language: JavaScript (javascript)
关于命名空间,我们后面的课程会详细讲解。
类型是模板
既然 C# 程序本质就是类型声明的集合,学习 C# 的核心就是学习如何创建、使用类型。因此首先要理解:
什么是类型(Type)
你可以把类型理解为创建数据结构的模板:它本身不是数据结构实体,但规定了基于该模板创建出的对象具备哪些特征。
类型只是一份 “图纸”,本身不占用存储内存;只有实例化后才会分配内存、存储数据。
类型是一个图纸,通过这个图纸创建实体对象。就好比类似是一个房子的图纸,通过这个图纸你可以盖一个个的房子。
一个类型由以下三部分定义:
- 名称
- 存储数据成员的数据结构
- 行为与约束
C#中,所有的都是类型,连内置的类型都是。
下面是两个内置的类型。short and int.
它的结构如下:
| short 类型 | int 类型 |
|---|---|
| 名称:short | 名称:int |
| 结构:占用 2 字节 | 结构:占用 4 字节 |
| 行为:16 位整型 | 行为:32 位整型 |
- 名称:标识类型(
int/string/ 自定义类名) - 存储结构:规定占用内存大小、字段布局(如
short固定 2 字节) - 行为约束:规定该类型支持的运算、取值范围、内置方法(如
int支持加减乘除,取值范围-2^31 ~ 2^31-1)
实例化(Instantiate)
拿着类型模板 new 出一个真实可用的数据对象
对象(object) = 实例(instance)
例如上面的int 和short 我们可以通过这些类型 去创建实例。下面是pi age nums 就是通过double int short这些类中的类型创建出来的实例了。
namespace HelloDemo
{
class Program
{
static void Main(string[] args)
{
double pi = 3.14;
int age = 12;
short nums = 23;
}
}
}Code language: JavaScript (javascript)
C#中,程序中所有变量、数据,没有例外都是某类型的实例,不存在无类型数据。
就好比上面的示例
示例 class C 是程序入口类,满足可执行文件要求:
- 属于命名空间
MyProgram下的自定义类型 - 内部包含静态无返回值
Main方法,是程序启动入口
C#中不止class一种类型
C# 所有可声明的类型:类 (class)、结构体 (struct)、接口 (interface)、枚举 (enum)、委托 (delegate)、记录 (record)
BCL(Base Class Library):.NET 内置标准类库,提供 int/short/string/List<T> 等系统预定义类型,开发者直接实例化使用。