zoukankan      html  css  js  c++  java
  • The comparison between object and constructor

    1.相似的地方

    1.举个栗子:
    public struct Student
    {
        string name;
        int age;
    }
    public class bike
    {
        int weight;
         double cost;
    }
    使用:
    Student s=new Student();
    bike q=new bike();


    2,两者都是container类型,这表示它们可以包含其他数据类型作为成员。
    3,两者都拥有成员,包括:构造函数、方法、属性、字段、常量、枚举类型、事件、以及事件处理函数。
    4,两者的成员都有其各自的存取范围。例如,可以将某一个成员声明为Public,而将另一个成员声明为Private。
    5,两者都可以实现接口。
    6,两者都可以公开一个默认属性,然而前提是这个属性至少要取得一个自变量。
    7,两者都可以声明和触发事件,而且两者都可以声明委托(Delegate)。

    2.不同之处

    在网上摘抄了两段:

    =====第一段:=====

    1,结构是实值类型(Value Types),而类则是引用类型(Reference Types)。

    2,结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)。

    3,所有结构成员默认都是Public,而类的变量和常量数则默认位Private,不过其他类成员默认都是Public。

    4,结构成员不能被声明位Protected,而类成员可以。

    5,结构变量声明不能指定初始值、使用New关键字货对数组进行初始化,但是类变量声明可以。

    6,结构不能声明默认的构造函数,也就是不拥有参数的非共享构造函数,但是类则无此限制。

    7,二者都可以拥有共享构造函数,结构的共享构造函数不能带有参数,但是类的共享构造函数则可以带或者不带参数。

    8,结构不允许声明析构函数(Destructor),类则无此限制。

    9,结构的实例(Instance)声明,不允许对包含的变量进行初始化设定,类则可以在声明类的实例时,同时进行变量初始化。

    10,结构是隐式继承自ValueType类,而且不能继承任何其他类型,类则可以继续自ValueType以外的任何类。

    11,结构是无法被继承的,类则可以。

    12,结构永远不会终止,因此CLR不会在任何结构上调用Finalize方法。类则是由内存回收进程加以终止,当内存回收进程检测到没有任何作用的类时,它就会调用类的Finalize方法。

    13,结构不需要构造函数,类则需要构造函数。

    14,结构只能在一种情况下使用非共享构造函数,那就是非共享构造函数会接受参数。但是类则无此限制,它可以使用带参数或不带参数的非共享构造函数。

    14,每一个结构都具有无参数的隐含公共构造函数,此构造函数会将结构的所有成员初始化为其默认值。不需要重新定义这个行为。

    在“实例和变量”层面上,由于结构是数值类型的,因此每一个结构变量会永远的绑定到结构实例上。然而类是引用类型的,而且对象变量可引用不同的类实例,在此方面的区别,会对使用将结构和类造成如下的影响:

    15,结构变量会隐式的使用结构的无参数构造函数来初始化成员,这就意味语句 Struct S = new Struct()。

    16,当您将一个结构变量赋值给另一个,或者将结构实例传递到程序变量时,所有变量成员的值会复制到新的结构中。当您将一个对象变量赋值给另一个,或者将对象变量传递给程序时,则只是复制指针。

    17,您可以将Null值赋值给结构变量,但是该实例会一直与该变量保持关联。虽然变量成员会因此赋值而重新初始化,但是您还是可以调用变量的方法并访问其数据成员。相反的,如果您将对象变量设定为Null,您就会中断它与任何类型实例的关联,而且除非您再将另一个实例赋值给它,否则无法通过变量访问任何成员。

    18,您可以在不同时间将不同的类的实例赋值给同一个对象变量,而且在同一时间可有好几个对象变量引用相同的类实例,如果您对类成员值做了改变,则其他指向相同实例的对象变量也会发生改变。然而,结构成员则会封装在他们自己的实例中,变更结构成员值并不会对其他任何结构变量的成员造成影响,甚至也不会影响相同结构声明的其他实例。

    19,两个结构必须以成员对成员的比较方式来执行相等比较。两个对象变量可以使用Equals方法来加以比较。Equals会判断两个变量是否指向相同的实例。

    =====第二段:=====

    1,结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。
    2,结构体的定义是:有些数据既是相互关联的,又共同描述一个完整事物,如:一个学生的整体信息,学号、姓名、性别等。而类则使用在需要比较有层次的数据上面。
    3,类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性 
    4,构造函数是为了初始化类的字段而存在的,而结构体并不需要初始化就能使用,因此,结构体中并不存在默认的构造函数。
    结构:
    没有默认的构造函数,但是可以添加构造函数
        没有析构函数
        没有 abstract 和 sealed(因为不能继承)
        不能有protected 修饰符
        可以不使用new 初始化
    在结构中初始化实例字段是错误的
    类: 
     有默认的构造函数
     有析构函数
     可以使用 abstract 和 sealed 
    有protected 修饰符
    必须使用new 初始化

  • 相关阅读:
    WPF 使用 Direct2D1 画图 绘制基本图形
    WPF 使用 Direct2D1 画图 绘制基本图形
    dot net core 使用 IPC 进程通信
    dot net core 使用 IPC 进程通信
    win2d 图片水印
    win2d 图片水印
    Java实现 LeetCode 240 搜索二维矩阵 II(二)
    PHP closedir() 函数
    PHP chroot() 函数
    PHP chdir() 函数
  • 原文地址:https://www.cnblogs.com/IMxinu/p/9907358.html
Copyright © 2011-2022 走看看