1、相关概念
1.1 类库
类的仓库,用来放命名空间和类。其实就是一个文件,将相关的东西组织在一起。类库是命名空间和类的物理基础,类库就好比是一个仓库,命名空间和类是仓库里面的物品,如果连仓库都没有,又何谈物品呢?
1.2 命名空间(namespace)
C#中的命名空间是一种用来组织和管理代码的机制,它可以将一组相关的类、接口、委托和其他类型组织在一起,避免命名冲突,提高代码的可维护性和可重用性。
牛顿说过,“如果我看得更远,那是因为我站在巨人的肩膀上”,在编程中,我们会使用别人写好的类库,试想一下,如果我们调用的两个类库中,存在相同名字的类,在我们用类创建对象或者调用类的静态成员时,电脑怎么知道我们调用的是哪一个类库中的类呢。在同一个文件夹下不能有同名的文件,不同的文件夹下可以有同名的文件,也是同样的道理。
可能就要问了,为什么不给不同类库中的类取不同的名字呢,这样不就可以避开这个问题吗。首先,不同类库由不同的程序员编写的,难免会有名字的重复;其次,就是为了简单方便了,比如说在web开发和windows桌面应用开发中,都会用到Button类,即按钮,如果不采用命名空间,那我们就需要给Button命不同的名字加以区分,如WebButton和WindowsButton,很显然,名字变长了,程序员需要记忆的名字也变多了。
官方定义:命名空间组织在程序集中定义的对象。
1.3 类(class)和对象(object)
在C#编程指南中的定义是这样的。
- 类:“类”是一种构造,通过使用该构造,您可以将其他类型的变量、方法和事件组合在一起,从而创建自己的自定义类型。类就像一个蓝图, 指定该类型可以进行哪些操作。
- 对象:对象是基于类的具体实体,有时称为类的实例。从本质上说,对象是按照此蓝图分配和配置的内存块。
对于初学者,这个定义挺难理解的。
类是对现实世界事物进行抽象所得到的结果,也就是说类是对现实世界中的一个具体的东西比如汽车,抓取主要要素后(因为汽车太复杂了,只能选主要矛盾,丢掉次要矛盾)建立的模型。
对象是对模型的应用。
这里举一个例子——“汽车”和“一辆汽车”。
- 汽车(类):只是一个概念,是不同于列车和飞机的概念,汽车有它的参数(变量)如长、宽、高、质量;汽车有它的功能(方法),如驱动、制动、转向;汽车有AEB自动紧急制动系统,当传感器感知障碍物距离近时,会触发制动系统(事件)。汽车这样一个大的概念将小的概念组合到一起,形成了汽车,小的概念也将汽车和列车和飞机区分开来了。所以说,类指定该类型可以进行哪些操作,也就是说,类的作用是先告诉你它能给你提供什么,等到你真的需要使用时,知道怎么用。
- 一辆汽车(对象):说的是现实世界中真的有这么一辆汽车实物,它是汽车这个概念的实物化(实例化),你可以利用它提供给你的东西(变量,方法,事件…)满足需求。
2、Hello,world
2.1 命名空间和类
打开visual studio,创建一个 C#控制台应用 项目。
“class”后面水蓝色的“Program”就是类名,“namespace”后面的“Test”就是命名空间的名字。
在Main函数中输入一行代码,代码实现在终端打印“Hello,world”。会发现,“using System”从原来的灰色变成了高亮,这说明System命名空间在代码中用到了,也就是说Console是System命名空间下的一个类。“Console.WriteLine”说明“WriteLine”是“Console”类的一个静态方法。
点击Console,右键,“转到定义”,快捷键F12。
“Console”类放在了“System”命名空间下,意思是说,Console类用System这个命名空间组织起来了,当我们想用这个类时,可以很方便的从名称空间中把这个类找出来。
我们也可以把“using System;”删掉,这时候在代码中直接写Console就会报错,这是因为visual studio并不知道Console是什么,那么我们就需要把命名空间带上。
所以,从这里就可以看出“using System;”的作用了,当程序中只有一条打印语句时,没关系,我们可以写全称(权限命名)“System.Console.WriteLine(“Hello,world”);”,但是,如果程序中有很多个地方需要打印,那么每次这样写就很麻烦,先在程序的开头引入命名空间,在后面就可以省略命名空间(比如当程序中用到Console类时,vs会从所有引用的命名空间中检索,当找到System命名空间时,找到了Console类,就可以了),简单很多。
2.2 类和对象
右键“引用”,“添加引用”,输入System.Windows.Forms类库名,打对勾,确定。这样,就引用到了winform类库了,类库中包含命名空间和类。
引用命名空间System.Windows.Forms,命名空间下有一个Form类,它继承于ContainerControl类,Form类中有很多函数,我们调用其中的一个函数ShowDialog,用来显示一个窗体。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; //引用命名空间
namespace Test
{
class Program
{
static void Main(string[] args)
{
Form f1 = new Form(); //new 分配内存;Form() 构造函数,初始化Form类的新实例
f1.ShowDialog(); //调用对象的方法
}
}
}
我们可以打开System.Windows.Forms类库具体来看看,双击类库,打开对象浏览器,可以看到类库中有7个命名空间,打开System.Windows.Forms命名空间,可以看到它的成员。
那么我们就知道了,在创建项目时,不同类型的项目的本质区别在于,会引用不同的类库。