类是最基础的C#类型。类是一个数据结构,将状态(字段)和操作(方法和其他函数成员)组合在一个单元中。类为动态创建的类实例提供了定义,实例也称为对象。类支持继承和多态性,这是派生类可用来扩展和专用化基类的机制。
- 类构成程序的主体
- 名称空间以树形结构组织类(和其他类型)
(例如Button和Path类)
C#中的类暂不做过多介绍,主要记录下名称空间与类库。
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
上面代码中,Program类放在了一个叫做ConsoleApp1的名称空间里,这个名称空间默认与创建项目时是一样的,这样做是为了自己写的类用自己定义的名称空间组织起来,当别人用自己写的类时,对方也可以非常方便的从我们写的名称空间中,把类找出来。
主要记录下using的作用:
using的主要意思是,把名称空间引用到程序中,类似于Java中的导入包和Python中的import
示例:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello World!");
}
}
}
将之前代码中的using System删掉之后,再编译就会出现错误,原因就在于,删掉using System之后,程序找不到Console来源于哪个名称空间,这时候我们就必须在前面加上名称空间即System.Console.WriteLine("Hello World!");
类库的引用
- 类库引用是使用名称空间的物理基础
不同技术类型的项目会默认引用不同的类库
- DLL引用(黑盒引用,无源代码)
- 项目引用(白盒引用,有源代码)
DLL引用举例:
首先编写一个DLL文件,其源码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tools
{
public class Calculation
{
public static double Add(double a,double b)
{
return a + b;
}
public static double sub(double a,double b)
{
return a - b;
}
}
}
生成一个名为MyLibrary.dll的文件,然后,我们在引用中添加此类库
然后在代码中引用Tools这个名称空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Tools;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Calculation.Add(1.0,2.1));
}
}
}
结果如下:
再比如说,我们要通过引用带有窗口类的类库让前面的Hello World程序显示出窗口:
首先,要知道From这个类,我们用来写Windows窗口的Form就是System.Windows.Form这个名称空间里的Form,它所在的类库就是System.Windows.Forms.dll
第一步,我们要在引用中添加System.Windows.Form这个类库(一个dll文件);
第二步,我们要把System.Windows.Form这个名称空间,在代码中引用(即在开头加上using System.Windows.Forms;);
效果如下:
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Form form = new Form();
form.ShowDialog();
}
}
}
这样做的好处在于,引用dll文件不会再额外占用空间,程序执行到需要dll文件中的代码时,会执行dll文件,而不是像lib文件那样将dll文件中的代码复制到程序中(具体情况以后涉及到DllMain函数的时候再说)
这样做的问题在于,如果dll文件有错误,那么别人用我们的dll文件编写的程序也会出错,但别人没办法查看或者改变我们编写的dll文件的代码
项目引用
如果我们已有类库项目的源代码,我们就可以通过在我们所编写的程序的解决方案中添加这个类库项目,然后引用已有项目。
如下所示:
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Tools.Calculation.Add(1, 2));
}
}
}
一个项目可以隶属于不同的解决方案,我们称之为“项目的重用”
依赖关系(耦合关系)
- 类(或对象)之间的耦合关系
- 优秀的程序追求“高内聚,低耦合”
- “UML”(通用建模语言)类图
所谓“高内聚,低耦合”就是指功能高度集成模块化,通俗的讲,类似于一台电脑,输入功能就尽量都放在键盘鼠标模块上,临时存储就放在内存上。如果违反了这一规律,假如某一天鼠标没反应了,就必须检查是检查所有设备,非常麻烦,类似于防止“牵一发而动全身”