• c#中结构与类的区别


      今天看書時,突然想到類與結構到有什麼區別呢,以前還真沒仔細分析過,在網上找了一篇好文章學習一下。

    目录
       类与结构的实例比较
       类与结构的差别
       如何选择结构还是类

    一.类与结构的示例比较:

            //結構示例
            public struct Person
            {
                
    //聲明結構
                Person pr = new Person();
                
    //聲明類
                TestTime tt = new TestTime();
            }

        从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢? 

    二 .类与结构的差别

    1.值类型与引用类型
       结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型。
      类是引用类型:引用类型在堆上分配地址,
      堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑
    因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用

    注:
       1)虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object。
       2)虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

    2.继承性
         结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
         类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
         注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样

    例如:结构实现接口
      interface IImage
    {
        
    void Paint();
    }

    struct Picture : IImage
    {
        
    public void Paint()
        {
             
    // painting code goes here
        }
        
    private int x, y, z;  // other struct members
    }

    3.内部结构:
     结构:
       没有默认的构造函数,但是可以添加构造函数;
       没有析构函数
       没有 abstract 和 sealed(因为不能继承)
       不能有protected 修饰符
       可以不使用new 初始化
       在结构中初始化实例字段是错误的

     类:
       有默认的构造函数
       有析构函数
       可以使用 abstract、sealed和protected 修饰符
       必须使用new 初始化
     
    三.如何选择结构还是类

      讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:
      1)堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
      2)结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
      3)在表现抽象和多级别的对象层次时,类是最好的选择
      4)大多数情况下该类型只是一些数据时,结构时最佳的选择


    轉自:http://blog.csdn.net/JOEMAIL/archive/2007/07/04/1678957.aspx
  • 相关阅读:
    URAL 2067 Friends and Berries (推理,数学)
    URAL 2070 Interesting Numbers (找规律)
    URAL 2073 Log Files (模拟)
    URAL 2069 Hard Rock (最短路)
    URAL 2068 Game of Nuts (博弈)
    URAL 2066 Simple Expression (水题,暴力)
    URAL 2065 Different Sums (找规律)
    UVa 1640 The Counting Problem (数学,区间计数)
    UVa 1630 Folding (区间DP)
    UVa 1629 Cake slicing (记忆化搜索)
  • 原文地址:https://www.cnblogs.com/scottckt/p/957677.html
Copyright © 2020-2023  润新知