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;
        }
    }