C# 引用类型的"祸害"
前端时间刚刚弄完一个项目,终于有时间来总结与回顾了。
项目需求:给用户发送邮件,邮件分为系统邮件和个人邮件,需要按时间、未读降序排列。
一开始以为,这是一个很简单的需求,给邮件建了一个对象:
class Mail{
private string _title =string.Empty;
public string Title{
get {return _title;}
}
private string _message = string.Empty;
public string Message {
get {return _message;}
}
private bool _isRead = false ;
public bool IsRead {
get {return _isRead}
}
privaite DateTime _insertTime = DateTime.Now;
public DateTime InsertTime{
get {return _insertTime ;}
}
}
然后再 List<Mail> listMails = new List<Mail> 进行冒泡排序(里面已经按时间降序了,现在只需按未读排序)
for(int i=0,count1=listMails.Count;i<count1;i++){
for(int j= i+1;j<count1;j++){
if(listMails[i].IsRead && !listMails[j].IsRead){
Mail temp = listMails[i];
listMails[i] = listMails[j];
listMails[j]=temp;
}
}
}
结果可想而知了,并未按未读降序排列。
改进方法1:对Mail进行深度复制:
[Serializable]
class Mail:ICloneable{
private string _title =string.Empty;
public string Title{
get {return _title;}
}
private string _message = string.Empty;
public string Message {
get {return _message;}
}
private bool _isRead = false ;
public bool IsRead {
get {return _isRead}
}
privaite DateTime _insertTime = DateTime.Now;
public DateTime InsertTime{
get {return _insertTime ;}
}
public object Clone()
{
using (Stream objectStream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, this);
objectStream.Seek(0, SeekOrigin.Begin);
return formatter.Deserialize(objectStream) as Employee;
}
}
}
然后再 List<Mail> listMails = new List<Mail> 进行冒泡排序(里面已经按时间降序了,现在只需按未读排序)
for(int i=0,count1=listMails.Count;i<count1;i++){
for(int j= i+1;j<count1;j++){
if(listMails[i].IsRead && !listMails[j].IsRead){
Mail temp = (Mail)listMails[i].Clone();
listMails[i] = (Mail)listMails[j].Clone();
listMails[j]=temp;
}
}
}
结果还是不行,郁闷了。
最后采用值类型(struct)进行处理:
struct Mail{
private string _title;
public string Title{
get {return _title;}
}
private string _message;
public string Message {
get {return _message;}
}
private bool _isRead;
public bool IsRead {
get {return _isRead}
}
privaite DateTime _insertTime;
public DateTime InsertTime{
get {return _insertTime ;}
}
}
然后再 List<Mail> listMails = new List<Mail> 进行冒泡排序(里面已经按时间降序了,现在只需按未读排序)
for(int i=0,count1=listMails.Count;i<count1;i++){
for(int j= i+1;j<count1;j++){
if(listMails[i].IsRead && !listMails[j].IsRead){
Mail temp = listMails[i];
listMails[i] = listMails[j];
listMails[j]=temp;
}
}
}
测试,一切OK,建议所有的同学,深入理解值类型和引用类型,避免造成不必要的麻烦。
转载,请注明来源,手游基地 www.shouyou888.com,QQD123游戏网 www.qqd123.com
C# 引用类型的"祸害"的更多相关文章
- C# - 值类型、引用类型&走出误区,容易错误的说法
1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...
- 5.0 JS中引用类型介绍
其实,在前面的"js的六大数据类型"文章中稍微说了一下引用类型.前面我们说到js中有六大数据类型(五种基本数据类型 + 一种引用类型).下面的章节中,我们将详细讲解引用类型. 1. ...
- C# 引用类型和值类型
C# 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 1.引用类型 (1)内存必须从托管堆上分配: (2)堆上分配的每个对象都有一些额外成员(包括“类型对象指针”,“同步块索引”),这些成员 ...
- JS高程5.引用类型(1)Object类型
引用类型 在ECMASCript中,引用类型是一种数据结构,将数据和功能组织在一起,引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.(注意:尽管ECMAScript从技术上 ...
- 通过一个实例重新认识引用类型,值类型,数组,堆栈,ref
昨天在写代码时候遇到了一个问题,百思不得其解,感觉颠覆了自己对C#基础知识的认知,因为具体的情境涉及公司代码不便放出,我在这里举个例子,先上整个测试所有的代码,然后一一讲解我的思考过程: using ...
- Java Native Interface 四--JNI中引用类型
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...
- 一步步学习javascript基础篇(3):Object、Function等引用类型
我们在<一步步学习javascript基础篇(1):基本概念>中简单的介绍了五种基本数据类型Undefined.Null.Boolean.Number和String.今天我们主要介绍下复杂 ...
随机推荐
- 无法嵌入互操作类型“ESRI.ArcGIS.Display.SimpleFillSymbolClass”。请改用适用的接口。
无法嵌入互操作类型"ESRI.ArcGIS.Display.SimpleFillSymbolClass".请改用适用的接口. 对于这样的问题 先看这个错误所对应的引用时那个,比如这 ...
- 对象的继承关系在数据库中的实现方式和PowerDesigner设计
原文:对象的继承关系在数据库中的实现方式和PowerDesigner设计 在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是外键表示实体(表)之间的 ...
- WP布局之Pivot和Panorama
一.Pivot控件(枢轴控件) Pivot主要用于管理应用中的视图或者页面,此控件在WP中几乎处处可见,不管是短信的左右滑动,还是QQ的左右滑动都是此控件的功劳. 就是图片中的控件,是不是很熟悉呢. ...
- nodejs搭配phantomjs highcharts后台生成图表
简单分享一下,后台使用nodejs结合highcharts.phantomjs生成报表图片的方法.这主要应用在日报邮件. 主要参考以下资料: http://www.highcharts.com/com ...
- BNU OJ 33691 / LA 4817 Calculator JAVA大数
留着当个模板用,在BNU上AC,在LA上RE……可能是java的提交方式不同??? 数和运算符各开一个栈. 表达式从左到右扫一遍,将数存成大数,遇到数压在 数的栈,运算符压在 运算符的栈,每当遇到右括 ...
- Docker实例教程[超详细](一)
Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互 ...
- Zookeeper、HBase的伪分布
1.Zookeeper伪分布的部署(3个节点) 所谓的“伪分布式集群”就是在一台服务器中,启动多个Zookeeper实例.“完全分布式集群”是每台服务器,启动一个Zookeeper实例. 1.1.解压 ...
- [转载]Python模块学习 ---- subprocess 创建子进程
[转自]http://blog.sciencenet.cn/blog-600900-499638.html 最近,我们老大要我写一个守护者程序,对服务器进程进行守护.如果服务器不幸挂掉了,守护者能即时 ...
- 【笨嘴拙舌WINDOWS】伟大的变革
"改革"."革命"."变革" 这几个词语毫无疑问是每一个时代必须被呼吁的词语,当一个国家没有人求变时,那是一个时代的悲剧.无论是文景之治,贞 ...
- UVa 1401 (Tire树) Remember the Word
d(i)表示从i开始的后缀即S[i, L-1]的分解方法数,字符串为S[0, L-1] 则有d(i) = sum{ d(i+len(x)) | 单词x是S[i, L-1]的前缀 } 递推边界为d(L) ...