所谓面向对象是指在编程时将任何事物都看成是一个对象来描述。
对象包括属性和方法,属性是指对象固有的特征,方法则是对象的行为。
面向对象语言的三大特征分别是封装、继承、多态。
类定义的具体语法形式如下。
类的访问修饰符 修饰符 类名
{
类的成员
}
其中:
在 C# 语言中类定义后就要确定类中包含的内容,类中包含的内容被称为类中的成员。
类中的成员包括字段、属性、方法。每个类成员在定义时需要指定访问修饰符、修饰符。
类的访问修饰符主要有两个,即 internal 和 public,如果省略了访问修饰符,即为 internal。
在修饰字段时通常用两个修饰符,即 readonly (只读)和 static (静态的)。
使用 readonly 修饰字段意味着只能读取该字段的值而不能给字段赋值。
使用 static 修饰的字段是静态字段,可以直接通过类名访问该字段。
需要注意的是常量不能使用 static 修饰符修饰。
访问修饰符 修饰符 数据类型 字段名;
方法是将完成同一功能的内容放到一起,方便书写和调用的一种方式,也体现了面向对象语言中封装的特性。
访问修饰符 修饰符 返回值类型 方法名(参数列表)
{
语句块;
}
其中:
属性经常与字段连用,并提供了 get 访问器和 set 访问器,分别用于获取或设置字段的值。
get 访问器和 set 访问器的使用与方法非常类似,可以在操作字段时根据一些规则和条件来设置或获取字段的值。
此外,为了保证字段的安全性,还能选择省去 get 访问器或 set 访问器。
public 数据类型 属性名
{
get
{
获取属性的语句块;
return 值;
}
set
{
设置属性得到语句块;
}
}
其中:
若在属性定义中省略了该访问器,则不能在其他类中获取私有类型的字段值,因此也称为只写属性。
在 set 访问器省略后无法在其他类中给字段赋值,因此也称为只读属性。
调用类的成员实际上使用的是类的对象,对于创建类的对象,首先可以将类理解成一个模板,类的对象则是按照这个模板定制的一个对象。
创建类对象的语法 形式如下。
类名对象名 = new 类名();
上面的语法形式是一种简单形式,通过“对象名”即可调用类中的成员。调用的语法形式如下。
对象名 . 类的成员
给属性赋值的代码如下。
类的对象 . 属性名 = 值;
使用类的对象调用方法的代码如下。
类的对象 . 方法名(参数);
如果将类中的成员使用修饰符 static 声明,则在访问类成员时直接使用“类名.类成员”的方式即可。
创建类的对象是使用“类名 对象名 = new 类名()”的方式来实现的。
实际上,“类名()”的形式调用的是类的构造方法,也就是说构造方法的名字是与类的名称相同的。
构造方法的定义语法形式如下。
访问修饰符 类名 (参数列表)
{
语句块;
}
这里构造方法的访问修饰符通常是 public 类型的,这样在其他类中都可以创建该类的对象。
如果将访问修饰符设置成 private 类型的,则无法创建该类的对象。构造方法中的参数与其他方法一样,都是 0 到多个参数。
此外,构造方法是在创建类的对象时被调用的。通常会将一些对类中成员初始化的操作放到构造方法中去完成。
构造方法是在创建类的对象时执行的,而析构方法则是在垃圾回收、释放资源时使用的。
析构方法的定义语法形式如下。
~类名()
{
语句块;
}
在析构方法中不带任何参数,它实际上是保证在程序中会调用垃圾回收方法 Finalize()。
定义构造方法时提到可以定义带 0 到多个参数的构造方法,但构造方法的名称必须是类名。实际上,这就是一个典型的方法重载,即方法名称相同、参数列表不同。
参数列表不同主要体现在参数个数或参数的数据类型不同。在调用重载的方法时系统是根据所传 递参数的不同判断调用的是哪个方法。
方法中的参数分为实际参数和形式参数,实际参数被称为实参,是在调用方法时传递的参数;形式参数被称为形参,是在方法定义中所写的参数。
方法中的参数除了定义数据类型外,还可以定义引用参数和输出参数。引用参数使用 ref 关键字定义,输出参数使用 out 关键字定义。
引用参数在方法中使用时必须为其值,并且必须是由变量赋予的值,不能是常量或表达式。
如果需要将方法中的每一个参数都设置为 ref 类型参数,则需要在每一个参数前面加上 ref 关键字修饰。
引用参数与我们平时使用的参数有些类似,但输出参数不同,输出参数相当于返回值,即在方法调用完成后可以将返回的结果存放到输出参数中。
输出参数多用于一个方法需要返回多个值的情况。需要注意的是,在使用输出参数时,必须在方法调用完成前为输出参数赋值。
在调用含有带输出参数的方法时,必须在传递参数时使用 out 关键字,但不必给输出参数赋值。
结构体与类比较相似,由于它是值类型,在使用时会比使用类存取的速度更快,但灵活性方面没有类好。
结构体从字面上来理解是指定义一种结构,实际上结构体是一种与类的定义非常相似的数据类型,但它是值类型。
结构体的定义位置与枚举类型一样,都是在类中定义或者在命名空间下定义,而不能将其定义到方法中。
在结构体中能定义字段、属性、方法等成员。定义的语法形式如下。
访问修饰符 struct 结构体名称
{
//结构体成员
}
其中:
在结构体中也能编写构造器,但必须带参数,并且必须为结构体中的字段赋初值。
在调用结构体的成员时,能使用不带参数的构造器,与创建类的对象时类似。
结构体与类有些类似,但其定义却有很大区别,具体如下表所示
结构体 | 类 |
---|---|
允许不使用 new 对其实例化 | 必须使用 new 实例化 |
没有默认构造方法 | 有默认构造方法 |
不能继承类 | 能继承类 |
没有析构方法 | 有析构方法 |
不允许使用 abstract、protected 以及 sealed 修饰 | 允许使用 abstract、protected 以及 sealed 修饰 |