面向对象编程(Object-Oriented Programming, OOP)的基本思想是:将数据及处理这些数据的操作都封装到一个称为类(class)的数据结构中。
一、类和对象
1. 类的声明
[类修饰符] class 类名[:基类类名]
{
//字段
//构造函数
//方法
//属性
//…
}
注意:和 C++ 不同,C# 不将类的声明与实现分开。不会区分头文件和实现文件的区别,声明和实现通常出现在同一个文件中。
2. 对象的声明
类名 实例名 = new 类名([参数]);
如:Student stu1 = new Student();
3. 类的成员
(1)数据成员:字段、常量
(2)函数成员:属性、方法、运算符、索引器、构造函数
二、字段和属性
1. 字段:又称域,代表与对象或类相关的变量
[字段修饰符] 字段类型 字段名;
2. 属性
(1)获取或修改字段的值,提供对类或对象性质的访问
(2)get 访问器用来返回属性值,通过 return 返回
(3)set 访问器用来为属性赋值,要使用隐式参数 value
[访问修饰符] 数据类型 属性名
{
get{//获得属性的代码,return}
set{//设置属性的代码}
}
//声明字段
private string id;
//声明属性
public String ID
{
get{return id}
set{id=value}
}
3. 访问修饰符
三、方法与重载
1. 方法:表现类或对象行为的成员函数
访问修饰符 返回值类型 方法名 () {方法体}
(1)声明方法时,必须指定方法的返回类型;若不返回值,则必须指定返回类型为 void
(2)调用方法时,在返回类型、参数个数、参数顺序以及参数类型等方面要实现精确匹配
2. 传递
(1)按值传递:C# 默认所有的方法都是按值传递参数的,实参变量的值传递给形参变量时是一种单向值传递。
(2)按引用传递:指实参传递给形参时,不是将实参的值复制给形参,而是将实参的引用传递给形参,实参和形参使用的是同一个内存中的值。当形参的值发生改变时,同时也就改变实参的值。
- “引用型”参数:通过 ref 关键字来声明引用型参数,形参和实参都必须添加 ref 关键字。调用前必须先初始化参数的值。
- “输出型”参数:通过关键字 out 来声明输出参数,形参和实参都必须添加 out 关键字。调用方法之前可以不用初始化该参数。方法只能返回一个值,但实际应用中常常需要方法能够修改或返回多个值,这时只靠 return 语句还不够。可以用“输出型”参数实现这种效果。
3. 方法重载
(1)重载的方法名称必须相同
(2)重载的方法,其形参个数或类型必须不同
4. 构造函数
(1)构造函数的名称必须与类的名称一样
(2)构造函数可以带参数也可以不带参数,但没有返回值
(3)构造函数在对象定义时被自动调用
(4)如果声明构造函数时使用的参数名称与类字段的名称相同,则构造函数中使用的类字段名称需要用关键字 this 引导
class F
{
int length; //字段
public F( int length ) //构造函数
{
this.length = length;
}
}
(5)重载构造函数:构造函数可以被重载,但不可以被继承
5. this关键字
(1)this 关键字用来引用类的当前实例,成员通过 this 关键字可以知道自己属于哪一个实例。
- 在类的构造函数中出现的 this,表示对正在构造的对象的引用
- 在类的方法中出现的 this,表示对调用该方法的对象的引用
(2)this 关键字只能用在类的构造函数、实例方法和实例访问器中
(3)在其它地方(如静态方法中)使用 this 关键字均是错误的
四、静态类与分部类
1. 静态类
(1)声明:使用 static 关键字来修饰这个类。静态类不能实例化,不能使用 new 关键字创建静态类类型的变量,所以使用类名访问静态类的成员。
(2)主要特性:
- 只能包含静态成员(字段和方法)
- 类本身无法实例化
- 是密封的,无法被继承
- 不能包含实例构造函数
2. 静态字段
(1)静态字段不属于任何一个特定的对象,而是属于类,或者说属于全体对象,是被全体对象共享的数据
(2)如果不对静态字段进行初始化,静态字段将自动获得默认值(0、null、false等)。一个静态字段即使没有被显式地赋值,也可以被访问
(3)声明静态字段需要使用 static 修饰符,C# 中静态字段或方法可以包含访问修饰符
(4)非静态类可以定义静态字段
3. 静态方法
(1)如果某个方法使用时并不需要与具体的对象联系,例如,方法操作的数据并不是某个具体对象的数据,而是表示全体对象特征的数据,甚至方法操作的数据与对象根本无关,这时可以将该方法声明一个静态方法。
(2)静态方法同样使用修饰符 static 声明。
(3)静态方法属于类,只能使用类名进行调用,不能使用对象名进行调用。
(4)静态方法与非静态方法一样可以重载。
4. 分部类
(1)使用 partial 关键字修饰符实现分部类定义。表示把对某个类的描述写在不同地方,甚至写到两个或多个不同的文件中去。
(2)类、结构、接口或方法的定义拆分到两个或多个源文件中,编译时编译器自动把所有部分组合起来进行编译。
(3)partial 修饰符只能出现在紧靠关键字 class、struct 或 interface 前面的位置。
(4)同一类型的各个部分的所有分部类的定义都必须在同一程序集或同一模块中进行定义,分部定义不能跨越多个模块。