C# for Unity编程语言快速入门教程(连载13)_C#结构体
C#的“结构体”使用Struct 关键字来定义,是与“类”、"接口"并列的编程单位。其设计的主要目的是自定义“值类型”,即允许用户自定义值类型。
适用范围:
结构适合一些小型的数据结构,这些结构包含的数据以创建后不修改的数据为主。也适合数据打包,一次性定义多个变量。结构体的限制很多。
1> 除非字段声明为const 、static,否则无法初始化。2> 结构体没有默认的构造函数。3> 结构体可以声明带参数的构造函数。4> 结构不能继承。5> 结构体在赋值时候进行复制。6> 结构体实例化可以不使用New 运算符。7> 结构可以实现接口。8> 结构体使用时,可以New ,也可以不New. 如果不New ,则使用前必须为结构体中所有的成员变量赋值。
对于C#初学者来说,对于结构体是不好区分的,现就结构体与类的主要区别总结如下:
1> 如果你需要用面向对象的特性,必须用类。
2> 成员变量很多的时候,必须用类。
3> 类与结构体的最大区别是:“类" 是引用类型,所以类的实例对象是按照“引用传值”,而"结构"类型是值类型,所以结构实例对象是按“值类型传值”。
为了更好的说明类与结构的异同点,现提供如下代码,供大家学习讨论:
class Program
{ public void ChangeValues_1(int intNum) { intNum = 100; } /// <summary> /// 测试类对象传值(引用) /// </summary> /// <param name="pc"></param> public void ChangeValues_2(PointClass pc) { pc.PointX = 1000; pc.PointY = 1100; } /// <summary> /// 测试结构体传值(拷贝) /// </summary> /// <param name="ps"></param> public void ChangeValues_3(PointStruct ps) { ps.PointX = 2000; ps.PointY = 2200; } static void Main(string[] args) { /* 引出学习案例(系统的“点”) */ //Point firstPoint = new Point(); //firstPoint.X = 10; //firstPoint.Y = 20; /*类与结构体 不同点测试 */ //引用类型 PointClass pc = new PointClass(10,20); //值类型 PointStruct ps = new PointStruct(50,60); //写法1 //写法2:特别注意,在使用结构中的方法或者属性前, //必须显式的给结构的字段赋值,否则必须用New. PointStruct ps2; ps2._PointX = 23; ps2._PointY = 88; Program obj = new Program(); int intTestNum = 50; obj.ChangeValues_1(intTestNum); Console.WriteLine("Number=" + intTestNum); //结果表明:引用类型,在方法中发生的变化,对结果造成的影响 obj.ChangeValues_2(pc); Console.WriteLine("pc.pointX={0},pointY={1}",pc.PointX,pc.PointY); obj.ChangeValues_3(ps); Console.WriteLine("ps.pointX={0},pointY={1}", ps.PointX, ps.PointY); } } //定义的类 class PointClass { private int _PointX; private int _PointY; public int PointX { get { return _PointX; } set { _PointX = value; } } public int PointY { get { return _PointY; } set { _PointY = value; } } public PointClass(int px, int py) { _PointX = px; _PointY = py; } } //定义的结构体 struct PointStruct { public int _PointY; public int _PointX; public int PointX { get { return _PointX; } set { _PointX = value; } } public int PointY { get { return _PointY; } set { _PointY = value; } } public PointStruct(int px, int py) { _PointX = px; _PointY = py; } }