1、一些基本概念
1. 字段:隶属于类的变量,即类的成员变量。
2. 方法:隶属于类的函数,即类的成员函数。
3. 实例成员:类的每一个实例拥有本身的各个类成员的副本,这些成员称为实例成员。 改变一个实例字段的值不会影响任何其余实例成员中的值。
4. 静态成员
静态成员是与类相关的成员,被加载到静态存储区,且只被建立一次,类的全部实例共享静态成员。
静态字段示例:函数
静态函数成员:无需类实例就能够调用静态方法。静态函数成员不能访问实例成员,只能访问静态成员。
从类的外部访问静态成员:类名称.静态成员名称
注:
静态成员即便没有类的实例也存在。若是静态字段有初始化语句,那么会在使用该类的任何静态成员以前初始化该字段,但不必在程序执行的开始就初始化。
5. 成员常量:声明在类声明中的常量。
常量不能声明为静态成员。
成员常量表现得像静态值,对类的每一个实例都是可见的,即便没有类的实例也能够访问。可是常量没有本身的存储位置,而是在编译时被编译器替换,而静态量是有本身的存储位置的。
6. readonly修饰符:字段可用readonly修饰。其做用相似于将字段声明为const,一旦值被设定就不能改变。
readonly字段与const字段有何区别?
(1)const字段只能在字段声明语句中初始化,而readonly字段除了能够在字段声明语句中初始化,还能够在类的任何构造函数中初始化,若是是static字段,初始化必须在静态构造函数中完成。
(2)const字段的值必须在编译时决定,而readonly字段值能够在运行时决定。
(3)const字段的行为老是静态的,在内存中没有存储位置。而readonly字段能够是静态字段,也能够是实例字段,并且在内存中是有存储位置的。spa
2、属性
属性表明类的实例或类中的一个数据项成员。使用属性看起来像写入或读取一个字段,它们语法相同。
1. 关于属性的一些特性
(1)属性是有类型的、命名的类成员,能够被赋值和读取。
(2)属性是执行代码,不为数据存储分配内存。
(3)可被声明为static。
(4)属性拥有两个称为访问器的方法:
<1>set访问器:为属性赋值。拥有一个单独的、隐式的值参,名称为value,与属性的类型相同,返回类型为void。
<2>get访问器:从属性取值。没有参数,返回类型与属性类型相同。
访问器set、get顺序任意,除这两个访问器外在属性上不容许有其余方法。
访问器set、get能够只定义其中一个,但至少要定义一个。
示例:blog
2. 属性的使用
属性根据当前执行的操做是写入仍是读取,隐式调用访问器。(访问器不能被显式调用)
示例:索引
3. 属性的做用
(1)将字段声明为private以封装字段,并声明一个public属性来控制从类的外部对该字段的访问。这样的字段常被称为后备字段、后备存储。
(2)能够声明属性为只读或只写,从而控制后备字段为只读或只写。只有get访问器的属性为只读属性,只有set访问器的属性为只写属性。
(3)属性访问器能够对字段执行其余计算。
4. 自动实现属性
由于属性常常关联到后备字段,C#提供了自动实现属性(automatically implemented property),容许只声明属性而不声明后备字段。编译器为你建立隐藏的后备字段,而且字段挂接到get和set访问器上。
自动实现属性的要点以下:
(1)不声明后备字段,编译器根据属性类型分配存储。
(2)不能提供访问器的方法体,它们必须被简单地声明为分号。get至关于简单的内存读,set至关于简单的写。
(3)除非经过访问器,不然不能访问后备字段。由于不能用其余方法访问,因此实现只读和只写属性没有意义,所以使用自动属性必须同时提供读写访问器。内存
3、构造函数
1. 构造函数的名称与类相同。
2. 构造函数不能有返回值。
3. 若是在类的声明中没有显式的提供实例构造函数,那么编译器会提供一个隐式的默认构造函数,默认构造函数没有参数,且方法体为空。
4. 只要声明了构造函数,编译器就再也不提供默认构造函数。
5. 构造函数能够被重载。
6. 实例构造函数初始化类的每一个新实例,静态构造函数初始化类级别的项。一般,静态构造函数初始化类的静态字段。
7. 静态构造函数不能在程序中显式调用,系统会自动调用它们,调用时机:类的任何实例被建立前;类的任何静态成员被引用前。get
4、索引器
索引器是一组get和set访问器,与属性相似。能够认为,索引器是为类的多个数据成员提供了get、set属性。
声明示例:编译器
调用示例:
var emp = new Employee();
emp[0] = "Jet";
emp[1] = "Wu";
var lastname = emp[0];
1. 和属性同样,索引器不用分配内存来存储。
2. 和属性同样,索引器能够只有一个访问器,也能够两个都有。
3. 索引器老是实例成员,所以不能声明为static。
4. 和属性同样,实现get、set访问器的代码没必要必定关联到某字段或属性。这段代码能够什么都不作,只要get访问器返回某个指定类型值便可
5. 索引器声明中,参数列表至少要声明一个参数。
6. 和属性同样,不能显示调用get、set访问器。取而代之,当索引器用在表达式中取值时,将自动调用get访问器。索引器被赋值时,自动调用set访问器。
7. 索引器重载:一个类能够有任意多个参数列表不一样的索引器。
8. 索引器的访问修改符:
(1)仅当成员(属性或索引器)既有get访问器也有set访问器时,其访问器才能有访问修饰符。
(2)虽然两个访问器都必须出现,但它们中只能有一个有访问修饰符。
(3)访问器的访问修饰符必须比成员的访问级别有更严格的限制性,即访问器的访问级别必须比成员的访问级别低。编译
5、分部类和分部方法
1. 分部类
类的声明能够分割成几个分部类的声明。
每一个分部类的声明都含有一些类成员的声明。
类的分部类声明能够在同一文件中也能够在不一样文件中
每一个局部声明必须标为partial class,而不是class。
分部类声明看起来和普通类声明相同。
示例:ast
2. 分部方法
分部方法是声明在分部类中不一样部分的方法。
分部方法分为两个部分:定义分部方法声明和实现分部方法声明。
1. 定义声明和实现声明的签名和返回类型必须匹配。签名和返回类型有以下特征:
<1>返回类型必须是void。
<2>签名不能包括访问修饰符,这使分部方法是隐式私有的。
<3>参数列表不能包含out参数。
<4>在定义声明和实现声明中都必须包含上下文关键字partial,直接放在关键字void前。
2. 能够有定义部分而没有实现部分。这种状况下,编译器把方法的声明以及方法内部任何对方法的调用都移除。不能只有实现部分而没有定义部分。
示例:class