类
类是对一类物体的汇总描述,是创建万物的型。对象是类的具象化,是万物的实。
类的定义方式如下:
<access specifier> class class_name
{
// member variables
<access specifier> <data type> variable1;
<access specifier> <data type> variable2;
...
<access specifier> <data type> variableN;
// member methods
<access specifier> <return type> method1(parameter_list)
{
// method body
}
<access specifier> <return type> method2(parameter_list)
{
// method body
}
...
<access specifier> <return type> methodN(parameter_list)
{
// method body
}
}
实例:
using System;
namespace BoxApplication
{
class Box
{
public double length; // 长度
public double breadth; // 宽度
public double height; // 高度
}
class Boxtester
{
static void Main(string[] args)
{
Box Box1 = new Box(); // 声明 Box1,类型为 Box
Box Box2 = new Box(); // 声明 Box2,类型为 Box
double volume = 0.0; // 体积
// Box1 详述
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// Box2 详述
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// Box1 的体积
volume = Box1.height * Box1.length * Box1.breadth;
Console.WriteLine("Box1 的体积: {0}", volume);
// Box2 的体积
volume = Box2.height * Box2.length * Box2.breadth;
Console.WriteLine("Box2 的体积: {0}", volume);
Console.ReadKey();
}
}
}
成员函数和封装
类的成员函数是一个在类定义中有它的定义或原型的函数,就像其他变量一样。作为类的一个成员,它能在类的任何对象上操作,且能访问该对象的类的所有成员。具体实现请参考【Unity】Unity C#基础(三)封装、修饰符、方法、参数
构造器(构造函数、构造方法)
类的 构造函数 是类的一个特殊的成员函数,当创建类的新对象时执行。
构造函数的名称与类的名称完全相同,它没有任何返回类型。
using System;
namespace LineApplication
{
class Line
{
private double length; // 线条的长度
public Line()
{
Console.WriteLine("对象已创建");
}
public void setLength( double len )
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line();
// 设置线条长度
line.setLength(6.0);
Console.WriteLine("线条的长度: {0}", line.getLength());
Console.ReadKey();
}
}
}
静态构造器(C#版本的静态块)
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造方法(.cctor)。同一个程序域中.cctor 只会调用一次,而不是像.ctor每次实例化对象都会被调用。其作用是用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。如果我们有在类第一次加载时的操作,可以显式定义这个方法,但不能自己调用此方法,因为这个方法只能由CLR统一调用。
class Line
{
// 普通构造函数
public Line()
{
Console.WriteLine("对象已创建");
}
// 静态构造函数,这个函数只执行一次
static Line()
{
Console.WriteLine("在这里可以处理静态成员~");
}
}
静态构造方法操作的是类(而非其实例的)成员。
静态构造方法(.cctor)的一些特点:
- 声明和定义形式上,只能有static一个修饰符,不能有任何修饰符和返回值(也不能有void)。
- 不能被显示调用,由CLR调用。
- 最多只能调用一次。
- 静态构造函数中只能调用静态字段和静态属性,方法等,不能操作实例字段,属性,方法等。
- 静态构造函数需要时必须显示定义,只能最多一个。
- 如果静态字段有直接赋值语句,并且定义了静态构造函数,则生成的IL中,会先执行该赋值语句,然后执行静态构造函数的中的代码。
- 不同于实例构造函数,静态构造函数生成的代码中,不含有对基类任何构造函数的调用。
- 如果定义了静态构造函数,则静态构造函数的调用一定会在实例构造函数调用之前发生(由于对基类的实例构造函数的调用是在派生类的实例构造函数中,故而,如果基类有静态构造函数但基类尚未被加载,则基类的静态构造函数的调用依然晚于派生类的静态构造函数。基类的静态构造函数调用发生在派生类的构造函数生成的IL中,内联初始化实例字段后,基类实例构造函数调用之前)。
- 没有显示声明静态构造函数时,即使有静态字段,生成的IL中也不一定有静态构造函数.cctor,但CLR会在运行时执行一个系统生成的.cctor。调用的时机是程序集加载到类第一次被实例化(或类静态成员第一次被调用)之前,但时机由CLR决定,无法准确判断。
- 若显示声明了静态构造函数,则静态构造函数的调用实际是在类静态第一次被访问或者类第一次被实例化(即类加载时),只会被调用这一次。
- 可以看出,静态构造函数的调用发生在类加载时,且在实例构造函数调用之前。
对象初始化器
在一个类中,通常使用构造方法来为属性赋值,放一个类的属性过多时,不可能为每种情况都创建一个构造方法,想这种情况就可以使用对象初始化器来为属性赋值。
static void Main(string[] args)
{
// 使用对象初始化器来代替构造函数
Student stu = new Student() {
Name = "xiaoyaoACi",
Age = 17
};
}
析构函数
类的析构函数是类的一个特殊的成员函数,当类的对象超出范围时执行。等于给对象加了个生命周期中的onDestroy方法。
析构函数的名称是在类的名称前加上一个波浪形(~)作为前缀,它不返回值,也不带任何参数。
析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。
下面的实例说明了析构函数的概念:
using System;
namespace LineApplication
{
class Line
{
private double length; // 线条的长度
public Line() // 构造函数
{
Console.WriteLine("对象已创建");
}
~Line() //析构函数
{
Console.WriteLine("对象已删除");
}
public void setLength( double len )
{
length = len;
}
public double getLength()
{
return length;
}
static void Main(string[] args)
{
Line line = new Line();
// 设置线条长度
line.setLength(6.0);
Console.WriteLine("线条的长度: {0}", line.getLength());
}
}
}
执行结果:
对象已创建,length = 10
线条的长度: 10
线条的长度: 6
静态成员
我们可以使用 static 关键字把类成员定义为静态的。当我们声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。
关键字 static 意味着类中只有一个该成员的实例。静态变量用于定义常量,因为它们的值可以通过直接调用类而不需要创建类的实例来获取。静态变量可在成员函数或类的定义外部进行初始化。你也可以在类的定义内部初始化静态变量。
静态变量实例:
using System;
namespace StaticVarApplication
{
class StaticVar
{
public static int num;
public void count()
{
num++;
}
public int getNum()
{
return num;
}
}
class StaticTester
{
static void Main(string[] args)
{
StaticVar s1 = new StaticVar();
StaticVar s2 = new StaticVar();
s1.count();
s1.count();
s1.count();
s2.count();
s2.count();
s2.count();
Console.WriteLine("s1 的变量 num: {0}", s1.getNum());
Console.WriteLine("s2 的变量 num: {0}", s2.getNum());
Console.ReadKey();
}
}
}
执行结果:
s1 的变量 num: 6
s2 的变量 num: 6
静态方法实例:
using System;
namespace StaticVarApplication
{
class StaticVar
{
public static int num;
public void count()
{
num++;
}
public static int getNum()
{
return num;
}
}
class StaticTester
{
static void Main(string[] args)
{
StaticVar s = new StaticVar();
s.count();
s.count();
s.count();
Console.WriteLine("变量 num: {0}", StaticVar.getNum());
Console.ReadKey();
}
}
}
执行结果:
变量 num: 3
vs类设计器(类图工具)安装
vs2019安装路径:工具 - 获取工具和功能 - 点击VS2019选项卡的修改按钮 - 单个组件标签页 - 搜索类设计器 - 勾选类设计器 - 修改。
2017略有不同,不行百度一下。
Unity常用类
更多内容请查看总目录【Unity】Unity学习笔记目录整理