zoukankan      html  css  js  c++  java
  • 类和结构的区别?

    类:
    类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存
    类有构造和析构函数
    类可以继承和被继承

    结构:
    结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。
    结构没有构造函数,但可以添加。结构没有析构函数
    结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

    示例:
    根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。
    如: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

  • 相关阅读:
    sass和compass的配置
    MAC apache配置
    js库
    Tomcat7 配置 ssl
    同一对象内的嵌套方法调用AOP失效原因分析
    Spring Boot文件无法下载问题排查过程记录
    Apache、Spring、Cglib的beancopy效率对比
    使用in作为查询条件优化SQL并使用set筛选结果集
    Java使用foreach遍历集和时不能add/remove的原因剖析
    Python爬虫实践——爬取网站文章
  • 原文地址:https://www.cnblogs.com/qfb620/p/1771545.html
Copyright © 2011-2022 走看看