C#-3 深入理解类
一 类的概述(类是逻辑相关的数据和函数的封装,通常代表真实世界中或概念上的事物)
类是一种能存储数据并执行代码的数据结构,包含数据成员和函数成员。
数据成员存储类或类的实例相关的数据;
函数成员执行代码。
二 声明类
class MyClass
{
数据成员...(字段、常量)
函数成员...(方法、属性、构造函数、析构函数、事件、索引器、运算符)
int MyField; //字段
static StaticField; //静态字段
void ShowMyField() //方法
{
Console.WriteLine(MyField);
}
static void ShowMyStaticFeld() //静态方法
{
Console.WriteLine(StaticField);
}
}
字段是隶属于类的变量,可以是任何类型,用来保存数据;
方法是具有名称的可执行代码块;
三 创建变量和类的实例
四 为数据分配内存
声明某类型变量所分配的内存是用来保存引用的,而不是用来保存类对象的实际数据。
要为实际数据分配内存,需要使用new运算符。
五 访问修饰符
在类的内部,任何函数成员都可以使用成员的名称访问类中的任意成员。
类的成员有5种访问控制:
- 私有的private:默认访问级别,只能从声明它的内部访问,其他的类不能看见或访问。
- 公有的public:可以被程序中的其他类访问。
- 受保护的protected:允许派生自该类的类访问。
- 内部的internal:对程序集内部的所有类可见,但对程序集外部的类不可见。
- 受保护内部的protected internal:对所有派生自该类的类和所有程序集内部的类可见
六 静态字段
静态字段被类的所有实例共享,所有实例都访问同一内存位置。
即使类没有实例,也存在静态成员,并且可以访问。
var field = MyClass.StaticField; //访问静态字段
七 静态函数成员
如同静态字段,静态函数成员独立于任何类的实例。即使没有类的实例,也可调用静态函数。
静态函数成员不能访问实例成员,但可以访问其他静态成员。
MyClass.ShowMyStaticFeld();
八 常量成员
常量成员声明在类中。
用于初始化常量成员的值在编译时必须是可计算的,且常为一个预定义简单类型或由其组成的表达式。
class MyClass
{
const int IntVal = 100;
}
九 常量和静态量
常量和静态量不同,常量没有自己的存储位置,而是在编译时被编译器替换。这种方式类似于C++中的#define。
十 属性
属性和字段不同,属性是一个函数成员:
- 它不为数据存储分配内存;
- 它执行代码;
属性是一组两个匹配的称为访问器的方法:
- set访问器为属性赋值;它拥有一个单独的、隐式的值参,名称为value,与属性的类型相同;它的返回类型为void。
- get访问器从属性获取值;它没有参数,拥有一个与属性类型相同的返回类型。
只有get访问器的属性为只读属性;只有set访问器的属性为只写属性。
属性也可以声明为static。
class MyClass
{
private int myVar; //属性访问器常使用字段作为存储;
public int MyVar
{
get { return myVar; }
set { myVar = value; }
}
private int myVar1; //属性访问器中可执行计算
public int MyVar1
{
get { return myVar1 + 1; }
set { if (value > 0) myVar1 = value; }
}
}
class Program
{
static void Main()
{
var myClass = new MyClass();
var p = myClass.MyVar; //隐式调用get方法
myClass.MyVar= 10; //隐式调用set方法
var myClass2 = new MyClass() { MyVar = 10, MyVar1 = 100 }; //对象初始化语句
}
}
十一 实例构造函数 constructor
实例构造函数是一个特殊的方法,它在创建类的每个实例时执行。
- 构造函数用于初始化类实例的状态;
- 构造函数的名称和类名相同;
- 构造函数不能有返回值;
- 构造函数可以带参数;
- 构造函数可以被重载overload;
- 如果没有显示地定义构造函数,那么编译器会定义一个隐式的默认构造函数,它没有参数,方法体为空;
- 如果显示地定义了构造函数,那么编译器就不会定义一个隐式的默认构造函数;
十二 静态构造函数
构造函数可以声明为static,静态构造函数初始化类级别的项。
- 初始化类级别的项,在引用任何静态成员之前,在创建类的任何实例之前;
- 静态构造函数不能有返回值;不能带参数;
- 类只能有一个静态构造函数,且不能带参数;
- 静态构造函数不能有访问修饰符。
十三 析构函数 destructor
析构函数执行在类的实例被销毁之前需要的清理或释放非托管资源的行为。
十四 this关键字
this关键字在类中使用,是对当前实例的引用。
十五 readonly修饰符
字段可以用readonly修饰符修饰,作用类似于将字段声明为const,一旦值设定就不能改变。
- const字段只能在声明时初始化;
- readonly字段可以在声明时初始化,也可以在构造函数中初始化;
- const的行为总是静态的,它在内存中没有存储位置
- readonly可以是实例字段也可是静态字段,它在内存中有存储位置;
__ 以 上 __