初识类与名称空间

//此文为在BiliBili大学学习刘铁猛刘老师的C#课程的笔记,刘老师的课程对于我一个初学者来说,看了之后可谓是茅塞顿开。此文目的是供个人学习和复习使用,并无侵权之意,也无为他人师之心。本人目前只是大一学生,仅有微薄的C语言基础,水平有限,难免对刘老师的课程内容有所曲解,欢迎大家指正和教导,希望各位不吝赐教。//

剖析hello world程序:初识类和名称空间

引、解决方案(solution)和项目(projecj)

        打个比方来说,我们遇到了一个难题,我们的解决方法即是解决方案(solution),而立刻给出一个完整的解决方案是很困难的,我们可以把这个难题拆开成一个个小问题,解决这些小难题的方法就是项目(project)。

  一、类的定义:

        1.C#语言文档中给出的类的定义:

                类(class)是最基础的 C# 类型。类是一个数据结构,将状态(字段)和操作(方法和其他成员)组合在一个单元中。类为动态创建的类实例 (instance) 提供了定义,实例也称为对象(object)。类支持继承(inheritance) 和多态性 (polymorphism),这是派生 类(derived class) 可用来扩展和专用化基类 (base class)的机制。

        2.初学者需要了的类的定义:

                类(class)是构成程序的主体

                图中program和console均为类,其中program是我们自己编写的。C#是完全面向对象的语言,你正在编写的程序,也是一个类。而C语言中是没有类的,main函数也自然无需包括在类中,而C#语言中,即使是程序的入口点Main方法(函数),也需要包含在类中。

        二、名称空间(namespace)以树形结构组织类(和其它类型)

        1.类和名称空间的关系:倘若我们把 类 比作一本书, 名称空间 比作书架,同一种书放在同一个书架上,同一种 类 放在同一个名称空间里,这样,当我们想使用一个类的时候,我们通过查找不同的名称空间,就能很快找到该 类,即使有两个类名字相同,但如果他们分别属于不同的名称空间,我们也能分辨他们。

          如下图,namespace example表示我们正在编写的 类 是被包括在一个叫做example的名称空间里。我自己写的类,用我自己编写的名称空间组织起来,当别人想使用我的类的时候,通过引用我的名称空间,可以方便的查找和使用我的类。

        2.名称空间的引用: 

        当我们需要引用一个名称空间的时候,我们可以使用using+名称空间的名字来对其进行引用。当我们想使用一个 类 的时候,将 类名 打出来后,编译器会在引用的名称空间里检索该类,从而使用它。

图中的Console类便属于System这个名称空间。

而当我们不对名称空间进行引用时,如我们删除using System 后,会发现Console下出现了红色波浪线,这意味着,如果我们不对名称空间加以引用直接使用类名的话,编译器是找不到该 类 的。

如果我们不使用using对一个名称空间进行引用,也有方法访问该名称空间里的类。

 如图所示,使用 名称空间名 加 "." 访问符 ,也可以对名称空间里的类进行访问

 但倘若我们需要多次使用Console.Writeline这个类,那么我们每次都需要在其前面加上"System.",相比使用using,麻烦许多。

        2.查找类所属的名称空间:

        如果我们不知道一个类属于哪个名称空间,我们可以在help中选择view help,来看visual studio的文档,在index中搜索该类(.netframework),从而找到其属于的名称空间。

我们也可以把鼠标放在画了红色波浪下线的类上,智能提示会为你提供选项。

        倘若我们将所有的名称空间都引用进来,是不是就没有寻找类所属的名称空间的烦恼了呢?并不,在不同的名称空间内,可能会有名字重复的类,那么当我们需要使用该类时,编译器会报错。这个时候,我们在考虑使用 “名称空间.类”,来区分不同的类。

        三、类库

        1.类和名称空间放在类库中,可以将类库看作是一个图书馆。

        2.如何为自己的项目添加对其他类库的引用?

        一旦类库之间互相引用,它们之间就产生了依赖关系,依赖关系在软件质量中起着重要的作用。(依赖关系在后文中会提到)

        (1)引用类库的必要性

        当我们想使用的类并不在现有的名称空间内,我们可以引用不同的类库,类库引用是名称空间的物理基础,如果你没有引用该类库,那么即使你知道一个具体的名称空间和类,你也无法使用它们。不同技术类型的项目会默认引用不同的类库。

        (2)一个类库是否被引用,我们可以在解决方案资源管理器中的 引用 中去查找,如下图所示,在其中寻找是否有我们需要的类库即可。

 

        倘若我们双击一个类库,我们则会跳转到对象浏览器

从而查看这个类库中的名称空间和类

        (3)那么我们想要自己去引用我们需要的类库我们应该如何做呢?

            ①一种是:DLL引用,也即黑盒引用。

               简单来说就是对他人已经写好的类库进行引用,对于这种类库我们并没有其源代码。通常,我们需要一个类库时,我们在MSDN文档中去查找,在检索(index)中找到我们需要的类所在的类库。接着右击"引用(references)",添加引用,在程序集(类库项目编译为 .DLL程序集 )里搜索你想使用的类库,然后添加即可。

(DLL,动态链接库英文DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。)

                如:我想要寻找一个form的类,我们通过MSDN文档找到该类所在类库名

 

然后对其输入查找引用即可,当我们需要使用该类库里的类,按照上文中所讲述引用类的方法去操作即可。

        但如果我们使用的类库 依赖于 其他未被引用进来的 更底层的类库,我们对程序进行编译,那么编译器会报错,所以我们需要不断对更底层的类库进行引用,倘若这个更底层的类库还依赖于更更底层的类库呢?这样下去,我们所引用的类库则会越来越多。因为你只有DLL,没有源代码,几乎可以说是“蒙着眼睛引用类库”,这是是很危险的!特别是对于大型项目来说。有没有更好的解决方式呢?

答案是肯定的,当一个类库被编写时,开发者可以将改类库所依赖的类库和该类库以一种“包”的形式发布到网上,那么当我们直接去引用该包的时候,便不需要不断引用类库,非常滴银杏,安全,高效。此即为Nuget技术,具体操作如下

搜索到想引用的包之后,下载并添加即可。

                ②另外一种则是:项目引用,也叫白盒引用。

                该引用方式我们对类库拥有源代码,而源代码需要存放在项目之中,所以称之为“项目引用”。

        引用方法:

                假设我们的朋友发给我一个solution,其中包含有我所需要的项目。

                我们点击 reference—add reference—项目—解决方案(solution),但是如下图所示,编译器并没有找到任何项目,这是因为我们当前的solution并没有包括我们想使用的项目,我们需要在我们的solution中包含该项目后,才能使用该项目。

那么这个当我们想要把需要的项目包含在我们的解决方案中,便出现了一个问题。

该项目原来被包含在我朋友的solution中,但是现在如果我们想要使用该项目,那么我们能否再将其包含在我们的solution中呢?答案是可以的,此即为"项目的重用"。

该项目添加到我们的solution中方法如下:

我们添加了该项目之后,我们的solution中便会出现两个项目,一个是自己的,一个是后引用进来的,如下图所示

接着我们可以在我们的项目中,点击reference—add reference—项目—解决方案(solution),添加该项目即可。

 

 倘若我们要添加一个自己编写的项目呢?可以如下图所示操作

我们选择class library,这个class library编译出来的不是可执行的文件,它编译出来的结果就是dll,即类库。

然后再我们的solution中包含该项目即可

 四、依赖关系

        1.依赖关系:类(或对象)之间的耦合关系

                类和类之间,类库和类库之间都有着依赖关系,如果底层的类/类库有问题,那么上层的类/类库工作也会有问题。

        2.优秀的程序追求高内聚,低耦合。

                高内聚:一些数据/类,该属于哪个类,就把它放到哪个类中。

                低耦合:类/类库之间的依赖关系尽可能的低。

                (教学程序往往会违反这个原则)

 用图的形式把我们程序中的一些关系,表达的非常非常清楚(除了上面的类图,还可以画流程图,序列图等),类图用来展示类和类之间的关系。以HELLOWORLD程序来说,在Program中的Main方法中,我们调用Console这个类中的WriteLine方法,这就是一种非常紧的耦合关系,因为如果WriteLine方法出问题,那么我们的Program类也无法正常工作。

五、排除错误需要找到root cause,切忌补丁上面打补丁

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值