|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么?系列文章目次索引:《你必需晓得的.NET》
本文将先容以下内容:
•面向对象基础观点
•类和布局体简介
•援用范例和值范例区分
1.弁言提起class和struct,我们起首的感到是语法几近不异,报酬却翻天复地。汗青将接力棒由面向历程编程传到面向对象编程,class和struct也背负着各自的运气前行。在我以为,struct好汉迟暮,class世界独行,最实质的区分是class是援用范例,而struct是值范例,它们在内存中的分派情形有所区分。由此发生的一系列差别性,本文将做以周全会商。
2.基础观点
2.1.甚么是class?
class(类)是面向对象编程的基础观点,是一种自界说数据布局范例,一般包括字段、属性、办法、属性、机关函数、索引器、操纵符等。由于是基础的观点,以是不用在此具体形貌,读者能够查询相干观点懂得。我们重点夸大的是.NET中,一切的类都终极承继自System.Object类,因而是一种援用范例,也就是说,new一个类的实例时,对象保留了该实例实践数据的援用地点,而对象的值保留在托管堆(managedheap)中。
2.2.甚么是struct?
struct(布局)是一种值范例,用于将一组相干的信息变量构造为一个单一的变量实体。一切的布局都承继自System.ValueType类,因而是一种值范例,也就是说,struct实例分派在线程的仓库(stack)上,它自己存储了值,而不包括指向该值的指针。以是在利用struct时,我们能够将其看成int、char如许的基础范例类看待。
<br>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)界说接口
interfaceIPerson
{
voidGetSex();
}(2)界说类
publicclassPerson
{
publicPerson()
{
}
publicPerson(stringname,intage)
{
_name=name;
_age=age;
}
privatestring_name;
publicstringName
{
get{return_name;}
set{_name=value;}
}
privateint_age;
publicintAge
{
get{return_age;}
set{_age=value;}
}
}
(3)界说布局
//能够承继自接口,不成承继类或布局
structFamily:IPerson
{
publicstringname;
publicintage;
publicboolsex;
publicstringcountry;
publicPersonperson;
//不成以包括显式的无参机关函数和析构函数
publicFamily(stringname,intage,boolsex,stringcountry,Personperson)
{
this.name=name;
this.age=age;
this.sex=sex;
this.country=country;
this.person=person;
}
//不成以完成protected、virtual、sealed和override成员
publicvoidGetSex()
{
if(sex)
Console.WriteLine(person.Name+"isaboy.");
else
Console.WriteLine(person.Name+"isagirl.");
}
publicvoidShowPerson()
{
Console.WriteLine("Thisis{0}from{1}",newPerson(name,22).Name,country);
}
//能够重载ToString虚办法
publicoverridestringToString()
{
returnString.Format("{0}is{1},{2}from{3}",person.Name,age,sex?"Boy":"Girl",country);
}
}
(4)测试布局和类
<br>
猜猜运转了局怎样,能够特地反省反省对这个观点的熟悉。
4.2.NET研讨
在.NET框架中,System.Drawing定名空间中的有些元素,如System.Drawing.Point就是完成为struct,而不是class。其缘故原由也正在于以上先容的各方面的衡量,人人能够就此研讨研讨,能够体味更多。别的,另有以struct完成的System.Guid。
5.结论
对基础观点的掌控,是我们举行手艺深切探究的必经之路,本系列的大旨也是可以从基础框架中,供应给人人一个通向初级手艺的?课程。本文关于class和struct的会商就是云云,在.NET框架中,关于class和struct的会商将触及到对援用范例和值范例的熟悉,而且进一步将触角伸向变量内存分派这一初级主题,以是我们有需要来懂得其运转机制,掌控区分和使用场所,以便在寻常的体系计划中掌控好对这一观点条理的掌控。
别的,请人人就以下成绩举行会商,但愿可以加倍明晰本文的拓展:
- struct还次要使用在哪些方面?
- C++和C#中,关于struct的使用又有所分歧,这些分歧又有哪些区分?
<br>
参考文献
(USA)StanleyB.Lippman,C#Primer
(USA)C#inaNutshell
|
|