1、代码规范
规则(法律,必须遵守否则报错)
• 语法
规范(道德,大家都喜欢有道德的人。)
• 注意释
• 骆驼命名:第一个单词首字母小写,之后的单词首字母大写userName、userPassword、realName…(普通变量(局部变量)、字段)
• 帕斯卡命名:第一个单词首字母大写,之后的单词首字母大写GetMax()、ChangeName()…(方法名、类名、属性名)
• 定义的变量或者方法名字要有意义。
• 方法名:动词。Write()、Open()、Close()、Dispose()、GetUserId()、…(方法都是要做一件事情)
• 变量名:按功能命名、按方法的返回值内容命名(userName=GetUserName();)
2、.net程序基本编写、执行流程(c#)
(1)编写c#代码,保存为.cs文件。
(2)通过csc.exe程序来将.cs文件编译为.net程序集(.exe或.dll)。此时的exe或dll并不是机器码(cpu不可理解)。【>csc/out:c:\a.exe c:\program.cs】
(3)程序运行时通过JIT编译(Just InTime)即时编译,将程序集编译为cpu能理解的机器码,这时cpu才能执行。(这个编译过程会与当前机器有关(根据当前机器的内存、cpu等))。
3、面向对象(OO)
什么是面向对象?一种分析问题的方式(增强了程序的可扩展性)。
面向对象三大特性:封装、继承、多态。
什么是类?什么是对象?类和对象的区别?如何写一个汽车类?
• 类是模具,创建对象的模具,抽象的。
• 类是一种数据类型,用户自定义的数据类型
• 类组成:字段、属性、方法、构造函数等
• 对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行为)
• 类中包含了数据(用字段表示)与行为(用方法(函数、功能)表示,方法为一块具有名称的代码)
this ,当前对象
练习:猜拳游戏。先分析类和对象。实现WinForm版本与控制台版本。
4、添加引用与导入命名空间的区别
(1)添加引用(前提)
• 添加程序集
(2)导入命名空间
• namespace (ctrl+ .或shift + alt + F10)
(3)为什么在另一个项目中建的类,添加引用后还是不能使用?(类的访问修饰符默认:internal,改成public)
“参数”与“返回值”
• 参数的个数、类型与返回值没有任何半毛钱关系。
5、封装
类和对象本身就是封装的体现。
1.属性封装了字段、2.方法的多个参数封装成了一个对象、3.将一堆代码封装到了一个方法中、4.将一些功能封装到了几个类中、5.将一些具有相同功能的代码封装到了一个程序集中(dll、exe),并且对外提供统一的访问接口。(属性名、方法名等。)
6、继承(是指类与类之间的关系。)
(1)车 (Vehicle)
• —卡车(Truck)
• 轻型卡车
• 重型卡车
• — 轿车 (Car)
• --小轿车
• 面包车
如何判断一个继承关系是否合理?子类isa父类。
Base Class→基类、ParentClass→父类
Derived Class→派生类、ChildClass→子类
(2)为什么要继承?继承带给我们的好处?
• 代码重用
• LSP里氏替换原则(通过代码说明一下,声明父类类型变量,指向子类类型对象,以及调用方法时的一些问题)、多态。(程序的可扩展性、灵活性)方法重写override。虚方法的原理:虚方法表。
• 子类继承父类的属性和方法,使创建子类变得很简单,实现了代码重用、以及多态。
• 类的单根继承性、传递性、继承时构造函数的问题。构造函数不能被继承。
(3)所有的类都直接或间接的继承自object。
(4)关于继承的那些事儿
protected
• 只能在子类内部和当前类内部中使用
• 可以在类内部以及所有子类中(内部)访问。
this:
• 1.作为当前类的对象,可以调用类中的成员。this.成员(调用成员,自己)
• 2.调用本类的其他构造函数。:this()(调用构造函数,自己)
base :
• 1.调用父类中的成员(在子类重写父类成员或者子类使用new关键字隐藏了父类成员时,调用父类成员)base点不出子类独有成员。
• 2.调用父类中的构造函数(调用构造函数,父类)
• 当调用从父类中继承过来的成员的时候,如果子类没有重写则this.成员;与base.成员;没有区别。如果子类重写了父类成员,则this.成员;调用的是子类重写以后的。base.成员;调用的依然是父类的成员。
子类构造函数必须指明调用父类哪个构造函数
类中的成员如果不写访问修饰符默认是private.
7、访问修饰符
共5种:
• private 当前类中可以访问,类中成员的默认访问修饰符。
• protected 当前类及子类中可以访问(在继承中用。)
• internal当前程序集内部可以访问
• protected internal当前程序集或子类中(不同程序集也可以访问)。
• public 任何地方
访问级别约束
• 子类的访问级别不能比父类的高。(会暴露父类的成员)
• 类中属性或字段的访问级别不能比所对应的类型访问级别高。
• 方法的访问级别不能比方法的参数和返回值的访问级别高。
8、虚方法virtual 实现多态的手段1
(1)Person→Chinese→American→Korean,每个国家的人都有一个说出自己国籍的方法。当有一个Person[]的时候,循环现实每个国家的人。
虚方法可以给父类中的方法一个实现,比如ToString()方法
虚方法必须有实现部分,哪怕是空实现。
(2)虚方法和抽象方法的区别。Abstrcat
• virtual方法表示此方法可以被重写,也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.
virtual方法可以直接使用,和普通方法一样
不是必须重写的. 子类可以使用base.方法的方式调用,无论有没有在子类使用override去重写
• virtual关键字只是明确标示此方法可以被重写,其实它和一般的方法没有什么区别
• 相应的sealed关键字标示此方法不可以被重写
虚方法和抽象方法的区别:
• 虚方法可以有实现体,抽象方法不能有实现体。
• 抽象方法要求派生类必须重载这个方法;
(3)子类重写父类方法时,必须与父类保持一致的方法签名与返回值类型。即:方法名、返回值类型、参数列表都必须保持一致。[访问修饰符也得一致]
“方法签名”:一般是指方法的【名称】+方法的【参数列表】,不包含方法返回值类型
9、静态成员-通过类名访问、实例成员-通过对象访问
(1)C#中声明的所有的变量都需要在类型中,不能在类型以外直接声明全局变量,与c或c++不同。没有全局变量的概念。
(2)静态成员是与“类”相关,而非与“实例”相关。
(3)普通类中的静态成员static
• 只能通过类名访问
• 静态方法中只能访问静态成员,或通过对象访问实例成员。
• 多个对象共享同一个静态成员。
(4)静态类(一般都用作工具类,里面都是一些工具函数)
• Math、Console、Convert等都是静态类。
• 静态类中只能包括静态成员
• 静态构造函数不能有参数、不能有访问修饰符(默认为private)。静态构造函数在第一次使用该静态类的时候只执行一次。
(5)静态成员属于类所有,非静态成员属于类的实例所有
(6)C#静态方法属于类所有,类实例化前即可使用
(7)在实例方法中可以直接调用静态方法,在静态方法中不可以直接调用实例方法
(8)静态方法和静态变量创建后始终使用同一块内存(静态存储区),而使用实例的方式会创建多个内存
10、多态。
(1)开放封闭原则(对修改封闭,对扩展开放。)
(2)多态就是指不同对象收到相同消息时,会产生不同行为,同一个类在不同的场合下表现出不同的行为特征
(3)多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
(4)里氏替换原则
• 父类引用指向子类对象Personp=new Chinese();(隐式类型转换)
• 父类对象不能够替换子类Chinesec=(Chinese)new Person();(×)
(5)is-a:可以用来验证继承关系中是否合理。(can do,验证实现接口是否合理*)
if(obj is 类型A)//obj是父类类型对象,”类型A”是子类类型。
(6)关键字as (类型转换)、is(通常类型转换前需要通过is来判断一下类型。)
11、实现多态的方式
(1)virtual,子类重写父类中的方法。
(2)abstract,子类重写父类中的方法。
(3)接口,实现接口的类,将接口中的方法实现。
12、怎么实现多态1-抽象类abstract
(1)抽象类不能被实例化。抽象类中可以有普通成员。
(2)抽象类存在的意义:1.抽象类不能被实例化,只能被其他类继承2.继承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除非子类也是抽象类。)3.抽象类就是为了重写→多态(代码重用)。4.抽象类中可以有实例成员也可以有抽象成员。
(3)什么是抽象类(光说不做)
• 不能被实例化的类(不能new)
抽象类的特点
• 见备注
练习2:计算形状Shape(圆Circle,矩形Square ,正方形Rectangle)的面积、周长
13、new(*)隐藏、截断(了解)
方法的隐藏
Swim方法是子类特有
class RubberDuck:Duck
{
//方法的隐藏
//子类特有的方法,只不过方法名和父类重名了
public new void Swim()
{
Console.WriteLine("swim被改变了");
}
}
如果一个方法在子类中被重写
Duck duck = new RubberDuck(); duck.Bark()调用子类的方法,因为被重写了。
抽象方法子类必须重写所以不能用new.
使用第三方dll的时候,原来没有SayHi方法,自己继承后加了个SayHi(),后来第三方dll更新,也加了个SayHi(),继承后的类中现在就得用new了。
14、设计模式(GOF23种设计模式)
各种设计模式的本质都是:多态。充分理解了多态,再看设计模式就会觉得轻松很多。