.NET学习笔记(3)——深入.net平台和C#编程

来源:互联网 发布:深圳平湖淘宝客服招聘 编辑:程序博客网 时间:2024/04/30 08:29

• C#不直接访问类的数据,通过访问器访问(get,set)
• 属性的类型和字段类型必须一致。

静态方法和实例方法比较:
静态方法 实例方法
static 关键字 不需要static关键字
使用类名调用 使用实例对象调用
不可以直接访问实例成员 可以直接访问实例成员
不能直接调用实例方法 可以直接访问实例方法、静态方法
调用前初始化 实例化对象时初始化

构造函数:
– 是在创建给定类型的对象时执行的类方法。
– 构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
– 每个类中都有一个默认的不带参数的构造函数。
– 构造函数必须是在类里的一级声明,并且命名为类名。
– 形式为:修饰符 类名(参数类型1,参数名1,…)

常量赋值
const 类型 常量名 = 常量值
– 声明一个常量: 在声明时候赋值,一旦赋值一次后在整个程序运行周期这个值不可改变,即定值的变量。
readonly关键字
‒ readonly 允许把一个字段设置成常量,但可以执行一些运算,可以确定它的初始值。
‒ readonly 是在计算时执行的,它可以用某些变量初始化。
‒ readonly 是实例成员,所以不同的实例可以有不同的常量值,这使readonly更灵活。

• readonly 关键字与 const 关键字不同。
1. const 字段只能在声明中初始化;readonly 字段可以在声明或构造函数中初始化。根据所使用的构造函数,readonly 字段可能具有不同的值。
2. const 字段是编译时常数; readonly 字段可用于运行时常数。
3. const 默认就是静态的;readonly 如果设置成静态的就必须显示声明。
4. const 对于引用类型的常数,可能的值只有string 和null; readonly可以是任何类型。

• 枚举定义:
访问修饰符 enum 枚举名 {值1,值2… }
– 枚举是一组描述性的名称
– 枚举定义一组有限的值,不能包含方法
– 对可能的值进行约束
– 枚举允许描述性名称表示整数值

• 结构与类的区别
相同点:
都可以实现接口
都可以包含字段、方法
不同点:
结构体 类
结构中给字段赋值是错误的 类中可以给字段赋值
创建对象可以不用new 创建对象必须使用new
可以添加构造函数,但它们必须带参数 可以添加无参的构造函数
不可以有默认构造函数 可以有默认构造函数
不能被继承 可以被继承
值类型 引用类型

值类型:
基本数据类型:整型:int、长整型:long、浮点型:float、布尔型:bool、字符型:char
枚举类型:枚举:enum
结构类型:结构:struct

引用类型:
类:基类:System.Object、自定义类:class、字符串:string
接口:interface 接口
数组:int[],string[]

• ArrayList
– 如果想要让一个‘数组’存放各种类型的实例,比如有Cake,Juice, Bread,那么就用ArrayList
– ArrayList food=new ArrayList();
• 这里没有指定它装的是什么类型的元素,在‘取’的时候,ArrayList里元素默认是Object类型的,所以需要强制转换一下。

面向对象的三大特性
–封装
• 隐藏内部实现,稳定外部接口
–继承
• 子类继承父类成员,实现代码复用
–多态
• 不同子类对同一个消息作出不同的反映

• 什么是多态
– 指不同对象收到相同消息时,会产生不同行为
• Student和Teacher类SayHi的内容不同
– 同一个类在不同的场合下表现出不同的行为特征
• Person类,在Student和Teacher类这两种场合的行为不同

有抽象方法的类必然是抽象类

• 抽象类
–抽象类用来列举一个类所需要的行为
–抽象类不明确提供具体实现方法
–抽象类必须由其子类实现它的抽象方法(除非子类也具有抽象性)
–抽象类不能被实例化
–抽象类不能是密封或静态的
–抽象类不能用sealed和static修饰
一个典型例子就是接口。

实现抽象方法
public override void SayHi()
{
//… 具体实现内容
}

• 抽象类的应用
–抽象类和抽象方法实现多态性
–父类提供一系列规定, 约束子类的行为
–父类可以提供一些共性的行为

• 里氏替换原则(LSP)
如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象
o1都换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。

子类可以扩展父类的功能,但不能改变父类原有的功能。

里氏替换原则(LSP)
–子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
–子类中可以增加自己特有的方法。
–当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更
宽松。
–当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

• is与as操作符
– is 检查对象是否与指定类型兼容
例:if (person[i] is Student)
– as 用于在兼容的引用类型之间执行转换
例:Student stu = Students[i] as Student;

• 当类中的方法声明前加上了virtual修饰符,我们称之为C#虚拟方法 ,反之为非虚。
• 使用了virtual修饰符后,不允许再有static、abstract或override修饰符。
• 对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。

虚方法与抽象方法:
抽象方法 虚方法
只能在抽象类中 除了密封类都可以写
必须被子类 override 可以被子类 override
不允许有方法体 要有方法体,哪怕是一个分号
用 abstract 修饰 用 virtual 修饰

• ReferenceEquals()是一个静态方法,测试两个引用是否指向类的同一个实例,即两个引用是否包含内存中的相同地址。
• System.Object提供了Equals()虚方法,比较是两个引用是否指向的是同一对象。
• == 是比较的引用的地址是否相等

重写Equals()四大原则:
• 自反。x.Equals(x)必须为true。
• 对称。即x.Equals(y)和y.Equals(x)必须返回同样的值。
• 可传递。即如果x.Equals(y)和y.Equals(z)都返回true,则x.Equals(z)也返回true。

• 接口的特点
–接口是对继承单根性的扩展
–接口提供了一组规范,一个标准
–接口屏蔽了实现的细节
–方便多人协同开发
• 前后一致。如果两个对象的值没变,那么多次比较的值都应该是相同的

0 0
原创粉丝点击