做爰全过程免费网站的视频教程网站资讯创作
news/
2025/10/3 19:44:09/
文章来源:
做爰全过程免费网站的视频教程,网站资讯创作,自主建站网站平台,比较不同类型网站栏目设置区别本文将介绍以下内容#xff1a;
• 面向对象基本概念
• 类和结构体简介
• 引用类型和值类型区别
1. 引言
提起class和struct#xff0c;我们首先的感觉是语法几乎相同#xff0c;待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程#xff0c;class和stru…本文将介绍以下内容
• 面向对象基本概念
• 类和结构体简介
• 引用类型和值类型区别
1. 引言
提起class和struct我们首先的感觉是语法几乎相同待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程class和struct也背负着各自的命运前行。在我认为struct英雄迟暮class天下独行最本质的区别是class是引用类型而struct是值类型它们在内存中的分配情况有所区别。由此产生的一系列差异性本文将做以全面讨论。
2. 基本概念
2.1. 什么是class?
class类是面向对象编程的基本概念是一种自定义数据结构类型通常包含字段、属性、方法、属性、构造函数、索引器、操作符等。因为是基本的概念所以不必在此详细描述读者可以查询相关概念了解。我们重点强调的是.NET中所有的类都最终继承自System.Object类因此是一种引用类型也就是说new一个类的实例时对象保存了该实例实际数据的引用地址而对象的值保存在托管堆managed heap中。
2.2. 什么是struct?
struct结构是一种值类型用于将一组相关的信息变量组织为一个单一的变量实体 。所有的结构都继承自System.ValueType类因此是一种值类型也就是说struct实例分配在线程的堆栈stack上它本身存储了值而不包含指向该值的指针。所以在使用struct时我们可以将其当作int、char这样的基本类型类对待。 3. 相同点不同点
相同点语法类似。
不同点
class是引用类型继承自System.Object类struct是值类型继承自System.ValueType类因此不具多态性。但是注意System.ValueType是个引用类型。从职能观点来看class表现为行为而struct常用于存储数据。class支持继承可以继承自类和接口而struct没有继承性struct不能从class继承也不能作为class的基类但struct支持接口继承记得吗《第二回对抽象编程接口和抽象类》也做过讨论class可以声明无参构造函数可以声明析构函数而struct只能声明带参数构造函数且不能声明析构函数。因此struct没有自定义的默认无参构造函数默认无参构造器只是简单地把所有值初始化为它们的0等价值实例化时class要使用new关键字而struct可以不使用new关键字如果不以new来实例化struct则其所有的字段将处于未分配状态直到所有字段完成初始化否则引用未赋值的字段会导致编译错误。class可以实抽象类abstract可以声明抽象函数而struct为抽象也不能声明抽象函数。class可以声明protected成员、virtual成员、sealed成员和override成员而struct不可以但是值得注意的是struct可以重载System.Object的3个虚方法Equals()、ToString()和GetHashTable()。class的对象复制分为浅拷贝和深拷贝该主题我们在本系列以后的主题中将重点讲述本文不作详述必须经过特别的方法来完成复制而struct创建的对象复制简单可以直接以等号连接即可。class实例由垃圾回收机制来保证内存的回收处理而struct变量使用完后立即自动解除内存分配。作为参数传递时class变量是以按址方式传递而struct变量是以按值方式传递的。
我们可以简单的理解class是一个可以动的机器有行为有多态有继承而struct就是个零件箱组合了不同结构的零件。其实class和struct最本质的区别就在于class是引用类型内存分配于托管堆而struct是值类型内存分配于线程的堆栈上。由此差异导致了上述所有的不同点所以只有深刻的理解内存分配的相关内容才能更好的驾驭。本系列将再以后的内容中将引用类型和值类型做以深入的比较和探讨敬请关注。当然正如本文标题描述的一样使用class基本可以替代struct的任何场合class后来居上。虽然在某些方面struct有性能方面的优势但是在面向对象编程里基本是class横行的天下。
那么有人不免会提出既然class几乎可以完全替代struct来实现所有的功能那么struct还有存在的必要吗答案是至少在以下情况下鉴于性能上的考虑我们应该考虑使用struct来代替class
实现一个主要用于存储数据的结构时可以考虑struct。struct变量占有堆栈的空间因此只适用于数据量相对小的场合。结构数组具有更高的效率。提供某些和非托管代码通信的兼容性。
所有这些是struct有一席之地的理由当然也许还有其他的更多说法只是我不知道罢了:-)
4. 经典示例
4.1 小菜一碟
下面以示例为说明来阐述本文的基本规则详细见注释内容。 1定义接口 interface IPerson { void GetSex(); }
2定义类 public class Person { public Person() { } public Person(string name, int age) { _name name; _age age; } private string _name; public string Name { get { return _name; } set { _name value; } } private int _age; public int Age { get { return _age; } set { _age value; } } }
3定义结构 //可以继承自接口不可继承类或结构 struct Family: IPerson { public string name; public int age; public bool sex; public string country; public Person person; //不可以包含显式的无参构造函数和析构函数 public Family(string name, int age, bool sex, string country, Person person) { this.name name; this.age age; this.sex sex; this.country country; this.person person; } //不可以实现protected、virtual、sealed和override成员 public void GetSex() { if (sex) Console.WriteLine(person.Name is a boy.); else Console.WriteLine(person.Name is a girl.); } public void ShowPerson() { Console.WriteLine(This is {0} from {1}, new Person(name, 22).Name, country); } //可以重载ToString虚方法 public override string ToString() { return String.Format({0} is {1}, {2} from {3}, person.Name, age, sex ? Boy : Girl, country); } }
4测试结构和类 猜猜运行结果如何可以顺便检查检查对这个概念的认识。
4.2 .NET研究
在.NET 框架中System.Drawing命名空间中的有些元素如System.Drawing.Point就是实现为struct而不是class。其原因也正在于以上介绍的各方面的权衡大家可以就此研究研究可以体会更多。另外还有以struct实现的System.Guid。
5. 结论
对基本概念的把握是我们进行技术深入探索的必经之路本系列的主旨也是能够从基本框架中提供给大家一个通向高级技术的必修课程。本文关于class和struct的讨论就是如此在.NET框架中关于class和struct的讨论将涉及到对引用类型和值类型的认识并且进一步将触角伸向变量内存分配这一高级主题所以我们有必要来了解其运行机制把握区别和应用场合以便在平常的系统设计中把握好对这一概念层次的把握。
另外请大家就以下问题进行讨论希望能够更加清晰本文的拓展
struct还主要应用在哪些方面 C和C#中关于struct的应用又有所不同这些不同又有哪些区别参考文献
USAStanley B.Lippman, C# Primer
USAC# in a Nutshell 温故知新
[开篇有益]
[第一回恩怨情仇is和as]
[第二回对抽象编程接口和抽象类]
[第三回历史纠葛特性和属性]
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926253.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!