C# 基础知识系列文章索引

清理GR的加星标项目。分享来自博客园 zhili 的C#基础系列文章。 C#基础知识系列终于告了一个段落了, 本系列中主要和大家介绍了C#1.0到C# 4.0中一些重要的特性,刚开始写这个专题的初衷主要是我觉得掌握了C#这些基础知识之后,对于其他任何的一门语言都是差不多的,这样可以提高朋友们对其他语言的掌握,以及可以让大家更加迅速地掌握.NET的新特性, 并且相信这个系列对于找工作的朋友也是很有帮助的,因为很多公司面试都很看重基础知识是否扎实,是否对C#有一个全面的认识和理解,所以很多公司面试都会问到一些C#基础概念的问题,例如,经常面试会问:你是如何理解委托的,如何理解匿名函数等问题。 然而这个系列中并没有介绍COM互操作性的内容以及.Net 4.5中的一些新特性,所以后面将会对这两个方面的内容进行补充,由于这个系列托的太久了(大概也有3个月吧),所以就先告一段落的,后面将会带来.NET互操作性系列的介绍。下面就为这个系列文章做一个索引,方便大家收藏和查找。 C#基础知识系列索引 C#1.0 1. 深入解析委托——C#中为什么要引入委托 2. 委托本质论 3. 如何用委托包装多个方法——委托链 4. 事件揭秘 5. 当点击按钮时触发Click事件背后发生的事情 C# 2.0 6. 泛型基础篇——为什么引入泛型 7. 泛型深入理解(一) 8. 泛型深入理解(二) 9. 深入理解泛型可变性 10. 全面解析可空类型 11. 匿名方法解析 12. 迭代器 C# 3.0 13. 全面解析对象集合初始化器、匿名类型和隐式类型 14. 深入理解Lambda表达式 15. 全面解析扩展方法 16. Linq介绍 C# 4.0 17. 深入理解动态类型 从C#的所有特性可以看出,C#中提出的每个新特性都是建立在原来特性的基础上,并且是对原来特性的一个改进, 做这么多的改进主要是为了方便开发人员更好地使用C#来编写程序,是让我们写更少的代码来实现我们的程序,把一些额外的工作交给编译器去帮我们做,也就是很多人说微软很喜欢搞语法糖的意思(语法糖即让编译器帮我们做一些额外的事情,减少开发人员所考虑的事情,使开发人员放更多的精力放在系统的业务逻辑上面。),大家从C# 3中提出的特性中可以很好的看出这点(指的是玩语法糖),C#3中几乎大部分特性都是C#提供的语法糖,从CLR层面来说(指的是增加新的IL指令),C# 3并没有更新什么,C# 4中提出的动态类型又是建立在表达式树的基础上,包括Linq也是建立在表达式树的基础上,所以每个特性都是层层递进的一个关系。相信C#后面提出的新特性将会更加方便我们开发程序,感觉所有语言的一个统一的思想都是——写更少的代码,却可以做更多的事情。但是我们不能仅仅停住于知道怎么使用它,我们还应该深入研究它的背后的故事,知道新特性是如何实现的和原理。用一句说就是——我们要知其然之气所以然,学习知识应该抱着刨根问底的态度去学习,相信这样的学习方式也可以让大家不感到心虚,写出的程序将会更加自信。

2013-01-27 · 1 min · bystander

图的遍历(C#)

讲的非常好的一篇文章。感谢abatei,直接收藏分享之。 图的存储结构 图的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表、十字链表和邻接多重表。 8.2.1 邻接矩阵表示法 对于一个具有n个顶点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系。图8.10和图8.11中,矩阵A(i,j)=1表示图中存在一条边(Vi,Vj),而A(i,j)=0表示图中不存在边(Vi,Vj)。实际编程时,当图为不带权图时,可以在二维数组中存放bool值,A(i,j)=true表示存在边(Vi,Vj),A(i,j)=false表示不存在边(Vi,Vj);当图带权值时,则可以直接在二维数组中存放权值,A(i,j)=null表示不存在边(Vi,Vj)。 图8.10所示的是无向图的邻接矩阵表示法,可以观察到,矩阵延对角线对称,即A(i,j)= A(j,i)。无向图邻接矩阵的第i行或第i列非零元素的个数其实就是第i个顶点的度。这表示无向图邻接矩阵存在一定的数据冗余。 图8.11所示的是有向图邻接矩阵表示法,矩阵并不延对角线对称,A(i,j)=1表示顶点Vi邻接到顶点Vj;A(j,i)=1则表示顶点Vi邻接自顶点Vj。两者并不象无向图邻接矩阵那样表示相同的意思。有向图邻接矩阵的第i行非零元素的个数其实就是第i个顶点的出度,而第i列非零元素的个数是第i个顶点的入度,即第i个顶点的度是第i行和第i列非零元素个数之和。 由于存在n个顶点的图需要n2个数组元素进行存储,当图为稀疏图时,使用邻接矩阵存储方法将出现大量零元素,照成极大地空间浪费,这时应该使用邻接表表示法存储图中的数据。 8.2.2 邻接表表示法 图的邻接矩阵存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。如图8.12所示,表结点存放的是邻接顶点在数组中的索引。对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点。 有向图的邻接表有出边表和入边表(又称逆邻接表)之分。出边表的表结点存放的是从表头结点出发的有向边所指的尾顶点;入边表的表结点存放的则是指向表头结点的某个头顶点。如图8.13所示,图(b)和(c)分别为有向图(a)的出边表和入边表。 以上所讨论的邻接表所表示的都是不带权的图,如果要表示带权图,可以在表结点中增加一个存放权的字段,其效果如图8.14所示。 【注意】:观察图8.14可以发现,当删除存储表头结点的数组中的某一元素,有可能使部分表头结点索引号的改变,从而导致大面积修改表结点的情况发生。可以在表结点中直接存放指向表头结点的指针以解决这个问题(在链表中存放类实例即是存放指针,但必须要保证表头结点是类而不是结构体)。在实际创建邻接表时,甚至可以使用链表代替数组存放表头结点或使用顺序表存代替链表存放表结点。对所学的数据结构知识应当根据实际情况及所使用语言的特点灵活应用,切不可生搬硬套。 【例8-1 AdjacencyList.cs】图的邻接表存储结构 using System; using System.Collections.Generic; public class AdjacencyList<T> { List<Vertex<T>> items; //图的顶点集合 public AdjacencyList() : this(10) { } //构造方法 public AdjacencyList(int capacity) //指定容量的构造方法 { items = new List<Vertex<T>>(capacity); } public void AddVertex(T item) //添加一个顶点 { //不允许插入重复值 if (Contains(item)) { throw new ArgumentException("插入了重复顶点!"); } items.Add(new Vertex<T>(item)); } public void AddEdge(T from, T to) //添加无向边 { Vertex<T> fromVer = Find(from); //找到起始顶点 if (fromVer == null) { throw new ArgumentException("头顶点并不存在!"); } Vertex<T> toVer = Find(to); //找到结束顶点 if (toVer == null) { throw new ArgumentException("尾顶点并不存在!"); } //无向边的两个顶点都需记录边信息 AddDirectedEdge(fromVer, toVer); AddDirectedEdge(toVer, fromVer); } public bool Contains(T item) //查找图中是否包含某项 { foreach (Vertex<T> v in items) { if (v.data.Equals(item)) { return true; } } return false; } private Vertex<T> Find(T item) //查找指定项并返回 { foreach (Vertex<T> v in items) { if (v.data.Equals(item)) { return v; } } return null; } //添加有向边 private void AddDirectedEdge(Vertex<T> fromVer, Vertex<T> toVer) { if (fromVer.firstEdge == null) //无邻接点时 { fromVer.firstEdge = new Node(toVer); } else { Node tmp, node = fromVer.firstEdge; do { //检查是否添加了重复边 if (node.adjvex.data.Equals(toVer.data)) { throw new ArgumentException("添加了重复的边!"); } tmp = node; node = node.next; } while (node != null); tmp.next = new Node(toVer); //添加到链表未尾 } } public override string ToString() //仅用于测试 { //打印每个节点和它的邻接点 string s = string.Empty; foreach (Vertex<T> v in items) { s += v.data.ToString() + ":"; if (v.firstEdge != null) { Node tmp = v.firstEdge; while (tmp != null) { s += tmp.adjvex.data.ToString(); tmp = tmp.next; } } s += "\r\n"; } return s; } //嵌套类,表示链表中的表结点 public class Node { public Vertex<T> adjvex; //邻接点域 public Node next; //下一个邻接点指针域 public Node(Vertex<T> value) { adjvex = value; } } //嵌套类,表示存放于数组中的表头结点 public class Vertex<TValue> { public TValue data; //数据 public Node firstEdge; //邻接点链表头指针 public Boolean visited; //访问标志,遍历时使用 public Vertex(TValue value) //构造方法 { data = value; } } } AdjacencyList<T>类使用泛型实现了图的邻接表存储结构。它包含两个内部类,Vertex<Tvalue>类(109~118行代码)用于表示一个表头结点,Node类(99~107)则用于表示表结点,其中存放着邻接点信息,用来表示表头结点的某条边。多个Node用next指针相连形成一个单链表,表头指针为Vertex类的firstEdge成员,表头结点所代表的顶点的所有边的信息均包含在链表内,其结构如图8.12所示。所不同之处在于: l Vertex类中包含了一个visited成员,它的作用是在图遍历时标识当前节点是否被访问过,这一点在稍后会讲到。 ...

2013-01-06 · 4 min · bystander

从相亲延伸出的婚恋意义

相亲现在挺火的。。 文章来自xiuloveshow 老妈说:“妈希望你找个家庭条件好点儿的,以后少吃苦,别走老妈的路!”。老爸说:“老爸没别的要求,就希望你找个家庭和睦的,这样的家庭教育出来的子女各方面都不会差到哪儿去,家庭条件爸不是特别看重”。老哥说:”这么大个村儿就你一个单身了,小心被剩下!“。朋友说:”咋总是忙着给别人介绍,赶紧把自己推销出去再说!”我说:我想找个在我不开心的时候,什么都不用做,就静静的呆在我旁边,即使是看着我哭也好。 三毛说:看得不顺眼的话,千万富翁也不嫁;看得中意,亿万富翁也嫁。张小娴说:你走,我不送你。你来,无论多大风多大雨,我都要去接你。史铁生说:爱情就是在追求喜欢和爱,这二者同时达到便是爱的理想状态,爱就是一种理想。我说:嫁与不嫁,送与不送,喜欢与爱,我只想用我自己的方式去做人生最重要的选择,这种东西没有参数值,用完一次便没有了! 之前为凑热闹跟一老乡去相亲,相亲的目标性特别强,大家都冲着结婚去的,他们从来不会凭感觉去判断这个人是否是自己中意的人。对方开口便问月工资多少?家里买房没?而男方像是履行一项任务或是已经习惯了这样一套开场白,还未等女方开口,从爷爷的退休工资开始说到自己的工资水平。这其中我没有听到任何一句关于心理沟通的话题,全是围绕物质展开的激烈对白。我有点儿后悔跟她去了,这让我看到了现代人最“真实”的婚恋观,我有些后怕! 后来,我问老乡对男方的印象怎么样。她毫无掩饰的说:“家庭条件还可以,人也挺老实,没更好的就成了“”你到底想找个什么样的?”因为我不确定她的方向,作为女性擅有的八卦心态,我还是忍不住问了。“没什么特别的要求,只要有房,工资还可以,父母不要我们负担就好了。至于感情可以慢慢培养的!”她的表情很轻松,像是在述说一件很平常的事。我有些失望,像是在风和日丽的宁静之夏突然袭来的狂风暴雨。 我想如果是我,我不一定要多大的房,多高的工资。物质和精神两个层面,我永远把精神排第一。两个人每天围绕着柴米油盐酱醋茶,围绕着生活中的琐琐碎碎,内心的苦闷却苦于找不到人述说。彼此不懂对方的世界,不懂爱好为何物,不懂兴趣乃何价,这样的恋爱,这样的婚姻多么的恐怖。我不希望半夜醒来向着电台诉说悲伤,乞求听众收容我的眼泪! 如史铁生所说,爱乃一种理想。即为理想凭努力不一定能达到。喜欢一个人和爱一个人是完全不同的两种境界,喜欢一个人,当激情用尽之时,就只有靠着那张印着两个人照片的结婚证来维持彼此的关系,这种关系完全靠法律来维系。爱一个人,当你生老病死,激情褪去之后依然想着跟你白头到老。这些恐怕是一张房产证换不来的细水长流般的幸福。关于物质和精神,关于爱和不爱。物质已经主导了我们的价值取向,我们不再自已。物质可以让人放弃精神随时转变自身角色,爱也会因为物质变得不爱了。 我已经很久没有听到关于爱的序曲了。物质可以这样轻易的扭曲爱的意义,我们追求的幸福到底为何物? 当年因物质放弃了最宝贵的东西,最稀有的精神支撑,当你得到了你所有物质的满足,物质填充了你的欲望,你能坦然的对自己说你很幸福?当你开着宝马,驾着良驹,住着豪宅,驱着游艇,是否我们就幸福了? 我努力学习,认真工作,享受音乐,沉侵阅读,爱好写作,喜欢画画,偶尔给老爸老妈给好朋友煲电话粥!我不依赖任何人,我不向任何人屈服!面对机会我不放弃,面对感情拿得起放得下,面对亲情我感动无疑!喜欢倾听,喜欢跟人交往,喜欢跟老人交谈…。消费过后还有金钱结余,偶尔向文字倾吐心声。继续等待着那个可以说话的人出现。自创的理想也可以很诗意! 我希望的婚恋观如同我的生活般平静,如果你能走进我的世界,如果你懂我的世界,我们可以无话不谈。但似乎这变成了一种奢侈,我们就是简单的无话可说!你在你的世界游历,我在我的世界漫步,踽踽独行有何不可!

2012-12-10 · 1 min · bystander

从平庸到幸福

一篇来自左岸的文章,可以读一读。只是不知道有几人能够认认真真读完。文予有缘人。随意吧。 作者:文刀 当一件事情刚开始时,我们总会偏向于好的预期,因为这样我们才会去行动。当事情在不断的进展时,外界的因素(客观条件)总会引起我们主观上的波动,时而信心满满,时而跌入谷底。然而事情总是要有个结果的,在这样一种偏向反复,时好时坏的自我预期中,有些人选择了放弃,有些了继续了坚持。放弃,或许是因为有更明智的选择,又或许已经没戏了。坚持,或许是因为没有了退路,又或许是总体偏向于好的预期。不管怎么样,预期总会无穷的趋于向现实要一个结果。而关于结果是正无穷还是负无穷,我们却无法量化,因为做每一个选择,特别是人生选择时,其机会成本(选择成本)是无法量化的。读三年研与先工作三年是难以在同一个人身上同时进行,是不可逆的单一选择,也就无法真正理性地去决定。而我们之所以能够去决定,大部分取决于我们自己与身边人的偏好。所幸,我们都能也都应该看到,做如此的选择并没有犯下方向上的错误。总体上这条路上,我们的步伐是朝前迈的。我们的学识,我们的视野都在增进,然而,要问我们是否就此告别了平庸,是否走向了幸福与快乐,这却是无关的。 知识的增长并不意味着个人道德水平的提高或是人个涵养的提升。在物欲横流的社会中,总能听到那么多关于知识分子的道德丑闻与民工的善行。平庸并不是表明人的身份,而是表明个人的如何从众。所以,对于钱权与名利的追求,恰恰是平庸之举。再看看幸福,知识的提高会带来更高的视野,也可能会导致更多的欲求。有限理性的欲求会是生活源源不断的动力,带来的实现会成为幸福的体验。纵然如此,这也只是一时的,更多的幸福并不在于我们要不断去满足,而是要学会去知足,学会去感激,去给予。所以,幸福是一种认知状态,是一种心境。 再来设想一下,当我们把梦想比作一种财富的实现,我们就会发现。当一阶段内的目标实现了,我们就会寻找下一阶段的目标,然后再去实现它。这样的生活是富有挑战与方向感的,也就是有意义的,这种不断的自在追求本身会是幸福的。如此,追求财富就如梦想一般无可厚非(可能财富就是梦想),但如果我们无法认清财富存在的更多效用,我们就免不了坠入平庸,欲壑难填,我们又何来幸福。一千万在当下社会足以自在一把,然而却已然超出了本身的欲求(理性的),那么就应该拿出钱来做好事,给予会让自己更为幸福,因为我们可以就此看到更多幸福的存在。 即使把幸福看作是一种认知状态,一种心境,但其也应该是我们毕生的追求。以前,我们生活无忧无虑,饭来张口衣来伸手,但我们都明白,那也只是一时的,是建立在亲人的血汗之上的。如今,我们走出校园,参加工作,就要懂得去承担相应的去给予身边人力所能及的照顾。从接受到享受再到给予最终还是到享受,这一过程就是认知状态的提升,就是对幸福的追求。幸福是学会接受与学会给予的过程。心境是个什么概念,又要如何提升呢?我们都清楚,在现世中不存在世外桃源,田园牧歌也不太现实。那么,我们就要学会把这种不可能变成可能带到生活中,其唯一的途径就是提升我们的心境。而这并不是说,我们要在现实生活中学会自欺欺人,而是把这样一份浪漫主义的情怀赋予到真实中,做到真、性、情。对于生活中的真真假假,我们要学会看到,看透,看淡;对于生活中的点点滴滴,我们要学会感激,感怀,感悟;还有对于他人,对于自己,也要力求做到真与善,从而现实幸福的美感。如此,心境的提高是一个领悟与缓慢提升的过程。幸福是一生的追求。 当我们意识到追求梦想更深的是在追求幸福时,我们又深深的坚信着幸福是一种心境,那我们何不学会像相信幸福总是存在一样去相信梦想会实现呢,我们又何必多去假定另一种不好的预期存在呢。既然我们已经走在路上了,在正确追求幸福的路上呢,那我们何不去幸福呢 ?相对于冷漠的大众,我深信,时时能感到幸福,时时有梦想,为断去追求幸福的人,注定是个不平庸的人。

2012-12-05 · 1 min · bystander

关于爱情和爱情的附加值

 看到一篇好文。出处未找到。分享之。如果你不能静下来看完。那么就看我画出来的部分吧。 我一直在想,假如查尔斯王子只是一个普通的男人,那么19岁的戴安娜还会在明知他另有所爱的情况下嫁给他吗?在戴安娜一段被公开的录音带中,她曾经说大婚那天是她生命中最糟糕的一天——“我的心像死一样平静,我感觉自己像待宰的羔羊。” 她其实是可以不必那么可怜的,没有人把她送到案板上,是她自己愿意的。如果她不肯,谁还会强迫她站在教堂里对另一个男人说“我愿意”,是她自己说的。但是能责怪她吗?假如换着是我,我是不是也会说“我愿意”呢?我能分得清楚我是在对一个比自己年长很多而又与前情人藕断丝连的男人说“我愿意”,还是对那一顶令人羡慕的未来王冠说“我愿意”?即使当时年幼,戴安娜分不清楚这二者的区别,但后来她实际上也是有很多机会的。当他与查尔斯王子名存实亡以后,她是可以选择离婚的,但是她迟迟不肯,即使全世界都知道他们感情不在,她依然固执的要求保留“王妃”的头衔。也许是她已经习惯被称为“戴安娜王妃”,也许是她觉得自己为这个称号付出了太多,所以她不能失去这一荣誉。 据说英国电视台要以查尔斯、戴安娜和卡米拉的故事为蓝本拍一个片子,名字叫《爱情究竟是什么》。是呀,敢问情是何物,竟叫人生死相许? 我是读着《简·爱》长大的,我的爱情启蒙就是那个出生卑微的女教师对身份高贵的男主人说的那段话:“你以为我穷,不美,就没有感情吗?我也有的,假如上帝赐予我美貌与财富,我一定会使你难以离开我,正如我现在难以离开你,上帝没有这样做,但是我们的精神是平等的……” 待我长大一点,我冷不丁地想:如果上帝赐予简·爱小姐美貌与财富,她还会爱上那个又老脾气又坏的罗切斯特先生吗?不要责怪女人对爱情的态度,除了七仙女,没有几个女人会看上卖身为奴的董永。七仙女不食人间烟火,她有神仙血统,人间名利对于她来说,只要她想要,还不是唾手可得?她要的是一个她喜欢的男人,只要她喜欢就够了。你挑水我浇园,夫妻恩爱不夜天。对于七仙女来说,爱就是一件简单得不能再简单的事情。她不指望从爱情中再捞到些别的,因为别的,她可以用别的方式得到,惟有爱情本身是不可替代的。 但是对于我们寻常女子来说,我们能做得到吗?喜欢上一个男人,就跟他欢天喜地?我相信许多人是做不到的,因为我们对爱情的指望太多,我们期待从爱情中得到“附加值。我们对自己说,世上没有无缘无故的爱,如果爱一个人,不能给自己带来提升,为什么要爱他呢?甚至有许许多多的爱情指南大大方方地告诉我们:干得好不如嫁得好,为什么不能一举两得?嫁一个优秀的男人,既得到爱情又得到财富。是呀,为什么不呢?问题是世界上哪里有那么多便宜事?即使美丽如戴安娜王妃都无法如愿,何况我们呢? 要女人在一开始就分清楚,爱一个人,还是爱一个人所能提供的生活,这是很难的。跳水公主郭晶晶在被问到与富家公子的关系时,她说:“我爱一个男人不是爱他的钱,而是他的修养。”听到她这话的人都笑了:“原来不是为钱啊,如果那个男人是一个穷光蛋,你会发现他有修养吗?” 看过李少红拍的一部电视剧《橘子红了》,当中有一个周迅扮演的角色,名字叫秀禾。她本是一个穷人家的女孩子,为了改善家庭经济,缓解家人负担,自愿嫁到富人家里做三姨太,因为样貌可爱深得老爷喜欢,但是她在满足了一切物质需要以后,她发现自己真正爱的人是老爷的弟弟。 女人总是这样的,常常听女人评论什么样的男人不值得爱,她们往往会撇着嘴说,那些不成功没有经济能力的男人是不能嫁的,他们缺乏富人的风度和心胸。其实女人自己何尝不是这样?那些没有尝过富裕生活滋味的女人,有几个能像张曼玉那样,冷冰冰的抛出一句台词:“你有钱有什么了不起?我也有啊!” 在年少无知的时候,常常搞不懂富人家的女人为什么会偷情。尤其是封建社会,那是一旦被发现就要沉塘的死罪,可是为什么女人会冒着生命风险去做这等事情?就像秀禾,嫁给老爷之前,她的幸福愿望就是能得到老爷的宠爱,能对得起大太太的照顾,但是当她轻而易举地得到这一切以后,她却发现自己很痛苦。甚至比嫁入豪门之前还痛苦,那时她不过是穷,但是现在她觉得不自由,因为她没有爱情。 爱情究竟是什么?这个世界上到底是否存在纯粹的爱情?是什么让罗密欧与朱利叶生死相随?是什么让温莎公爵舍弃江山和王位?难道真的是因为他们幼稚或一时冲动吗?我相信不是。爱是一种无法替代的感情,除了和你爱的人在一起,否则你无法感受到爱的幸福。但是爱情的附加值则是可以替代的,如果你希望通过爱情而获得财富,那么当你获得财富以后,你就不认为你还需要和那个财富的提供者在一起。尤其当你借此成长起来,并且建立了自己的财富王国,你就不愿再忍受当初那个“男人”。因为你自己也有了,所以他在你的生活中很快就会成为一个多余的人,一个碍手碍脚的人,一个妨碍你追求幸福和自由的人。 出生于法国的英国作家毛姆曾经说过:“感情有理智所根本不能理解的理由。”他在传世之作《月亮和六便士》(卓越 当当 京东)中描写了一个名叫爱施略夫的男人,那是一个从任何一个角度讲都称得上是“好丈夫”的男人。他有钱,给妻子提供了安逸的生活,他对妻子很好,什么事情都由着她的心思。而她的妻子对他也一直很不错,直到有一天,他的妻子遇到一名穷困潦倒生活不能自理的画家。这名画家的原型据说是高更。人们都谴责这名画家勾引了这名良家妇女,但是毛姆另有解释,原话摘录如下:“过去我认为她爱施特略夫,实际上只是男人的爱抚和生活的安适在女人身上引起的自然反应。大多数女人都把这种反应当爱情了。这是一种对任何一个人都可能产生的被动的感情,正像藤蔓可以攀附在随便哪株树上一样。因为这种感情可以叫一个女孩子嫁给任何一个需要她的男人,相信日久天长便会对这个人产生爱情,所以世俗的见解便断定了它的力量。但是说到底,这种感情是什么呢?它只不过是对有保障的生活的满足,对拥有家资的骄傲,对有人需要自己沾沾自喜,和对建立起自己的家庭洋洋得意而已。女人们秉性善良、喜爱虚荣,因此便认为这种感情极富于精神价值。但是在冲动的热情面前,这种感情是毫无防卫能力的。” 女人在爱一个男人的时候,到底是更爱这个男人本身,还是爱他所能提供的生活品质?当女人一无所有的时候,那些爱情的附加值将对女人具有极大的诱惑力,但是当她自己成长起来,足够强大到凭自己的能力也可以得到梦想的生活时,那些所谓的附加值在女人眼里就一钱不值了。凡是通过努力通过购买可以得到的东西,独立女性在成功以后也是可以享受得到的,为什么要靠男人?但是爱情却是可遇不可求的,好容易在茫茫人海中看到一个如意的人,那种冲动就像七仙女看到董永一样,她一定是迫不及待地下凡,因为惟有下凡,才体会得到凡间的快乐。 我一个女性朋友,有一段时间一直犹豫不决。两个男人她都喜欢,男人甲与她青梅竹马,男人乙与她邂逅相逢。男人乙是一公司的高级职员,有车有房经常带她去吃西餐,男人甲在一名不见经传的公司做文案,骑自行车租地下室偶尔在外面吃一顿,也都是马兰拉面麦当劳。她很苦恼,她说喜欢与男人甲在一起的感觉,虽然穷,但是总是有很多话很快乐很亲密,但是她不喜欢与男人甲在一起的生活。虽然男人甲对她保证两年内就可以攒足房子的首付,但是要等两年,而且那房子一定是四环以外的。至于男人乙,她喜欢他所提供的生活,但是她觉得他很闷,与他在一起她总是很紧张,连吃西餐刀叉的姿势都在家练了又练。我们说,你可以等一等,不用很着急呀。但是她很着急,我知道她急什么,她等不得,她要立刻兑现。既然这样,她当然要选择那位经常能带她去吃西餐的男人乙了,因为对于她来说,这样的男人属于现钞。 也许因为男人乙很闷吧,再加上高级职员的工作很忙,她婚后仍有大把时间。她是一个很努力的女人,大部分时间都用来进修,反正老公有钱,那么学习总不是错吧?之后她跳槽,升职,加薪,她轻而易举地买了自己想买的房子,但是她却不肯与自己的老公分享,因为他没有爱的价值。 不要说我的朋友不痛苦,她如果不痛苦她就不会找我倾诉了。她想再找回当年的感情,但是那难度比找回去年的雪还大。她常常抱怨,我当时为什么这么傻?不就是一个三环边的房子和一辆富康车吗?不就是几顿小情小调的西餐吗?我就答应和他生活一辈子,一辈子是多长的时间啊! 我们都不能否认爱情中除了有爱情还有其他的东西,自古以来就有无数女人通过爱一个男人而彻底改变自己命运的例子,那些女人到底是幸运还是不幸?我想假如她们像从来没有吃过禁果的夏娃,或者像从来没有向人间偷窥的七仙女,她们也许是幸运的,因为她们不知道什么叫爱情。她们以为爱情就是她们已经得到的生活,但是千万不要让她们接触到任何与爱有关的事物,那会大大刺激她们的。她们在刺激之下,会觉得自己是最可怜的女人。就像查泰莱夫人一样,丈夫那样有地位有身份,但是当她懂得什么叫世间的爱之后,她还是义无返顾抛家舍业。因为她知道,那种爱是无法替代的,是物质生活不能补偿的。我不希望你像查泰莱夫人一样,在忍受那么多屈辱、不幸、心灵的折磨之后,才奔向情人的怀抱。你原本是没必要给自己找那么多麻烦的, 一个你不爱的男人,即使一切都好,又能好到哪里去呢?无非是他能给一些你现在还得不到的生活品质,但是如果你对自己有信心,那些所谓的生活品质是很难达到的吗?也许现在你会为一个肯送你路易威登手提袋的男人而心动,但是当你自己可以到巴黎总店随便挑选的时候,你还会为那个男人心动吗?你还会因为他送得起这样一个昂贵的包而凭空给他打几个高分吗? 世间值得追求的东西很多,但惟有爱情,是必须真心相爱才可以尝到它的滋味的。而其他的东西,你得到它的途径其实有很多,并不一定非要通过和一个人结婚才可以得到。既然这样,你为什么要给自己的爱设定那么高的门槛?我担心的不是你对爱的要求太高,我是担心迈得进你门槛的人,恰恰都是与爱无关的人。因为真爱是不需要门槛的,而且也不屑于门槛。爱是两情相悦,你情我愿,又不是在自由市场挑西红柿,非要找性能价格,比最合理的。 恋人之间最爱问的一句话,大概就是“你爱我什么?”从来没有人会说我爱你的钱,你的财富,你所能给我提供的生活,为什么?因为我们都知道那太煞风景。至今为止,我听到的最动人的答案是一句英文:“I LOVE YOU NOT BECAUSE OF WHO YOU ARE,BUT BECAUSE OF WHO I AM WHEN I AM WITH YOU.”我不知道如何把它翻译得浪漫多情,但是我想即使是直截了当的翻译,那其中的真情也足以动人:我爱你,并不是因为你是谁,而是因为和你在一起时,我才是最真实的我。 [text]PS:私自觉得那句英文应该翻译为:我爱你,不是因为你是谁,而是因为我在你面前可以是谁。[/text]

2012-10-20 · 1 min · bystander

C# 网络编程系列

本系列来自博客园的Learning hard园友。每个博主都不容易,我这里只是给出一个索引,希望更多热爱技术的人能够看到。给分享者更多的鼓励和支持。 专题一:网络协议简介 专题二:HTTP协议详解 专题三:自定义Web服务器 专题四:自定义Web浏览器 专题五:TCP编程 专题六:UDP编程 专题七:UDP编程补充——UDP广播程序的实现 专题八:P2P编程 专题九:实现类似QQ的即时通信程序 专题十:实现简单的邮件收发器

2012-09-25 · 1 min · bystander

WPF毛玻璃效果Demo和一个问题

 那天看到WPF书上讲的毛玻璃效果,就去找了下效果。。忘了例子是从哪发现得了。。先看下效果, 但是这不是重点,作者给出的代码有一个设计时错误。。错误提示为: 无法将类型为“Microsoft.Expression.Platform.WPF.InstanceBuilders.WindowInstance”的对象强制转换为类型“System.Windows.Window”,, 中文搜了一下。没有发现有人解决过。目测。。。然后又拿英文搜了下。几经辗转。。终于是解决了。。原文在Unable to cast XAML error。其实就是将原作者这个函数修改如下的 public static void OnIsEnabledChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { if ((bool)args.NewValue == true) { Window wnd = obj as Window; if (wnd != null) wnd.Loaded += new RoutedEventHandler(wnd_Loaded); } } 也就是验证了一下转换是否成功。 下载:修改后的RGSamples

2012-09-24 · 1 min · bystander

一个可定制的WPF任务对话框

今天实在看WPF揭秘的时候看到TaskDialog这个控件的。然后就去找了一下开源的代码。在codeproject上发现了这个,非常给力。。另外codeproject改版后很漂亮哦。 介绍: 这是用WPF实现Vista上TaskDialog效果的代码。 Messagbox消息框 通过调用重写的静态Show方法。TaskDialog就会表现的像一个Messagebox。他有四个文本类型的属性:Header(头部), Content(内容), Detail(更多), 和 Footer(底部),其实Detail是一个折叠的区域, 而Header和Footer还有一个icon属性(HeaderIcon和FooterIcon),除此之外,Header还有Background(背景)和Foreground(前景)属性 // TaskDialog.Show方法签名 public static TaskDialogResult Show( string title, string header, string content, string detail, string footer, TaskDialogButton button, TaskDialogResult defaultResult, TaskDialogIcon headerIcon, TaskDialogIcon footerIcon, Brush headerBackground, Brush headerForeground) // TaskDialog.Show 方法的一个例子 TaskDialog.Show("Task Dialog 测试", "消息框的标题文字", "消息框的内容部分. " + " 可以自适应内容.", "消息框的细节部分 " + "可以自适应内容", "消息框的底部.", TaskDialogButton.Ok, TaskDialogResult.None, TaskDialogIcon.Information, TaskDialogIcon.Shield, Brushes.White, Brushes.Navy); 定制TaskDialog 使用静态的Show方法。Header, Content, Detail, 和Footer 就限制了只能传递字符串作为值了。 为了定义这个对话框,你先创建TaskDialog类的一个对象,然后分别设置一下各个属性,最后调用Show方法就可以了 // TaskDialog 实例化例子 TaskDialog dialog = new TaskDialog(); dialog.title: = "TaskDialog example"; dialog.HeaderIcon = TaskDialogIcon.Warning; dialog.SystemSound = TaskDialogSound.Exclamation; // header 属性设置 dialog.Header = "This is the Header."; dialog.HeaderBackground = Brushes.DarkGray; dialog.HeaderForeground = Brushes.White; // Content, Detail 和 Footer属性设置 dialog.Content = "This is the content"; dialog.Detail = "This is the detail"; dialog.Footer = "this is the Footer"; dialog.Show(); TaskDialog控件派生自HeaderedContentControl类,因为从HeaderedContentControl类可以获得Header和Content属性,TaskDialog仅仅是添加了Detail和Footer属性,这些属性是Object类型,并且有他们自己的template(模板)属性HeaderTemplate, ContentTemplate, DetailTemplate, 和 FooterTemplate),TaskDialog类对于文本内容有着缺省的数据模板,当然你也可以用那四个模板来替换,这样你就可以以你喜欢的任何方式来格式化文本了。下面这个图展示了通过斜体和下划线来格式化文本。 图2 //为上面这个图的content属性的 DataTemplate 模板 <DataTemplate x:Key="_customContentDataTemplate"> <TextBlock Text="{Binding Content, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Controls:TaskDialog}}}" FontStyle="Italic" TextDecorations="Underline" TextWrapping="Wrap"/> </DataTemplate> 因为Header,Content,Detail和Footer是object类型,因此不再受到只能是文本的限制了,你可以防止你喜欢的任何类型到TaskDialog,下面这个例子中的TaskDialog是不是很像UAC的提示呢。这里Content属性是一个UserControl类型,放置了一个图片和一些文本还有两个CommandButtons(都是普通的按钮。。不过添加了一些定制的样式,再加了Header属性) ...

2012-09-24 · 1 min · bystander

汇编-32位CPU所含有的寄存器

今年的课程有汇编。真为校领导的智商捉鸡。。不过还是要学的。分享一篇来自中文FLEX例子的汇编寄存器的文章。很不错的一篇寄存器详解的文章。文章最后是我找到的一个汇编指令助手。 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种”可分可合”的特性,灵活地处理字/字节的信息。 寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、 除、输入/输出等操作,它们的使用频率很高; 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作 中,当移多位时,要用CL来指明移位的位数; 寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也 可用于存放I/O的端口地址。在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。 3、指针寄存器 32位CPU有2个32位通用寄存器EBP和ESP。其低16位对应先前CPU中的SBP和SP,对低16位数据的存取,不影响高16位的数据。 寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 它们主要用于访问堆栈内的存储单元,并且规定: BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据; SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。 4、段寄存器 段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成 的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。 CPU内部的段寄存器: CS——代码段寄存器(Code Segment Register),其值为代码段的段值; DS——数据段寄存器(Data Segment Register),其值为数据段的段值; ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值; FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。 在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简单描述如下: 实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为”段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。 保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为”选择子”(Selector)的某个值。 5、指令指针寄存器 32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。 指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能时,不考虑存在指令队列的情况。 在实方式下,由于每个段的最大范围为64K,所以,EIP中的高16位肯定都为0,此时,相当于只用其低16位的IP来反映程序中指令的执行次序。 6、标志寄存器 一、运算结果标志位 1、进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。 2、奇偶标志PF(Parity Flag) 奇偶标志PF用于反映运算结果中”1″的个数的奇偶性。如果”1″的个数为偶数,则PF的值为1,否则其值为0。 利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。 3、辅助进位标志AF(Auxiliary Carry Flag) 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0: (1)、在字操作时,发生低字节向高字节进位或借位时; (2)、在字节操作时,发生低4位向高4位进位或借位时。 对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。 4、零标志ZF(Zero Flag) 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。 5、符号标志SF(Sign Flag) 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。 6、溢出标志OF(Overflow Flag) 溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。”溢出”和”进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。 二、状态控制标志位 状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。 1、追踪标志TF(Trap Flag) 当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。 2、中断允许标志IF(Interrupt-enable Flag) 中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下: (1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求; (2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。 CPU的指令系统中也有专门的指令来改变标志位IF的值。 3、方向标志DF(Direction Flag) 方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。 三、32位标志寄存器增加的标志位 1、I/O特权标志IOPL(I/O Privilege Level) I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。 2、嵌套任务标志NT(Nested Task) 嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下: (1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作; (2)、当NT=1,通过任务转换实现中断返回。 3、重启动标志RF(Restart Flag) 重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示”接受”调试故障,否则拒绝之。在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。 4、虚拟8086方式标志VM(Virtual 8086 Mode) 如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。 下载:汇编指令助手

2012-09-24 · 1 min · bystander

WPF主题分享及使用

首先是一个很流行的WPF20多种xaml主题合集源码。这个主题系列是非常漂亮的。我找到了源码。但是没有找到官网。 update:感谢月亮云的提醒,官网是:http://wpfthemes.codeplex.com 截两幅图如下: 使用很简单。一种是将WPF.Theme.dll导入。像demo展示的那样。使用其提供的主题管理类来使用。可以实现任意切换效果。另一种就是直接把源文件的各种theme.xaml提取出来,添加到资源字典就行了。当然还有一些不重要的小细节。相信你对wpf比较了解的话可以搞得定的。。还可以自己学习一下。。 昨天还看到一个主题,也比较漂亮。Amazing WPF Controls分享一下。如果有什么疑问。欢迎留言讨论。 下载:WPF20多种xaml主题合集源码

2012-09-18 · 1 min · bystander