//此文为在BiliBili大学学习刘铁猛刘老师的C#课程的笔记,刘老师的课程对于我一个初学者来说,看了之后可谓是茅塞顿开。此文目的是供个人学习和复习使用,并无侵权之意,也无为他人师之心。本人目前只是大一学生,仅有微薄的C语言基础,水平有限,难免对刘老师的课程内容有所曲解,欢迎大家指正和教导,希望各位不吝赐教。//
一、类(class)是现实世界事物的模型
1.对类的认识:
类是面向对象过程中的核心内容。
类是对现实事物进行抽象所得到的结果。
如下图所示,左边是现实世界,右边是代码。
战斗机能起飞,降落,攻击敌人,拥有其自己的型号等。经过抽象,我们将其抽象了"jetfighter"这个类,这个类也具有同样的内容,起飞,降落,攻击敌人的方法,有飞机的型号等属性。
如果我们是对现实世界的一个单一的事物进行抽象,那么我们会得到这个事物所对应的类。
如果我们对现实世界的一个系统进行抽象,除了能得到这个系统中的事物对应的类,还能得到这些类之间的关系。
2.类与对象的关系
对象也叫实例,是类经过"实例"化后得到的内存中的实体
类对应的是现实的一个事物,而事物是一个概念类的东西,而对象(实例)是类经过"实例"化后得到的内存中的实体,这个实体对应的是现实中一个具体的个体。
或许仍旧有些晦涩难懂,我们举一个例子:
class BOY;
我们创建了一个BOY类,假设该类对应的是现实世界中的男孩这一整体概念。
class aBoy = new class();
那么我们创建一个对象(实例)就是在男孩这一宽泛的概念中,明确了具体的一个男孩。
有些类是不能实例化的,例如"数学"(Math class),我们不能说:一个数学。
3.什么是实例化?
依照类,我们可以创建一个具体的对象,这就是"实例化"
4.使用new操作符创建类的实例
下面是一个使用new操作符创建Form的实例
我们在引用中添加System.Windows.Form,并使用using System.Windows.Form。
Form在现实世界中是表单,经过抽象后,成为Form这个类,其对应现实世界表单这个概念,我们想要显示一个表单, 表单这一概念 是无法显示的,我们必须将这个表单实例化。
如下图
为了得到一个Form的实例,我们使用new操作符,并在该类后添加"()",为什么要添加该圆括号呢?这个圆括号表示当你的实例在内存中诞生后,用怎样的方式对其进行初始化。现在先不涉及构造器相关知识,只需要记住:创建类的实例,需要使用new操作符,并在类后添加"()"。
运行后,运行结果一闪而过,为了显示运行结果,我们使用showDialog对其进行显示。
运行结果如下,可见,一个表单被显示了出来。
5.引用变量与实例的关系(这个概念十分的重要,它会贯穿你未来的学习和工作)
如果我们想在表单头上显示文字,我们应该怎么做?如下图所示。
这样是不是就能使表单头上显示我想显示的文字呢?
我们运行一下,结果如下。
我们发现:事与愿违,分析一下代码。
(new Form()).Text = "My Form";
这段代码中,我们创建了一个Text为"My Form"的Form类实例。
(new Form()).ShowDialog();
而这段代码中,新创建了一个Form类实例,这个实例和上面的那个实例并不是一个实例,所以我们ShowDialog出来的表单并没有My Form。
那么我们有没有一个办法去操作同一个实例呢?这个时候我们就引入了一个"引用变量"的概念。
如下图所示
Form myForm;
(创建了一个Form类的引用变量)
myForm= new Form();
(对Form类进行实例化,并将 该实例 赋给myForm这个变量,即用 引用变量 引用我们新创建的实例。)
这次我们运行一下
由此可见,我们可以通过引用变量,对一个实例进行多次访问。
那么下面我们看看引用变量与实例的关系
其关系好比:孩子与气球;
引用变量为孩子,气球为实例。
我们可以让孩子牵着气球,这个牵的动作是通过"="赋值操作符来完成的。
但气球不一定有孩子牵着,如果我们有一个气球,没有孩子牵着,那么该气球就飞了,如图。
在我们的内存中,有一个叫做内存垃圾收集器的东西,这个创建的实例没有被引用变量引用,那么该实例就会被内存垃圾器回收掉,该实例的内存就被释放掉了。
多个孩子可以使用各自的绳子牵着额同一个气球,如下图所示。
我们验证一下
运行结果
也可以通过一根绳子牵着气球,这个例子老师说会在后续课程讲到"ref"时讲这种情况。
二、类的三大成员
1.三大成员
(1).属性(Property)
用来存储数据,属性组合起来表示 类或对象 当前的状态。
比如:现实中有人这个概念,我们抽象成person这个类之后,它可能有很多很多的属性,其中有三个属性,身高,财产,颜值。
假设身高1.88m,财产好几个亿,颜值评分9分。那么,这个对象的状态就是高富帅。
(2).方法(Method)
由C语言中的函数(function)进化而来,表示类或对象"能做什么"。
工作中90%的时间实在与方法打交道,因为它是"真正做事","构成逻辑"的成员。
(3).事件(Event)
类或对象通知其他类或对象的机制,为C#所持有(Java通过其他办法实现这个机制)
善用事件机制非常重要,但不要滥用。
事件和方法这两个成员后续会更清楚的讲述。
2.某些特殊类或对象在成员方面侧重点不同
模型类或对象重在属性,如Entity Framework;
工具类或对象重在方法,如Math,Console;
通知类或对象重在事件,如各种Timer;
3.类的静态成员与实例成员
静态(static)成员在语义上表示它是"类的成员"
实例(非静态)成员在语义上表示它是"对象(实例)的成员"
静态成员是指这个类与生俱来的,只要这个类被抽象出来之后就具有的类。
举个简单例子,如果我们把现实世界人抽象成HumanBeings这个类,那么这个类可以有哪些成员呢?比如他的属性成员可以是总数,又或者人口数量增长,这些属性对这个类是有意义的。但是呢,我们发现这些属性成员并不隶属于具体的某个对象,我们不能说一个人的总数,不能说一个人的人口增长。所欲说,静态成员在语义上隶属于某个类,而不是某个具体的对象。
那么实例成员,就是隶属于某个具体的对象,而不是一个类。
比如人有具体的身高,体重,这些是具体的人的属性成员。如果身高体重反映在人这个类上,应该是,平均身高,平均体重。
所以在抽象一个类的时候,要分清哪些成员,方法,事件,是隶属于一个类的,哪些是隶属于一个实例的。
在MSDN文档中,在某个成员下面有S这样的字样,那么说明该成员是静态成员。
同样的,我们可以看到Form的静态成员,有方法,有类,这些都是它的其他的具体成员。
在下面这个图中,创建了一个实例"myForm",我们通过"."访问 这个实例 的 实例成员。
倘若我们通过 类 来访问 实例成员 ,如下,编译器会报错
4.绑定(Binding)指的是编译器如何把一个成员与类或对象关联起来
不可小觑的"."操作符——成员访问
早绑定,编译器在编译的时候就知道了某个成员到底是隶属于类还是隶属于某个具体的对象
晚绑定:编译器不管这个事情,在程序运行起来之后,由程序员决定这个成员到底属于谁。
有晚绑定的语言往往叫做动态语言。
5.使用MSDN文档
我们把光标放在某个类上,按下F1键,VIsual Studio会自动为我们打开MSDN文档,并且直接定位到我们这个类所在的页面。
比如把光标放在Form类上,按下F1,我们会定位到下面这个页面。
这张图最下面一行,用一句话描述这个类是干嘛用的
而下面这张图则是这个类的继承列表,我们可知这个类是从它的哪个父类继承而来,和它派生出了哪些类
下图,Namespace告诉我们这个类所在的名称空间,而Assembly告诉我们要是想使用这个类,则需要引用该类库。
下面这张图是声明该类所需要的格式
下图,其中constructors即我们在创建一个实例中后面的()
下图,该类的属性,这些属性要么存储某些值,要么表示该类的状态
下图,该类的方法,表示该类能做什么。
下图,事件
下图,remark部分用一段文字详细的介绍了该类的功能