本节内容:
1.初始类(class)与名称空间(namespace)
这个定义过于复杂。
类(class)构成程序的主体。具体的解释很复杂,要资深开发人才能看的懂,我们先记住这句话。
什么是名称空间呢?比如我们有了1000个类,我们把1000个类搁在一起,你想使用其中一个类时,你会发现找起来很麻烦,那这就相当于你有1000本书,你把1000本书堆在屋子里,没有分门别类,那你想再去找一本书时那就比较麻烦了。名称空间就是把类用良好的结构组织在一起。起这样的一个作用。
比如图书馆,它把书分好大类A,B,C......开头,大类里面又有小类,比如a1,a2.....你想找一本书,在这个索引单上看各自的类就可以准确找到位置,非常多书的情况下,有些书是重名的,名字是一样的,但是是不同的学科,所以名称空间可以有效的避免同名类的冲突。
我们看上一篇博客写的代码:
program的类是我们自己写的,这个类就代表了我们的程序,我们C#语言是完全面向对象的一种语言,用这个语言编程时,你的程序本身就是一个类。C语言是没有类的,程序入口直接就是int main,没有 归在那个类里面。C#是完全面向对象的,所以说main入口也要包含在类里面。
Console 这个类不是我们写的,而是微软准备好的,我们拿来可以直接用,我们现在用的是类里边WriteLine这样的一个方法,这个方法可以帮我们把一个字符串写到我们的输出窗口上,WriteLine就是写一行。
我们接着认识名称空间,看上面namespace Console_Helloword,意思是我们编写的这个叫做program的这个类,放在了一个叫做hello world 这样的一个名称空间里面,这个名称空间默认跟我们创建的project的时候是一样的。
为什么这样做呢,意思是我自己的类我用自己定义的名称空间组织起来,当别人想用我们的类时,它也可以非常方便的从我的名称空间把这个类找出来。
using的意思是说把我的名称空间引用到我的程序里面来,下面我们做一个小实验。我们把上面的using全部删掉,
我们 的程序已经不认识Console,也没有自动提示,还有出错的波浪形,为什么这样呢?是因为我们现在的程序不知道这个Console到底来源于哪个名称空间,刚刚前面有using的时候,相当于告诉程序,如果我要写一个类的时候,没有把这个类的名称空间是哪个标出来的时候。你就从我引用的这些名称空间里去检索一遍,看看哪个名称空间有这个类,如果有这个类的话,你就用这个名称空间里边的这个类就可以了,而现在我们所有的名称空间都全部删除了,所以说我这时再去敲这个console这个类时,我的程序或者我的video Stdio就不知道这个console来自哪个名称空间了,
而实际上,我是知道的,我的知识高数我这个console这个类,它是来源于一个叫做System这个名称空间,花括号就是名称空间的标记
这时我再敲Console的话,它是能认出这个类,类的 标记是一个小方块,一个树形结构,意思是说这个类和类之间是有继承关系的
重新变为水蓝色说明它认出来了system 这个名称空间里边的这个console类,
此时运行一下:
结果跟我们之前写的是一样对的,
我们再写一行,同样继续打印Good morning
通过这个例子,我们也发现一个问题,我每次想用这个console这个类的时候,那我必须前面加上它的名称空间的名字system.写多了的时候,我们会觉得很累,所以有没有 让程序简化呢,我写一行console,他就知道是从System这来的呢?当然可以,
所以知道引用名称空间的重要性了吧,所以软件就已经把我们常用的5个名称空间之间引用进来了,避免了我们手动去把它引用进来了。
我们介绍一个小技巧,上面是我们知道console这个类是System这个名称空间,如果说写一个console这个类,我不知道它是来自哪一个名称空间,下面介绍两种方法。
1.通过文档来知道,
怎么通过文档来知道呢?
我们可以看到这个名称空间里边有非常多非常多特别重要的类,你想这个名称空间名字叫做system,它代表操作系统,与操作系统打交道的一些重要的类都在这个名称空间里边,那么我们未来编程,也会频繁地使用到这个名称空间里边的类,
当然这个system这个名称空间还有很多子名称空间,具体的去帮你完成一些跟操作系统打交道的一些详细的这个任务。
但是我们会发现一个问题,你点开Console的时候,,这里边有很多Console的类 ,而且都在System这个名称空间里边,有时候你会蒙,到底我去选哪一个呢,下面我们介绍一个比较简单的方法,
点击带电灯泡的,这个叫智能标记,快捷键 Ctrl+.
会出现下面的选项, 第二个选项用它的全限定名,点一下他给你标记System,说明他很智能,它猜出来你的Console这个类是在System名称空间里边的那个console类。
如果你点using System,他会把using System加在我们程序的开头。
那是不是我们把所有名称空间都引用进来,会不会更好呢,这样的话我敲什么类他都能认出来,
其实不是这个样子的,我们的名称空间是以树形的结构来组织我们的类,让类分门别类,我们之前也说过了,类像一本书,有的书是可以重名的,所以有的类可以是同一个名字,但是他又不属于同一个类别,我们是通过名称空间把这些书能够分隔开,如果你把所有的名称空间都引用进来,书的书名一旦冲突了,就不知道是哪一个名称空间,我们举个例子
我们敲Path这个类,它是来自全限名为System.Windows.shapes这个名称空间, 你通过这个名称空间,你可以猜出来,它是系统里边有个叫做windows这个名称空间,就是给windows编程的这样一个名称空间,shape是形状,形状里面有一个叫path的,我们知道,我们的画板可以画多边形,path就是用来画多边形的,
但是我们还有一个System.IO.Path,这个path是我们文件的路径,比如我们平时想要去访问文件,硬盘里边的文件:比如C:\window\System32\mytest.txt这个也是path,这是文件的路径,与我们刚刚那个多边形的path是完全不一样的,而我们也都知道,我们编程时,要把我们图形程序的图形保存到硬盘的某个地方去,这个时候我们既要用画多边形的path类,也会用到存文件路径的path类,
此时出现了报错,程序发现有两个叫path类,你分别把他们的名称空间引用进来了,我到底用谁呢?
所以这个时候你不得不重新的去考虑使用全限定名,
实际上,我们名称空间之所以用它,就是为了同名的类不冲突,现在如果把它都引进来,这些类就冲突了,失去了他的作用。
2.剖析Hello,World 程序
类与名称空间放在哪个地方呢?换句话说,如果我们想看一本书,如果你知道他的名称空间,可是图书馆没有,你看得到吗?答案是看不到。
所以类和名称空间是放在一个叫做类库的这个东西里边。
类库就是我们这个类和名称空间的物理基础。如果你没有这个类库的话,即使你知道这个名称空间与类,也没法使用它们,
类库的引用
- 类库的引用是使用这个名称空间的物理基础
- dll ( dynamic link library)动态链接库
我们举个例子
创建一个wpf程序,写入一个Button ,根据提示,说明程序认识到了这个类,提示指出来了它的名称空间,也说明了它引用了一个类库,下图打开的窗口叫做对象浏览器。
确实,我们在类库里面找到了button这个类
这是VS给我们引用的类库
如果我们自己想去引用一个类库怎么办,下面我们来展示一下这样的一个例子。
日常生活中对类库的引用就两种方式。一种方式是对编译好的dll直接引用,这种引用也叫黑盒引用,因为我们这个dll的源代码,还有一种方式我们有这个类库的源代码,然后我们对源代码进行引用,源代码放在项目里面,也叫项目引用,也叫白盒引用,
1.DLL引用(黑盒引用)
黑盒引用有问题,如果代码里面有错的话,我们是无法修改这个错误的,我只能告诉编写这个类库的人,
2.项目引用(白盒引用)
我们搜索一下form类,看到上图所示信息。回到Vs
可以看到,这是一个命令行程序,不需要窗口,因此我们发现并没有form 的程序集
下面我们把窗口的程序集加进去。这样我们就可以用窗口类了。
这时我们发现,这个类库被引用进来了,
Form有哪些功能,我们去查MSDN文档, 可以看到很多属性,很多方法,说明这个类很强大。
我们可以找到一个叫Showdialog的方法,可以看看他是怎么用的
写入一下程序
可以看到出现了窗体。
3.使用NuGet对dll的引用
NuGet它是用来解决这个比较复杂的依赖关系的,程序与类库是有一定的依赖关系的,底层的库你没有引用的话,你想用上层的库,你是引用不了的,