深入理解类
目录
类成员
成员修饰符的顺序
【可选的特性】【可选的修饰符】核心声明
字段的类型和方法的返回类型不是修饰符,他们是核心声明的一部分
实例类成员
类成员可以关联到类的一个实例,也可以关联到类的整体,即所有类的实例。默认情况下,成员被关联到一个实例。可以认为是类的每个实例拥有各自的各个类的成员的副本,这些成员称为实例成员
静态字段
静态字段被类的所有实例共享。所有实例都访问同意内存位置。因此,如果该内存位置的值被一个实例改变了,这种改变对所有实例都可见
可以使用static修饰符将字段声明为静态
从类的外部访问静态成员
静态成员可以使用点运算符从类的外部访问。但是因为没有实例所以必须用类名。
静态成员的生存期
只有在实例创建之后才产生实例成员,在实例销毁之后实例成员也就不存在
但是即使类没有实例,也存在静态成员,并且可以访问
静态函数成员
其他静态类成员类型
成员常量
被声明在类声明中而不是方法内
与本地常量类似,用于初始化成员常量的值在编译时必须是可计算的,而且通常是一个预定义类型或由他们组成的表达式
与本地常量类似,不能在成员常量声明以后给他赋值
常量与静态量
虽然常量成员表现得像一个静态量,但不能将常量声明为static
属性
属性是代表类的实例或类中的一个数据项的成员。使用属性看起来非常像写入或读取一个字段,语法是相同的
与字段类似,属性有如下特征:
它是命名的类型成员
属性声明和访问器
下图中的访问声明既没有 显式 的参数,也没有返回类型,不需要他们,因为它们已经在属性的类型中隐含了
属性示例
使用属性
写入和读取属性的方法与访问字段一样,访问器被隐式调用
属性和关联字段
命名约定
只读和只写属性
自动实现属性
可以是可以,但是有什么意义???
除了可方便以外,自动实现属性使你在倾向于声明一个公有字段的地方很容易插入一个属性
静态属性
静态属性的访问器和静态成员一样,具有以下特点:
实例构造函数
如果在类的声明中没有显式的提供实例构造函数,那么编译器会提供一个隐式的默认构造函数,没有参数,方法体为空
静态构造函数
静态构造函数初始化类的静态字段
对象初始化语句
析构函数
readonly修饰符
字段可以用readonly修饰声明,起作用类似于将字段声明为const,一旦值被设定就不能改变
this 关键字
this 关键字在类中使用,是对当前实例的引用。它只能被用在下列类成员的代码块中
索引器
什么是索引器
索引器和属性
声明索引器
索引器的 set 访问器
索引器的 get 访问器
一个示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace Csharpzuoye
{
class Employee
{
public string LastName;
public string FirstName;
public string CityOfBirth;
public string this[int index]
{
set
{
switch (index)
{
case 0:LastName = value;
break;
case 1:FirstName = value;
break;
case 2:CityOfBirth = value;
break;
default:
throw new ArgumentOutOfRangeException("index");
}
}
get
{
switch (index)
{
case 0:return LastName;
case 1:return FirstName;
case 2:return CityOfBirth;
default:
throw new ArgumentOutOfRangeException("index");
}
}
}
}
}
索引器重载
只要索引器的参数列表不同,类就可以有任意多个索引器。
访问器的访问修饰符
默认情况下,成员的两个访问器有和成员自身相同的访问级别。
不过也可以为两个访问器分配不同的访问级别
分部类和分部类型
分部方法
分部方法是声明在分布类中不同部分的方法。分部方法的不同部分可以声明在不同的分部类中,也可以声明在同一个类中。分部方法的两个部分如下:
输出 11