您的位置:首页 > 编程语言 > C#

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

2016-12-22 21:10 344 查看
• 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 如
4000
果设置成静态的就必须显示声明。

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。

• 接口的特点

–接口是对继承单根性的扩展

–接口提供了一组规范,一个标准

–接口屏蔽了实现的细节

–方便多人协同开发

• 前后一致。如果两个对象的值没变,那么多次比较的值都应该是相同的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: