c#数据类型分为值类型(Value types),引用类型(Reference types),以及指针类型(Pointer types),而指针类型只在不安全的代码中使用,本文不讨论指针类型。
值类型的引用的本质是拷贝(copy),是创造一个新的内存单元来存储,新内存单元的改变不会影响到被拷贝对象如
Vector3 pos = transform.position;
pos = new Vector3(0, 2, 0);
新建变量pos的任何改变都不会影响到transform中的position,因为它们是完全不同的内存单元,就像住在两个不同的屋子里。
引用类型则是内存地址指向被引用对象的内存地址,换句话说,就是它们之间其实调用的是同一个内存单元
Transform tran = transform;
tran.position = new Vector3(0, 2, 0);
所以,变量tran的一切变化都会直接改变transform,因为它们其实共享同一个内存单元,就像住在同个屋子。
//Value type variable,物体的位置不变
Vector3 pos = transform.position;
pos = new Vector3(0, 2, 0);
//Reference type variable,物体的位置变化了
Transform tran = transform;
tran.position = new Vector3(0, 2, 0);
这里只讨论值类型与引用类型的具体分类:
值类型,包括简单类型(如字符型,浮点型和整数型等),枚举类型和结构型。
简单类型有:主要有整型(有符号整形:sbyte,short,int,long;无符号整形:ubyte,ushort,uint,ulong),浮点类型(float,double),小数类型(decimal),布尔类型(bool),字符型 (char)
枚举类型:是使用 enum 关键字声明的类型。
enum <enum_name>
{
enumeration list
};
-
enum_name 指定枚举的类型名称。
-
enumeration list 是一个用逗号分隔的标识符列表。
-
使用点操作符(".")引用。
//定义
enum Days { Sun, Mon, tue, Wed, thu, Fri, Sat };
//使用
int WeekdayStart = (int)Days.Mon;
结构类型:是使用 struct 关键字声明的类型。
struct struct_name
{
public int id;
public string name;
};
使用点操作符引用。
(ps:Vector3、Quaternion是结构类型。)
引用类型包括类类型(所有其他类型的最终基类object,字符串string,自定义的class),接口类型(使用interface定义的类型),数组类型(一维数组int[]和多维数组int[][]),委托类型(delegate定义的类型)
类类型:
Transform tran = transform;
tran.position = new Vector3(0, 2, 0);
最常见的就是Classes下的Transfrom和GameObject。
接口类型:
interface interface1
{
void show();
}
接口只有方法,但所有方法中没有执行代码
数组类型:
一维数组:
int[] a={0,1,2};
//等价于
int[] a=new int[] {0,1, 2};
二维多维数组:
//创建一个2行三列的二维数组
int[,] a = new int[2, 3];
//三维数组
int[, ,] = new int[2, 3, 4};
交错数组:
int[][] a = new int[3][]
//必须初始化a的元素后才可使用它,初始化操作有以下:
//每个元素都是一维整数数组。 第一个元素是由5个整数组成的数组,第二个是由4个整数组成的数组,以此类推
a[0] = new int[5];
a[1] = new int[4];
a[2] = new int[2];
//或者直接填充数组:
a[0] = new int[] { 1, 3, 5, 7, 9 };
a[1] = new int[] { 0, 2, 4, 6 };
a[2] = new int[] { 11, 22 };
//
int[][] a = new int[][]
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};//这里等号后面的new int[][]可省略,即写成:
int[][] a =
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};
委托类型:
delegate double ParocessDelegate(double param1,double param2);