程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,被称为类,通常代表真实世界中或概念上的事物。
数据成员存储数据 | 函数成员执行代码 |
---|---|
字段 | 方法 |
常量 | 属性 |
构造函数 | |
运算符 | |
索引器 | |
事件 | |
析构函数 |
class 类名
{
成员声明;
}
类的声明是用于创建类的实例的蓝图。一旦类被声明,就可以创建类的实例。
类是引用变量,它要为数据引用和实际数据都申请内存。
数据的引用保存在一个类类型的变量中。所以,要创建类的实例,需要从声明一个类类型的变量开始。如果变量没有被初始化,它的值是未定义的。
class Program {
static void Main()
{
Dealer theDealer;//声明引用变量
}
}
声明了Dealer类型的变量theDealer,因为变量没有初始化,它的值是未定义的。
声明类类型的变量所分配的内存是用来保存引用的,而不是来保存类对象实际数据的。要为实际数据分配内存,需要使用new运算符。
new运算符为任意指定类型的实例分配并初始化内存。
使用new运算符组成一个对象创建表达式,它的组成如下
- 关键字new;
- 要分配内存的实例的类型名称;
- 成对的圆括号,可能包括参数或没有参数
new的时候完成两件事,先为对象申请出一块儿内存,然后通过构造函数给对象进行初始化
theDealer=new Dealer();//对类对象分配内存并赋值给变量
//合并两个步骤
Dealer theDealer=new Dealer();//声明并初始化
从类的内部访问成员,类的成员仅用其他类成员的名称就可以访问它们。
从类的外部访问实例成员,必须包括变量名称和成员名称,中间用(.)分隔。
字段是隶属于类的变量。
可以是任何类型,无论是预定义类型还是用户定义类型。
字段用来保存数据,可以被写入,可以被读取。
类型 字段名称;
int MyField;
字段初始化语句是字段声明的一部分,由一个等于号后面跟着一个求值表达式组成。
如果没有初始化语句,字段的值会被编译器设为默认值,默认值由字段的类型决定。每种类型的默认值都是0,bool型是false,引用类型默认为null。
class MyClass {
int F1;//初始化为0 -值类型
string F2;//初始化为null -引用类型
int F3=2;//初始化为2
}
属性与字段类似,它是命名的类成员,可以被赋值和读取。
和字段不同的是,它不为数据存储分配内存,它执行代码。
set访问器: 为属性赋值,拥有一个单独的、隐式的值参,名称为value,与属性类型相同。拥有一个返回类型void
get访问器:读取属性的值,没有参数,拥有一个与属性类型相同的返回类型。
class C1 {
int TheRealValue;//字段:内存分配
public int MyValue//属性:未分配内存
{
set
{
TheRealValue=value;
}
get
{
return TheRealValue;
}
}
}
属性比公共字段更好,理由如下:
构造函数是一个特殊的方法,它在创建类的每个新实例时执行。用于初始化类实例的状态。
构造函数的名称和类相同,不能有返回类型。
class MyClass {
public MyClass()//构造函数
{
}
}
在使用创建对象表达式创建类的新实例时,要使用new运算符,后面跟着类的某个构造函数。new运算符使用该构造函数创建类的实例。
如果在类的声明中没有显式地提供实例构造函数,那么编译器会提供一个隐式的默认构造函数。它没有参数,方法体为空。
如果为类声明了任何构造函数,那么编译器将不会为该类定义默认构造函数。
创建一个实例过程中完成的第一件事就是初始化对象的所有实例成员。在此之后,调用基类的构造函数,然后才执行该类自己的构造函数。
派生类用基类的构造函数,要用base关键字指明使用哪一个基类的构造函数。
基类构造函数初始化语句放在冒号后边,冒号紧跟着类的构造函数声明的参数列表,参数必须在类型和顺序方面与已定的基类构造函数的参数列表相同。
public MyDerivedClass(int x,string s):base(s,x)
{
}
使用this关键字可以使用当前类的构造函数。
一个类有好几个构造函数,并且它们都需要在对象构造的过程开始执行一些公共的代码,对于这种情况,可以把公共代码提取出来作为一个构造函数。
class MyClass
{
readonly int firstVar;
readonly double secondVar;
public string UserName;
public int UserIdNumber;
private MyClass()//私有构造函数执行其他构造函数共用的初始化
{
firstVar=20;
secondVar=30;
}
public MyClass(string firstName):this()//使用构造函数初始化语句
{
UserName=firstName;
UserIdNumber=-1;
}
}