类成员
- 数据成员为保存数据可以存储字段和常量
- 函数成员做为执行部分可以存储以下部分:方法、运算符、属性、索引、构造函数、事件、析构函数
- 语句部分顺序
// []表示方法是可选的
[特性][核心修饰符]核心申明
- public和static同属于修饰符,索引他们的顺序是可以任意改变的
实例类成员
- 改变实例字段的值不会影响到任何其他实例成员的值
静态字段
- 静态字段被类的所有实例共享,所有实例都访问同一内存地址,当其发生改变的时候,类的所有实例共享改变后的值
静态成员
- 如果不想使用前缀,只需要在该静态成员所属的类中包含一个using static的申明即可
- 即使类没有实例,静态成员也是可以访问的
- 静态函数成员不能访问实例成员,但是能够访问其他静态成员
- 常量和索引器不能申明为静态成员类型
成员常量
- 成员常量申明在类申明总,而非局部常量申明在类方法中
- 通常是一个预定义的简单类型或者他们组成的表达式
- 与局部常量一样,不能先声明后赋值
- C#没有全局常量,常量必须申明在类中
- 成员常量没有类的值也可以使用,与静态量不同,常量没有自己的存储位置,而是在编译时被编译器替换
- 虽然很像静态值,但是不能使用static修饰符
属性
- 属性时代表类实例或类中的数据项成员,使用属性就像写入或者读取一个字段
- 和字段不同,属性是一个函数成员,set访问器为属性赋值,get访问器获取属性值
- set总返回空类型,get总返回属性类型的值
- 除了get、set两个访问器外,属性不允许有其他方法
- 不能显示调用get、set访问器
- 一般来说使用private修饰字段,然后提供一个public属性来控制从类的外部对该字段的访问
int MyValue
{
set
{
//code
}
get
{
//code
return intValue;
}
}
- 一种约定是字段使用小写开头,而属性使用大写开头
- 另外一种约定是字段使用下划线小写开头,属性使用大写开头
- 只有get访问器的属性称之为只读属性,只有set访问器的属性为只写属性(一般很少用到只写属性)
- 两个访问器至少有一个必须被定义
- 属性并非一定和字段关联,也有可能是对一些字段的引用,其值并不一定存储在字段中
- 可以使用子自动属性,从C#6.0开始,可以使用只读属性了
class Simple
{
public int MyValue
{
set;
get;
}
}
class Program
{
static void Main(string[] args)
{
Simple s = new Simple();
s.MyValue = 10;
Console.WriteLine(s.MyValue);
}
}
- 属性也可以申明为static
实例构造函数
- 实例构造函数是一种特殊的方法,他在创建每个类的新实例时候执行
- 如果允许类外部创建该实例,需要将构造函数申明为public
- 构造函数名称和类名相同,构造函数不能有返回值
- 构造函数可以使用参数,且可以被重载
- 系统提供了默认的无参构造函数,如果申明了任何构造函数,那么编译器将不会为该类定义默认构造函数
静态构造函数
- static构造函数通常初始化类级别的项,初始化类的静态字段
- 类只能由一个静态构造函数,且不能带参数,不能带访问修饰符
- 不能在程序中显示调用静态构造函数,系统会自动调用他们:
在类的实例被创建之前
在类的任何静态成员被引用之前
对象初始化语句
- 字段必须是公有的
- 初始化发生在构造方法执行之后,可能会对构造方法中设置的值产生影响
class Simple
{
public int a = 1;
public int b = 2;
}
class Program
{
static void Main(string[] args)
{
Simple s = new Simple {a=3, b=6 };
// 会改变原始的a和b的值
Console.WriteLine(s.a);
}
}
析构函数
- 它执行在类实例被销毁之需要的清理或者释放非托管资源的行为
readonly修饰符
- 类似于const,一旦申明就无法被改变
- const字段只能在字段的申明中初始化,readonly字段还可以在类的任意构造函数中初始化,如果是static字段,则必须在静态构造函数中完成
- const字段必须在编译时决定,而readonly字段可以在运行时决定,所以可以在不同环境或者不同构造函数中设置不同的值
this关键字
- this是对当前实例的引用,只能被用在以下代码块中:
实例构造函数
实例方法
属性和索引其的实例访问器
索引器
- 一般来说我们可以使用字段名称来访问他们的数据,但是如果有索引器就可以通过下标访问
class Employee
{
public string name;
public int age;
}
class Program
{
static void Main(string[] args)
{
Employee e = new Employee();
// 类似于这种
e[0] = "yuan";
e[1] = 18;
}
}
- 索引器的表现形式
string this [int index]
{
set
{
//code
}
get
{
//get
}
}
索引器和属性
- 索引器不用分配内存来存储
- 都是主要用来访问其他数据成员
- 索引器通常表现为多个数据成员,而属性通常表现为单个数据成员
- 一定程度上可以理解为索引器为多个成员提供get和set访问属性
- 索引本身可以是任何数据类型,而非数值类型
- 索引器总是实例成员,不能被申明为static
class Employee
{
public string name;
public int age;
public string this[int index]
{
set
{
switch (index)
{
case 0: name = value;
break;
case 1: age = value;
break;
default:
throw new ArgumentOutOfRangeException("index");
}
}
get
{
switch (index)
{
case 0: return name;
case 1: return age;
default: throw new ArgumentOutOfRangeException("index");
}
}
}
}
分布类和分布类型
- 类的声明可以分割为几个分部类的声明(使用类型修饰符partial)
- 类的分部类声明可以在一个文件中,也可在多个文件中
partial class MyPartClass // 名称和分布类的名称一致
{
...
}
partial class MyPartClass
{
...
}
- 类型修饰符partial并非是关键字,所以在其他上下文中,可以在程序中把它用作表示符
- 当partial用在class、struct、interface之前时,它表示分布类型
分部方法
- 分部方法是在分布类中不同部分的方法