C#中的类,结构体课堂笔记
C#中的类
C#是一门面向对象的语言,类是C#中一种复杂的数据类型。
c#中定义一个类的基本格式:
class 类名
{
//类成员定义
}
默认情况下,如果class之前没有显示指定访问修饰符,则类的访问修饰符为internal,表示仅在当前项目内可以访问。
除了internal,C#中的修饰符还有private, protected, public, abstract, sealed等修饰符,以及这几个修饰符的组合。
修饰符 访问权限
无或者internal 只能在同一程序集访问类
public 同一程序集或者引用该程序集的其它程序集都可以访问
abstract或internal abstract 只能在同一程序集访问类,该类不能被实例化,只能被继承
public abstract 同一程序集或者引用该程序集的其它程序集都可以访问类,不能被实 例化,只能被继承
sealed或internal sealed 只能在同一程序集访问类,该类不能被继承,只能实例化
public sealed 同一程序集或者引用该程序集的其它程序集都可以访问类,该类不能 被继承,只能实例化。
类的成员:
修饰符 访问权限
public 同一程序集或者引用该程序集的其它程序集都可以访问
private 只能在同一类中访问
protected 只能在同一类或者派生类中访问
internal 只有同一程序集可以访问
protected internal 同一程序集,该类和派生类中可以访问。
字段:
可以使用关键字readonly或const来定义字段。readonly:表示该字段是只读的(不需要在定义的时候初始化,可以在构造函数里完成初始化) const:表示该字段是不可变的(如果没有在定义字段时初始化,就会产生编译 错误)。
也可以使用static关键字来声明静态字段。静态字段与实例字段的区别是静态字段必须通过类来访问,而实例字段则需要通过类的对象实例进行访问。
属性:
属性是对字段的扩展。根据面向对象的基本思想,字段最好设置为private,因为这样可以防止客户端字节对字段进行修改,从而保证内部成员的完整性。为了访问类的私有字段,c#中提供了属性机制
eg:
public class Person
{
private string name;
public string Name
{
//get访问器
get{
return name;
}
//set访问器
set{
//value是隐形参数
name = value;
}
}
}
通过属性来访问字段,避免了调用方法。
当属性仅含有get访问器,或者set访问器为private级别时,这 样的属性称之为只读属性;当属性仅包含set访问器,或者get访问器 为private级别时,称之为只写属性。
和静态字段类似,属性也可以通过static关键字声明为静态属性,不能再静态属性中使用非静态成员
方法重载
方法重载指在类中可以定义多个名称相同但是类型参数顺序,参数类型,参数个数不同,返回类型不属于方法重载的一部分。
构造函数
构造函数用来创建类的实例对象
构造函数分为静态构造函数和实例构造函数两种
1.实例构造函数:用于创建 和初始化类的实例
构造函数有以下特点:
1)构造函数可以进行方法重载
2)如果没有定义的化,会默认产生一个空的构造函数
3)构造函数的函数名必须和类名相同
4)不允许有返回值
2.静态构造函数(静态构造函数只执行一次):用于初始化类中的静态成员,在创建第一个实例或者引用任何静态成员之前,clr都会自动调用静态构造函数
静态构造函数有以下特点:
1)静态构造函数不能使用任何访问修饰符
2)静态构造函数不能带有任何参数
3)静态构造函数只会执行一次
4)不能直接调用静态构造函数
5)程序员无法直接控制静态构造函数的调用时机
析构函数:
用于在类销毁之前释放类实例所使用的托管和非托管资源。析构函数隐式的调用了基类的object的Finalize方法
try{}catch{}是c#的异常处理机制,
析构函数需要注意:
1)不能再结构体中定义析构函数,只能在类中
2)一个类只能有一个
3)无法继承或重载析构函数
4)无法显示调用析构函数,由垃圾回收器自动调用
5)析构函数没有修饰符也没有参数
索引器:便于访问类中的数组成员的访问
当一个类包含数组成员时,索引器的使用将大大简化对类中数组成员的访问,定义类似于属性,也有get,set访问器,具体定义如下:
[修饰符] 数据类型 this [索引类型 index]
{
get{ }
set{ }
}
结构体:
结构类型和类类型语法上相似,都是一种数据结构,都可以包含数据成员和方法成员。
对于类两个变量指向同一对象的情况是存在的。
结构是值类型,直接包含它自己的数据,每个结构都包含自己的一份数据。修改一个结构的数据不会对其它结构的数据造成影响。
结构体总有一个默认无参的构造函数
在继承中,在派生类中写的与父类函数名相同的方法,会出现父类方法隐藏警告,消除警告使用在派生类方法前添加new关键字,那如何调用父类的同名方法呢?通过强转,把派生类强转成父类。
结构和类的对比
数据类型 结构 类
是否必须使用new运算符实例化 否 引用类型
是否可以声明无参的构造函数 否 是
数据成员可否在声明的同时初始化 声明为const或static可以,数据成员不可以 可以
直接派生自什么类型 System.ValueType 有
是否有析构函数 无 有
可否从类派生 否 可以
可否实现接口 可以 可以
实例化时在栈还是在堆分配内存 栈 堆, 栈中保存引用
该类型的变量可否被赋值为null 否 可以
可否定义私有的无参构造函数 否 可以
是否总有一个默认的无参构造函数 是 否
类和结构体的区别
1:类定义使用class,结构体使用struct
2:结构体中不可对声明的字段进行初始化,类可以
3:结构体中,无论我们有没有定义构造函数,隐式的构造函数一直存 在
4:结构体不能显式的定义无参数的构造函数
5:结构体构造函数必须为所有的字段赋值
6:创建结构体对象可以不使用new,类必须得使用
7:结构体不能继承结构或者类,但可以实现接口;类可以继承类但不 能继承结构,可以实现接口
8:类是引用类型,结构体是值类型
9:结构体不能定义析构函数,类可以
10:不能用 abstract或者sealed修饰结构体,而类可以。
C#是面向对象的语言,所有面向对象的语言都具有三个基本的 特征,它们是:
封装:把客观事物封装成类,并将类内部实现隐藏,以保证数
据的完整性。
继承:通过继承可以复用父类的代码。
多态:允许将子对象赋值给父对象的一种能力。
密封类:
密封类是指不能被继承的类,强行继承会产生编译错误lC#中使用sealed关键字来定义密封类。
子类的初始化顺序:
1)初始化类的实例字段
2)调用基类的构造函数,若没有基类,调用System.Object的构造函数
3)调用子类的构造函数
多态
多态即相同类型的对象调用相同的方法却表现出不同行为的现象。
使用virtual 和override关键字实现方法重写
使用新成员隐藏基类成员
如果想在派生类中定义和基类同名的成员则可以使用new关键字把基类成员隐藏起来。如果不使用new关键字,在派生类中定义一个与基类同名的成员编译器会产生警告。
C#不支持多继承