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

Reading number is top 10 articles
浅析ASP.NET,2.0的用户密码加密机制_[Asp.Net教程]
LINQ体验(4)——LINQ简介和LINQ,to,SQL语句之Where_[Asp.Net教程]
SQL Server2000安全设置全攻略_[SQL Server教程]
php获取文件信息_php资料_编程技术
从.NET类库代码来看ASP.NET运行时_[Asp.Net教程]
不使用VS进行ASP.NET,Membership管理_.net资料_编程技术
有用的SQL语句(删除重复记录,收缩日志)_[SQL,Server教程]
利用C#来做ASP.NET的登陆页面_[Asp.Net教程]
组合ASP.NET,2.0数据控件构建强大用户接口_.net资料_编程技术
为ASP.NET,MVC开发一些常用插件(一)——导航栏_[Asp.Net教程]
Reading number is top 10 pictures
女人化妆前后的对比
非笑不可:最强爆笑图片精选
Beautiful vacuum girl1
The hot big eye big breast beauty1
Wild animals melee moment of life and death1
谁认识这位校花
Rendez-vous Sleep with actress, three days to earn 600000
A man's favorite things7
yy365网站上的美女2
9.3阅兵全景图5-地空反舰导弹梯队
Download software ranking
Eclipse 4.2.2 For Win32
Tram sex maniac 2 (H) rar bag7
linux初级教程
C语言教程TXT
尖东毒玫瑰B
Unix video tutorial7
asp.netWeb服务器高级编程
Tram sex maniac 2 (H) rar bag4
Boxer's Top ten classic battle7
C++编程教程第三版
delv published in(发表于) 2014/1/24 9:10:25 Edit(编辑)
《Effective,C#》:值类型和引用类型_[Asp.Net教程]

《Effective,C#》:值类型和引用类型_[Asp.Net教程]

《Effective C#》:值类型和引用类型_[Asp.Net教程]

  在C#中有两种类型的数据,一种是值类型数据,一种是引用类型数据。在编码的时候区分这两种类型数据,可以避免一些细小的编码错误。

  首先说说什么类型是值类型,例如:int、float、bool之类的基础类型,以及用struct定义的类型,如:DateTime。除此外,如string,数组,以及用class定义的类型等都是引用类型。对于C#来说,很难罗列出所有类型进行一一分别,这需要自己在编码过程中进行分析总结。

  为了更好地说明两种类型之间的区别,借用如下的表格来说明。


值类型
引用类型
内存分配地点
分配在栈中
分配在堆中
效率
效率高,不需要地址转换
效率低,需要进行地址转换
内存回收
使用完后,立即回收
使用完后,不是立即回收,等待GC回收
赋值操作
进行复制,创建一个同值新对象
只是对原有对象的引用
函数参数与返回值
是对象的复制
是原有对象的引用,并不产生新的对象
类型扩展
不易扩展
容易扩展,方便与类型扩展

  通过如上细致对比,大家对于值类型和引用类型有个清楚的概念。

  不过,无论是对于值类型还是引用类型来说,对于其作为函数参数或者返回值的时候,都是容易犯错误的地方。

  对于值类型来说,当其作为函数参数的时候,希望在函数中被修改,那么直接如下操作是不能被修改的。


public void Increment( int i )
{
  i++;
}

  要想在函数中对传进去的参数做真正的修改,需要借助于ref这个关键字,那么正确的形式如下。


public void Increment( ref int i )
{
 i++;
}

  也就是说,如果需要在函数中对值类型参数进行修改,需要用ref或者out进行标识才能真正实现。

  而对于引用类型来说,当其作为函数参数的时候,它所遇到的情况恰恰与值类型相反,即不希望在函数中被修改,举例如下。


public void AddValue( MyType typValue )
{
 typValue.Count = typValue.Count + 15;
}

  由于对于引用类型对象来说,其的赋值操作只是对原有对象的引用,因此在函数对其修改,实际上是直接修改了原有对象数据,这是很多情况不希望发生的(这里例如对数组或者DataTable操作这类)。

  为了防止这种事发生,需要给此类型提供clone函数。例如对于如上的类型,可以入下实现。


public class MyType:ICloneable
{
 private int nCount = 0;
 public int Count
 {
  set{ nCount = value;}
  get{ return nCount;}
 }
 public MyType()
 {}
 public MyType( int Value)
 {
  nCount = Value;
 }

 #region ICloneable Members

 public object Clone()
 {
  // TOD Add MyType.Clone implementation
  return new MyType( nCount );
 }

 #endregion
}


  那么在调用的时候,用当前的对象的clone作为参数即可。

  不过对于引用类型来说,提供一个clone函数不是一件容易的事情,尤其出现引用类型嵌套的时候,所以说去实现一个完全clone功能是件很费事又不讨好的活,这也就是在论坛中常说的深copy和浅copy的问题。话虽如此,如果对于前面所说的有个大概了解,相信实现也不是不可能。

  在C#中,尤其自己定义类型的时候,常常由于是用struct来定义还是用class来定义,即是定义一个值类型还是一个引用类型呢。在这本书上给了几个判定条件,如果如下几点都满足的话,建议用struct来定义为值类型,否则用class定义为引用类型。


1.
这个类型是否主要为了数据存储;

2.
是否只通过属性来访问对象的数据成员;

3.
这个类型是否不会有子类型;

4.
在程序处理的时候不会把这个类型对象通过多态来处理。

出处: 天极Yesky 作者:愚翁







添加到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.