类成员声明语句由下列部分组成:核心声明、一组可选的修饰符和一组可选的特性(attribute)。
[特性] [修饰符] 核心声明
修饰符:
如果有修饰符,必须放在核心声明之前。
如果有多个修饰符,要有序放置
特性
如果有特性,必须放在修饰符和核心声明之前
如果有多个特性,可以任何顺序
修饰符:public,private,static,const
实例类成员
public int Mem1;
静态字段
static int Mem2;被所有的实例可见,并且如果一个实例改变该值,其它实例使用的该值也会变化。
静态成员可以不用实例化,直接使用。
静态函数成员
Static public void PrintValA();
成员常量
Const int IntVal = 100;// 定义int类型常量,值为100
属性
属性是代表类的实例或类中的一个数据项的成员。
private int theRealValue;
public int TheRealValue
{
get { return theRealValue; }
set { theRealValue = value; }
}
但是使用属性的话,不能直接用get和set,而是直接使用赋值的方式。
构造函数
如果需要外部调用,需要声明为public
和类名相同,但是没有返回类型。
析构函数
每个类只能有一个析构函数
析构函数不能带参数
析构函数不能带访问修饰符
析构函数和类有相同的名称,但以一个"~"字符作前缀
析构函数只对类的实例起作用,因为没有静态析构函数。
不能在代码中显式地调用析构函数。
标准的清理模式
class FuncTest:IDisposable
{
bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~FuncTest()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposed == false)
{
if (disposing == true)
{
// Dispose the managed resources
}
// Dispose the unmanaged resources
}
disposed = true;
}
}
readonly修饰符
和const不同,即可以直接初始化,也可以在构造函数中设置它的值。
但是,如果是static字段,初始化必需在static构造函数中完成。
this关键字
this关键字在类中使用,是对当前实例的引用。
索引
和属性一样,索引不分配内存为存储
索引和属性都主要被用来访问其它数据成员这些成员和它们关联,它们为这些成员提供设置和获取访问。
和属性一样,索引可以只有一个访问器,也可以两个都有。
索引总是实例成员,因此,索引不能声明为static。
和属性一样,实现get和set访问器的代码不必一定要关联到某个字段或属性。这段代码可以做任何事情或什么也不做,只要get访问器返回某个指定类型的值即可。
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");
}
}
}
}
当一个类中,有多个string和多个int想同时定义索引时,可以将索引定义为多个参数。
分部类和分部类型
用partial class的形式,声明分部类
partial class MyClass
{
partial void PrintSum(int x, int y);
public void Add(int x, int y)
{
PrintSum(x, y);
}
}
partial class MyClass
{
partial void PrintSum(int x, int y)
{
Console.WriteLine("Sum is {0}", x + y);
}
}
var mc = new MyClass();
mc.Add(5, 6);