ASP.NET基础知识:类和结构的区别是什么?

作者:网络 来源:佚名 更新时间:2009-03-31 14:39:23 点击:

类:
类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
类有构造和析构函数
类可以继承和被继承
结构:
结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
结构没有构造函数,但可以添加。结构没有析构函数
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

示例:
根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。
如:geoemtry(gis 里的一个概论,在 ogc 标准里有定义) 最好使用类,而 geometry 中点的成员最好使用结构

using system;
using system.collections.generic;
using system.text;
namespace example16
{
    interface ipoint
    {
        double x
        {
            get;
            set;
        }
        double y
        {
            get;
            set;
        }
        double z
        {
            get;
            set;
        }
    }
    //结构也可以从接口继承
    struct point: ipoint
    {
        private double x, y, z;
        //结构也可以增加构造函数
        public point(double x, double y, double z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
        public double x
        {
            get { return x; }
            set { x = value; }
        }
        public double y
        {
            get { return x; }
            set { x = value; }
        }
        public double z
        {
            get { return x; }
            set { x = value; }
        }
    }
    //在此简化了点状geometry的设计,实际产品中还包含project(坐标变换)等复杂操作
    class pointgeometry
    {
        private point value;
       
        public pointgeometry(double x, double y, double z)
        {
            value = new point(x, y, z);
        }
        public pointgeometry(point value)
        {
            //结构的赋值将分配新的内存
            this.value = value;
        }
        public double x
        {
            get { return value.x; }
            set { this.value.x = value; }
        }
        public double y
        {
            get { return value.y; }
            set { this.value.y = value; }
        }
        public double z
      {
            get { return value.z; }
            set { this.value.z = value; }
        }
        public static pointgeometry operator +(pointgeometry left, pointgeometry rigth)
        {
            return new pointgeometry(left.x + rigth.x, left.y + rigth.y, left.z + rigth.z);
        }
        public override string tostring()
        {
            return string.format("x: {0}, y: {1}, z: {2}", value.x, value.y, value.z);
        }
    }
    class program
    {
        static void main(string[] args)
        {
            point tmppoint = new point(1, 2, 3);
            pointgeometry tmppg1 = new pointgeometry(tmppoint);
            pointgeometry tmppg2 = new pointgeometry(tmppoint);
            tmppg2.x = 4;
            tmppg2.y = 5;
            tmppg2.z = 6;
            //由于结构是值类型,tmppg1 和 tmppg2 的坐标并不一样
            console.writeline(tmppg1);
            console.writeline(tmppg2);
            //由于类是引用类型,对tmppg1坐标修改后影响到了tmppg3
            pointgeometry tmppg3 = tmppg1;
            tmppg1.x = 7;
            tmppg1.y = 8;
            tmppg1.z = 9;
            console.writeline(tmppg1);
            console.writeline(tmppg3);
            console.readline();
        }
    }
}


结果:
x: 1, y: 2, z: 3
x: 4, y: 5, z: 6
x: 7, y: 8, z: 9
x: 7, y: 8, z: 9