.Net中结构和类的区别和联系及类和对象的概念

  结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。

  由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。C# 中的所有值类型本质上都继承自ValueType,后者继承自 Object。编译器可以在一个称为装箱的过程中将值类型转换为引用类型。

  结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。

  结构不能声明默认构造函数(没有参数的构造函数)或析构函数。

  结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。

  结构不能从类或其他结构继承。

  结构具有以下特点:

  结构是值类型,而类是引用类型。

  向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。

  与类不同,结构的实例化可以不使用 new 运算符。

  结构可以声明构造函数,但它们必须带参数。

  一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。

  结构可以实现接口。

  在结构中初始化实例字段是错误的。

  类(Class)

  面向对象思想来源于对现实世界的认知。现实世界缤纷复杂、种类繁多,难于认识和理解。但是聪明的人们学会了把这些错综复杂的事物进行分类,从而使世界变得井井有条。

  面向对象编程也采用了类的概念,把事物编写成一个个“类”。在类中,用数据表示事物的状态,用函数实现事物的行为,这样就使编程方式和人的思维方式保持一致,极大的降低了思维难度。

  封装(Encapsulation)

  制造汽车的过程中什么人最牛?当然不是焊钢板的,也不是装轮胎的,更不是拧螺丝的,而是设计汽车的工程师,因为他知道汽车的运行原理。但是我们开车时,需要知道汽车的运行原理吗?答案显然不需要。汽车的运行原理已经被伟大的工程师封装在汽车内部,提供给司机的只是一个简单的使用接口,司机操纵方向盘和各种按钮就可以灵活自如的开动汽车了。

  与制造汽车相似,面向对象技术把事物的状态和行为的实现细节封装在类中,形成一个可以重复使用的“零件”。类一旦被设计好,就可以像工业零件一样,被成千上万的对其内部原理毫不知情的程序员使用。类的设计者相当于汽车工程师,类的使用者相当于司机。这样程序员就可以充份利用他人已经编写好的“零件”,而将主要精力集中在自己的专署领域。

  接口(Interface)

  今天你买了一台等离子电视机,你拿出遥控器,操纵按钮,开始欣赏精彩的电视节目。人们通过遥控器这个接口使用电视机,同样,人们通过类的接口使用类。济南旗帜软件公司(http://www.haorenyuan.so/c/qzsoft)程序员在编写类时精心地为它设计接口,而设计良好的接口不但方便其他程序员使用,还有利于类的升级改造。

  假设你是一个环保人士,最近你用节能的荧光灯代替了普通的白炽灯。白炽灯通过加热电阻丝照亮整个屋子;荧光灯则是激活空气中的某些分子的电子能而发光。虽然它们的原理不同,但是它们的功能却是一样的——照明。因为两种灯具有相同的接口,所以你只需拧下白炽灯,然后再拧上荧光灯即可,轻易的实现“零件”的更新换代。同样,在面向对象编程中,只要保持接口不变,你可以任意更改类的实现细节,用一个设计更好的类替换原来的类,实现类的升级换代。

  现在软件维护和修改的成本已经占到了整个软件开发的80%,类的这一编成思想极大的方便了程序的维护和修改,降低了软件成本。

  对象(Object)

  作为初学者,比较容易混淆类和对象的概念。类是一个抽象的概念,对象则是类的具体实例。比如人是一个类,司马迁、李白、杜甫都是对象;首都是一个类,则北京、伦敦、华盛顿、莫斯科都是对象;动画猫是一个类,则Kitty、Grafield和Doraemon都是对象.

  类是抽象的概念,对象是真实的个体。我们可以说Kitty猫的体重是1.5kg,而不能说猫类的体重是1.5kg;可以说刘翔在跨栏比赛中夺冠,而不说人类在跨栏比赛中夺冠。一般情况下我们认为状态是描述具体对象而非描述类的,行为是由具体对象发出的而非类发出的。

  现实生活中到处充实着对象,一栋房子、一辆汽车,一头大象,一只蚂蚁,乃至一种语言、一种方法都可以称为对象。

原文地址:https://www.cnblogs.com/hualuo/p/2876106.html