C#学习:初始类与名称空间

本节内容:

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它是用来解决这个比较复杂的依赖关系的,程序与类库是有一定的依赖关系的,底层的库你没有引用的话,你想用上层的库,你是引用不了的,

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习