ASP.NET编程:[你必需晓得的.NET] 第四回:后发先至:class和struct仓酷云
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么?系列文章目次索引:《你必需晓得的.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
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。 网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项! 通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。 网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项! 通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。 CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。 在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。 网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项! 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
页:
[1]