All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
C#,类型基础_[Asp.Net教程]
asp.net2.0内置Request对象的属性
新手教程:手把手教你学Web,Services,教程_.net资料_编程技术
GridView中实现并列排名的例子_[Asp.Net教程]
C#编程技巧,轻松实现对文件的操作_.net资料_编程技术
PHP生成静态HTML文章发布系统的思路_php资料_编程技术
asp.net代码实现上传图片并生成缩略图_[Asp.Net教程]
技巧文章:UTF8下的中文PHP编程_php资料_编程技术
SQL,Server,2008在商务智能上的三个优化_mssql学习_编程技术
SQL Server 中Inner join 和where的效率差异_[SQL Server教程]
Reading number is top 10 pictures
30 beautiful school beauty2
The real super beauty4
玩手机对身体不好
中国女孩大胆自拍,显露完美身材
The girl of like self-time
Fierce chengdu woman, street rape man
Is said to be a Chinese female artist fame explicit pictures before2
人美胸美腿更美3
Nine school beauty star those gossip matters
Ashlynn Brooke show proud chest measurement3
Download software ranking
Adobe Flash Player(IE) 10.0.32.18 浏览器专用的FLASH插件
c#程序设计案例教程
天龙八部最新服务端
Tram sex maniac 2 (H) rar bag11
Unix video tutorial15
matrix1
都市狐狸姑娘传
仙剑奇侠传98版歌曲
星际争霸1.08硬盘免安装版
传奇私服架设教程-chm
delv published in(发表于) 2014/1/24 9:10:39 Edit(编辑)
你必须知道的.NET之class和struct_[Asp.Net教程]

你必须知道的.NET之class和struct_[Asp.Net教程]

你必须知道的.NET之class和struct_[Asp.Net教程]

  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关键字,struct在声明时就进行了初始化过程,所有的成员变量均默认为0或null。


  ·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的应用又有所不同,这些不同又有哪些区别?


来源:天极







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.