Lambda高手之路第五部分

武汉下雪了。。今天介绍Lambda表达式非常有用的情况。。ps:这个高手之路已经翻译了10000多字了。。疼啊。。 一些模式比另一些模式有时候更加合适,真正有用的模式是自定义方法表达式,用爱促使话一些对象的部分,我们考虑下面这种情况。 我们想要创建一个可以处理多种延迟加载的对象,这意味着即时对象已经被实例化了,我们还没有加载所有请求的资源,一个理由就是防止大量的IO操作。(比如通过网络传输),当我们开始使用数据的时候,我们想要确定数据足够新鲜,现在有一些确定的方法可以做这个。并且最有效的显然是实体框架已经用LINQ解决了延迟加载的问题,Iqueryable仅存储了查询,而没有任何无关的数据。一旦我们请求一个结果。不仅仅构造的查询被执行,同时也被以更高效的方式执行,比如一个在远程数据服务器上的SQL查询。 在这里,我们仅仅想要看看两种情况的不同点,首先,我们查询,一切就绪,查询应该在已经加载了的数据上进行。 简单来看,这里我们有两种不他哦你的方法,地一个是我们把数据从数据库里提取出来(也就是Database静态类所做的),然后第二个方法将会过滤从数据库里提取出来的数据。一旦我们将会从我们的第一次查询取得结果,当然我们也可以构造内置的其他方法来重置类的行为,对于工业级的代码,其他的方法也许更加有用。 另一个例子是初始时间分支,假设我们有一个对象,该对象有个方法叫做Perform(),这个方法可以用来调用一些代码,包含这个方法的对象可以被初始化,初始化有三种方式。 通过传递方法来调用 通过传递一些包含这个方法的对象来调用 或者通过传递第一种情况下的序列化以后的信息来调用。 现在我们可以保留所有的三种方式做全局变量。而Perform方法将不得不查看当前的状态(或者是保存在枚举变量里,或者和null进行比较)然后检测被调用的正确的方式,最后调用开始。 更好的一种方法是吧Perform()方法写成一个属性,这个属性仅仅允许在类里面进行set,它是一个委托类型,现在我们可以在对应的构造方法里面直接设置这个属性,因此,我们可以不用全局变量,也不用担心这个对象是如何实例化的,这种方法更好。 看一小段简单的代码。 即时这个例子看起来如我们所愿被构造了。让阿尔。大多数情况下只使用前两种,但是随着领域特性语言,编译器,日志框架,数据访问层和其他很多情况下,通常有很多方式可以完成,但Lambda表达式也许是最优雅的。 考虑这种情况,我们可以在函数编程领域体会到即时调用方法表达式的好处,我们可以看到C#中IIFE的一种用法。用的不多。但是我认为真的很好。但不是用在这种情况下。 我们也可以使用即时调用方法来防止一些确定的非静态的方法被重复调用。这就会出现自定义方法和初始时间分支和IIFE的组合使用了。 下一节介绍一些新的Lambda设计模式

Lambda高手之路第四部分

首先祝大家平安夜快乐。本篇介绍一些流行的JavaScript模式。为下一篇打基础 使用/了解JavaScript的一个好处就是函数的高级用法。。在JavaScript里。函数仅仅是对象。他们可以有赋给他们的属性。而在C#中。我们不能做我们可以在JavaScript的全部事情。但是我们仍然可以做些事情。一个原因是JavaScript在函数里给变量以作用域。因此,不得不通过创建函数,大多数情况是匿名的来定位变量。而在C#中。通过使用块,通过花括号来创建作用域 当然,换种方式来说。C#中,函数也会给变量作用域。通过使用Lambda表达式。我们通过花括号在其里面创建了一个变量。然而。我们也可以局部的创建作用域。 我们来看看通过使用Lambda表达式可以实现一些在JavaScript里面有用的模式把。 回调模式 这个模式是个老的模式。事实上。回调模式从.net 的第一版就开始使用了。但是是以一种很简单的方式实现的。而现在。通过使用Lambda表达式。闭包,捕获变量等特性能够允许我们写出如下的代码来。 对于JavaScript程序员会觉得这没什么啊。他们使用这个模式太多了。然而,它非常有用。因为我们可以使用参数作为Ajax相关事件的事件处理器(比如oncompleted,onsuccess),等等。如果你使用LINQ,那么你可能也会用到回调模式的一些东西。举个例子。LINQ的where子句将会在每一次迭代中回调你的查询语句。这只是回调函数的一个例子。在.net的世界里。事件如它名字所暗示的那样。通常是事件处理的首选方法。这有时候很像一个回调。他有两个参数。有一个特殊的关键字和一个类型模式(两个参数分别是sender和arguments,sender通常是object类型。Arguments通常继承自EventArgs) 可以通过+= 和-=给事件添加/删除事件处理程序。 返回方法 和普通的方法比较。Lambda表达式也可以返回一个方法指针(就是一个委托实例),这意味着我们可以使用Lambda表达式创建/返回一个lambda表达式(或者今年仅是一个已定义好的方法的委托实例),大量的情况下。这个模式也很有用。首先看一下例子。 代码本应该更短些。我们可以让default如果请求的语言没有找到。只是抛出一个异常即可。不过。这个例子展示了这是一种方法工厂。另一种同等效果的方法是包含一个Hashtable。或者更好的话用Dictionary<K, V> 即使这看起来似乎有点过度工程化了。但是也许这是方法工厂最好的例子了。毕竟方法简单易扩展,可以被用在很多情况下。这中模式和反射的组合可以是的程序代码更松耦合,更易使用。并且代码更健壮。下图展示了模式的工作流程 自定义方法 自定义方法模式一个JavaScript中普遍的技术。可以用在代码中提高性能和健壮性,这种模式的背后思想是方法被设置为一个属性。于是可以和其他方法非常方便的交换。我们看一下具体的代码 这段代码做了什么?好吧。第一种情况下,我们得到第一个素数。也就是2.虽然这很显而易见。我们可以体征我们的算法默认来排除掉所有的偶数。这就加速我们的算法。但是我们依然能够得到开始的偶素数2.我们就可以通过调用NextPrime方法来获得素数了。我们就可以在第二部分里有话我们的算了。 我们已经看到这种写法可以优化性能。我们可能一下这个例子 这里我们有了两根分开的区域。一个是为钱1000个数准备的。其他的则留在了另一个区域。通常我们可能需要区分这两种情况。这就是我们为什么使用了自定义方法,当小区域执行完后,自定义函数就会改变了。来执行大的区域了。 即时执行方法表达式 在JavaScript中即时执行方法表达式也叫做IIFEs,也相当普遍。这是因为在JavaScript中,不像C#中的花括号可以构造一个局部变量。因此一个变狼可能会污染一个全局对象。(最有可能就是一个window对象),由于很多原因,这种情况很不好。。 解决方法也很简单,当花括号不能给一个作用域的时候,方法却可以。因此,定义在方法里面的变量就被限制在这个方法里。就像是他的孩子一样。因此,通常JavaScript用户想让那些方法立刻执行。否则,是对变量名和语句行的浪费。另一个原因就是这个方法只执行一次。 在C#中我们也可以写出类似的方法。我们也会得到一个新的作用域。但这不是我们主要关心的。因为我们可以随心所欲创建新的作用域,我们看些例子 这段代码很容易理解。然后,如果我们想要传一些参数时候。我们需要定义他们的类型你个,我们看一下如何给即时执行方法传递参数 看上去似乎没做什么。然而。我们可以和async关键字组合起来。我们看 Ok了。 即时对象初始化 我把这个模式放在关于Lambda表达式的文章里是因为匿名对象比我们刚刚的一些简单的例子能表达的要多得多。其中一个就是匿名对象也可以包含Lambda表达式。这可以作为我写在本文里的理由。 如果你想要运行这个模式,你可能会看到一个异常。。至少我看到了。。这难以理解的理由是Lambda表达式不能被赋给匿名对象。如果你也没明白。。那我们看来是坐在一条船上的。 幸运的是,编译器已经告诉我们了。“哥们,我不知道我该为你的那个Lambda表达式创建哪种类型的委托啊”我们可以帮一下编译器。如下所示。 一个问题就产生了。方法(这里是Ask)存活的作用域是什么?答案是他存活在创建匿名对象的类里面,或者如果他使用了捕获变量,就在他自己的作用域里面。因此,编译器仍然创建了一个匿名对象(包含对编译器生成的类的元数据,实例化了一个有着类信息的新的对象),但是只是设置了委托对象Ask属性 注意:你应该避免使用这个模式,当你真的想要访问一个匿名对象的所有属性的时候。理由如下:C#编译器请求在你使用每一个对象之前,应该首先声明他。因此,用的地方一定在声明之后,但是编译器怎么知道?在编译器看来。Person变量还没声明完呢。就开始使用了。 所以,在上面那个Lambda表达式里并不能直接访问person的Name和Age属性 有一个方法跳出这个陷阱(事实上有很多种,但我只喜欢这一种最优雅的,考虑下面这段代码 现在因为我们之前已经声明了,我们也可以说明person为object对象。但是这样的话我们就要用到反射机制了(可能还需要一些漂亮的包装器),来访问匿名对象的属性,在这种情况下,我们依赖于DLR,他会对这种情况出现一个最漂亮的包装器,现在这段代码就非常JavaScript化了,我也不知道是好还是坏,这也就是为什么我说这个是一个注意点。。 初始时间分支 这个模式事实上和自定义方法非常接近,唯一的不同,这种情况下,该方法并不定义自己,而是包含其他方法。显然是可能的。如果这个“其他方法”不是通过传统的方式定义,而是通过属性,(成员变量) 这种模式的别名也叫做加载时分支,是一个优化模式,这个模式用来避免switch-case或if-else语句等控制结构的大量使用。也可以理解为这个模式为代码永久性的创建了确定分支之间的连接。 考虑下面这个例子 我们都做了什么呢?首先我们有一个方法读取用户配置(由一个配置Setting类来保存),如果我们发现启用了自动设置。我们就给AutoSave这个属性赋上全部的代码,否则我们就放一个空方法在这里,而们就可以通过调用AutoSave()一次就行了,不再需要检查配置设置或其他的什么情况了。我们也不需要保存一个特殊的布尔变量,因为对应的方法已经被动态的设置了。 有人也许认为这不是一个巨大的性能提高,但是这仅仅是一个小例子,在一些复杂的代码里,这会节省很多时间,尤其是代码越来越复杂的情况下。 另外(我认为这是最主要的原因),代码更加容易维护(如果你了解这个模式的话)没有了不必要的控制逻辑,程序员可以更加专注于重要的东西—调用这个自动保存的具体操作 在JavaScript中,像初始时间分支模式被用在很多性能检测上(比如浏览器检测)不去管浏览器检测实际上是很邪恶的,并且不应该在任何网页上检测用户的浏览器, 性能检测非常有用,通常和这种模式一起组合使用,这也是Jquery用来对Ajax请求检测需要的正确对象的方法。 下一部分介绍Lambda表达式超级有用的情况,同样圣诞节快乐。

Lambda高手之路第三部分

背后的秘密-MSIL 通过著名的LINQPad,我们可以更深入的查看MSIL代码而没有任何秘密。下图是一个LINQPad的使用截图 我们会看三个例子,第一个Lambda表达式如下: 对应的普通函数是这样的 生成的MSIL代码片段如下: 最大的不同是方法的名称用法不同。而不是声明。事实上。声明是完全一样的。编译器在类里面创建了一个新的方法来实现这个方法。这没什么新东西,仅仅是为了我们使用Lambda表达式方便代码编写。从MSIL代码中,我们做了同样的事情。在当前对象里调用了一个方法。 我们在下图里演示一下编译器所做的修改。在这个图例。我们可以看到编译器把Lambda表达式移动成了一个固定的方法。 第二个例子将展示Lambda表达式真正的奇妙之处,在这个例子里。我们既使用了有着全局变量的普通方法也使用了有捕获变量的Lambda表达式。代码如下 没什么不同的似乎。关键是:lambda表达式如何被编译器处理 和第一个例子一样。机制相同。编译器把lambda表达式移动到一个方法里。但是不同的是,编译器这次还生成了一个类。编译器为我们的lambda表达式生成的方法会放在类里,这就给了捕获的变量一个全局的作用域,通过这样。Lambda表达式可以访问局部变量。因为在MSIL里。它是类实例里面的一个全局变量。 所有的变量因此就可以在新生成的类的对象里赋值/读取了。这解决了变量之间的引用问题。(其实就是只保留了对该类实例的引用。)编译器也足够智能之会把这些捕获的变量放到类里面。因此,当我们使用Lambda的时候才没有太大的性能问题。无论如何。注意。由于保持了对lambda表达式的引用,因此可能造成内存泄漏。只要方法还在。变量就仍然存活。显而易见。而现在我们知道了原因。 我们再次用图示来说明。这这种闭包情况下里。不仅仅方法会被移动。捕获的变量也会被移动。所有被移动了的对象会被放到一个新生成的类里。因此一个没有名称的类就隐式的出现了。 下一节将是映射流行的JavaScrpit模式。

Lambda高手之路第二部分

闭包的影响 为了展示闭包的影响,我们看下面这个例子。 这个问题很怪,我在我的JavaScript课程上经常问我的学生。95%的学生会说。显然按钮0显示0,按钮1显示1,等等。而不足5%的学生学习了闭包之后会明白。所有的按钮都会显示10. 局部变量i的值改变了。并且等于buttons.Length。也就是10了。想要避免这个诡异的情况也很简单。如下就行了。 问题解决了,但是index变量是一个值类型,因此保留了“全局”i的一个拷贝 最后一个话题是一个叫做表达式树的东西,他和Lambda表达式协作。并且,他会使得在ASP.NET MVC中的Html扩展方法发生一些很奇妙的东西。关键的问题是:如何发现目标函数 1. 传递进去的变量的名称是什么 2. 方法的主体是什么 3. 函数体里使用了什么类型 Expression 解决了这些问题,他允许我们挖掘生成的表达式树,我们也可以执行传递给Func和Action委托的函数,而且,可以在运行时解析Lambda表达式 我们看一下如何使用Expression 类型的例子 这是Expression最简单的用法了。规则也相当直接。通过构建一个Expression类型的对象。编译器为生成的解释树生成一些元数据。这个解释树包含所有相关的信息,比如参数和方法体。 方法体包含完整的解释树,我们可以访问这些操作。就像完整的语句一样。也可以操作返回指和类型。当然,返回可以为null,无论如此。大多数情况下。我们对表达式很感兴趣。这和ASP.NET MVC中处理Expression类型的方法是很相似的—可以得到使用的参数的名字,而好处是显而易见的。不会出现名称拼写错误了。也就不会出现因此而出现的编译错误了。 注意:当程序员仅仅对调用的属性的名字感兴趣的时候。有一个更简单,更优雅的解决方案,那就是参数特性CallerMemberName 这个特性可以得到调用方法/属性的名称。而字段被编译器自动填充。因此,如果我们仅仅想知道名字,而不想知道其他更多的信息,那么我我们只需要写出像下面这个例子里的代码就行了。通过调用WhatsMyName() 方法可以返回方法的名字 Lambda表达式的性能 有一个很大的问题:Lambda表达式有多快?好吧。首先,我们期望他们能和我们一般的函数一样快。下一节里。我们会看到Lambda的MSIL代码和普通的函数没有太大的不同。 最有趣的一个讨论是如果Lambda表达式产生了闭包,将会和使用全局变量的方法一样快。这就产生了一个有趣的问题,和一个区域内局部变量的数目多少会有关系吗? 我们看看测试代码,通过4个不同的指标,我们可以看到普通方法和Lambda方法的不同。 本来用Lambda表达式我们可以把代码写的更好。最终我没有这样做。是为了防止影响看最后的结果。因此,本质上。上述代码里有三个方法 1个是Lambda测试,一个是普通测试,还有一个是在普通测试里调用的方法。而没有的第四个方法其实是我们的lambda表达式。在第一个方法里已经创建了。计算过程很简单,我们随机取数字防止编译器做任何优化。最后我们对普通方法和Lambda方法的不同很有兴趣。 如果我们运行这个测试程序。我们会发现Lambda表达式并不总是比普通方法差。我们惊奇的是有时候甚至Lambda表达式更快一些。然而,在有闭包的情况下,,就不对了。这就是说大多数情况下我们可以毫不犹豫的使用lambda表达式。当使用闭包的时候会出现一点点的性能损失,不过还好,下一节会讲述性能损失的几个原因。 下面是测试输出的结果表 Test Lambda [ms] Normal [ms] 0 45+-1 46+-1 1 44+-1 46+-2 2 49+-3 45+-2 3 48+-2 45+-2 下图是上表的结果,我们可以看得到普通的方法和Lambda表达式基本上限差不多。当使用Lambda表达式的时候没有太大的性能损失。 第三部分会介绍背后的秘密-MSIL

Lambda高手之路第一部分

好长时间没发技术文章了,恰好看到一篇非常详细的Lambda文章。一边翻译一边学习。题目好像有点霸气。。 介绍 Lambda表达式是使代码更加动态,易于扩展并且更加快速(看完本文你就知道原因了)的强有力的工具。也可以用来降低潜在的错误。同时可以利用静态输入和智能提示,就像VS里一样。  Lambda表达式在.net framework 3.5中提出来。并且在LINQ和ASP.NET MVC内部的一些技术中扮演了相当重要的角色。如果你考虑一下ASP.NET MVC中各类控件的实现。你就发现。奥妙就是他们大多使用了Lambda表达式。和Lambda表达式一起,使用Html扩展方法将会使得在后台创建模型成为可能。 本文会讲到如下的知识。 1.简短的介绍-Lambda表达式是什么,以及为什么和匿名方法不同(之前我们使用的) 2.走近Lambda表达式的性能-在哪些情况下比起标准方法,Lambda会提高/损失性能 3.深入-Lambda表达式在MSIL代码中是什么样 4.一些来自JS世界的模式映射到C#中 5.那些能够提高性能,并且代码看起来相当舒服的使用Lambda的情况。 6.一些我提出的新模式-当然有可能别人也提出来了。但这是我的思考结果。  如果你期望本文是一篇入门教程我可能要让你失望了,除非你真的很优秀并且很聪明,当然我不是这种人,所以我也想提前声明一下:为了读懂这篇文章你可能需要C#的一些高级知识,并且对C#比较了解。  你应该期望本文试着解释一些事情给你,也会解释一些有趣的问题,至少对我来说是这样的。最后我会展示一些实际的例子和模式,如我所说,Lambda表达式简化了很多情况。因此写显式的模式很有用。 背景知识-什么是Lambda表达式 在C#1.0中,委托被提出了,它使得传递函数成为可能,一句话就是委托就是强类型的函数指针,但委托比指针更强大。一般传递一个函数需要如下几步。 1. 写一个委托(就像一个类)包含返回类型和参数类型 2. 使用委托作为某一个函数的参数类型,这样,该函数就可以接受和委托描述的有着相同签名的函数了 3. 将一个委托类型的函数传递给委托,创建一个委托实例。  如果听起来很复杂,确实本来很复杂,但这是必需的。(虽然不是造火箭,但是比你认为的要更多的代码),然而步骤三不是必需的,编译器会为你做他,但是步骤1和2却是必不可少的。  幸运的是C#2.0出现了泛型,现在我们也可以写泛型类,方法,更重要的是,泛型委托,然而,直到.net framework 3.5的时候。微软意识到实际上只有两种泛型委托(当然有一些不同的重载),会覆盖99%的使用情况: 1.Action 没有任何输入参数,也没有输出参数。 2.Action<t1,…t16> 需要1-16个参数,没有输出参数。 3.Func<t1….t16,tout>需要0-16个参数,一个输出参数  Action和其对应的泛型版本(仅仅是一个动作,执行一些事情)返回void的时候。Func则可以返回最后一个参数指定的类型,通过这两个委托类型,我们事实上,大部分情况下。前面提到的三步中的第一部就不用写的。而第二步仍然需要。  那么如果我们想要运行代码的时候怎么做呢。在C#2.0中问题已经可以解决了。在这个版本里。我们可以创建委托方法,也就是一个匿名方法,然后这个语法一直未能流行起来,一个相当简化的匿名方法的版本类似这样: 为了提高这种语法,欢迎来到Lambda表达式的国度。首先,这个Lambda名字怎么来的?事实上。来自于数学上的λ演算,更准确的说他是数学中一个正式的系统。用于通过变量绑定和替换来进行表达式计算,所以我们有0-N个输入参数和一个返回值,而在编程中,也可以没有返回值 我们看一下Lambda表达式的一些例子 从上面的代码段里我们可以学到一些东西 如果我们只有一个输入参数,我们可以省略() 如果我们有一个输入参数,并且向返回一个,那么我们可以省略{}和return关键字 我们可以让我们的Lambda表达式异步执行,只要加上async关键字就可以了 Var关键字一般都不可以用,只有在极少的情况下有才可以。 当然我们可以使用像平常那样使用var,如果我们指定了参数类型,这是可选的。因为类型可以从委托的类型中推断出来。而下面的情况都是错误的。请看下面的例子  大部分基本情况我们都知道。但是有些相当cool的东西(这使得他们在很多情况下很有用),我们考虑下面的代码片段  这是可以的。因此你可以使用其他的变量。这比你想象的要更特殊。因为这里出现了捕获变量。这使得出现了一个闭包,考虑下面的情况。  猜猜看这段代码会发生什么。首先我们创建了一个局部变量。和两个lambda表达式,第一额Lambda表达式展示在其他局部区域里访问局部变量是可以的。这已经很让人难以置信了。这意味着我们想要保护一个变量,但事实上他仍然可以在其他方法里被访问。而不论方法是被定义在内部还是其他类的里。  而第二个Lambda表达式则模拟了一个Lambda表达式可以修改外部域变量。这意味着我们可以在其他方法里修改我们的局部变量,仅仅需要传一个在对应域里创建好的Lambda表达式就可以了。因此,我认为闭包有点魔幻的色彩了。就像并行编程一样。可能导致未期望的结果。就像在并行编程中的竞争情况。 为了展示一下未期望的结果。欢迎期待下一篇。。

从相亲延伸出的婚恋意义

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

3分钟理解Lambda表达式

1.什么是Lambda表达式 Lambda表达式是一个匿名方法,通常在LINQ中被用来创建委托 简单来说。它是一个没有声明,没有访问修饰符,没有返回值。甚至没有名字的方法。  2.为什么我们需要使用Lambda表达式?或者说为什么我们要写一个没有名字的函数? 为了方便,这种快捷方式允许你在调用的地方直接编写代码,尤其是你想调用的代码只会在这个地方使用一次。并且方法体本身很短。节省了单独写方法中写声明等等的麻烦。。 好处 1.代码量减少。不必写方法的名称。返回值和访问修饰符 2.当阅读代码的时候。直接就可以看到被调用函数的代码,不用去别的地方。 Lambda表示应该短些。太复杂了。可读性就下降了  如果编写Lambda表达式 Lambda基本的定义是:参数=>执行代码 举个例子 n是输入参数 n % 2 == 1 是函数体 你可以读作:给这个匿名方法传入一个参数n,如果n是奇数就返回true  使用该Lambda的例子 ok.基本的Lambda表达式就是这样了。

从平庸到幸福

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

[源码]打包下载算法与数据结构演示动画

很早的时候,学习数据结构的时候。收集了一下演示的动画。帮助理解。但是不全。今天在看KMP算法的时候。看到了福州大学的一个精品课程。。81个演示动画呢。。想打包下载收藏。话说福州大学这才是好样的。踏踏实实搞学术。 第一种方法就是手工了。。嘎嘎。你敢么。一个个下载。。。一个个改名。。 第二种就是用整站下载的软件了。。但是我看了一下swf的命名。我就知道下载下来意义不大。因为名字不好理解。 第三种就是自己写个程序吧。。  整体思路,首先访问课程页面,解析得到每一章的标题和内容,然后创立章节文件夹,得到每个动画对应的html页面,然后对html页面解析,提取swf地址。然后下载就行了。 比较疼的地方是那个页面用的是gb2312编码。而解析神器HtmlAgilityPack,不能指定编码。只能想办法绕过了。  写完运行。看着如下这个界面。。这个我只是为了让我看到进度。同时后台也在下载。 我的心是冰凉的。但脖子是僵硬的。。。  运行完成后。文件夹和文件自动命名完成是这样的。。

C#与.net 程序员面试笔记

这是前几天读的书。书不难。10-13章跳过了。以后再看。 以前,一个应用程序对应一个进程。并且为该进程指定虚拟内存,这样。进程会消耗很多资源,而且进程之间的通信业比较麻烦 应用程序域可以理解为很多应用程序域都可以运行在同一个.net 进程中,降低内存消耗。同时不同的域之间隔离。安全有保证。通信也简单。 程序集是指包含编译好的。面向.net framework的代码的逻辑单元。是完全自我描述性的一个逻辑单元。可以存储在多个文件中。简单来说,程序集就是几个彼此有关联程序文件的集合。程序集会包含程序的元数据。描述了对应代码中定义的方法和类型。 装箱和拆箱:装箱转换是将一个值类型显式或隐式的转换成一个object对象。并且把这个对象转换成一个被该值类型应用的的接口类型。装箱后的object对象中的数据位于堆中。一般应该避免这种运算。 CLR将值类型的数据包裹到匿名的托管对象中,并将托管对象的引用放在Object类型的变量中。这个过程称为装箱。一般还是使用泛型来代替多好。 值类型和引用类型:值类型实例通常分配在线程的栈上。并且不包含指向任何实例数据的指针。引用类型实例分配在托管堆上。变量保存了实例数据的内存引用。引用类型复制的话会导致引用同一个内存地址。 C#预处理指令是在编译时调用的。预处理指令通知C#编译器要编译哪些代码。并指出如何处理特定的错误和异常。比如用在一些调试的时候。在顶部define一个debug 内部的测试部分写上测试用例。具体示例 C#中的指针 指针是一个无符号整数。是以当前系统寻址范围为取值范围的整数,CLR支持三种指针类型:受托管指针,非托管指针,非托管函数指针,受托管指针存储在堆上的托管块的引用,一个非托管指针就是传统意义上的指针,要放在unsafe中使用,C#中指针并不继承自Object String 是CLR的类型名称。而string是C#的关键字。其实C#编译时。。会增下如下代码: using string=System.String Array 到ArrayList的转换 1.使用ArrayList.Adapter(ArrayName) 可以直接得到ArrayList 2.使用遍历逐个添加到ArrayList里。 反向的话直接使用(Array[])ArrayListName.ToArray(typeof(Array));即可 checked和unchecked语句用于控制整形算术运算和显示转换的溢出检查上下文。checked关键字用于对整型算术运算和转换显式启用溢出检查。因为默认情况下。如果表达式产生的值超过了类型的范围。则常数表达式将会导致编译时错误。而非常数表达式则在运行时计算并将引发异常。 Asp.Net 中的Request对象主要功能是从客户端得到数据信息。他的属性比较多。比如UserLanguage,TotalBytes,Path,ApplicationPath ViewState是其的一个重要特性。用于把生成页面要用的状态值保存到一个隐藏域里。而不是用cookie/内存 SOAP是Web Service应用的基础协议。他是一种轻量的简单的。基于xml的协议。被设计成在wEb上交换结构化的和固有的信息。 WSDL是一种用于描述web服务和说明如何与Web服务通信的XML语言。WSDL是一种符合XML语法规范的语言。它的设计完全基于Soap协议的实现。当一个WEb Service 服务器期望为使用者提供服务说明时,WSDL语言是最好的选择之一。  **对企业的一些认识 ** 千万不要说自己未来的打算是做到管理层,首先对管理层的定义不清楚。职务不清楚。所以保险的答案是我会努力钻研技术。使得能够达到业内的专业人士。深刻理解公司和行业 我是为了找一份长期性的工作。我不喜欢频繁的跳槽我希望在这个利于发展自己的事业。深入学习。向专业人士请教。那。该我想问这个职务是长期的吗? 不要把公司想像成慈善机构。工作的运作方面应该是尽可能快的实现盈利。树立品牌,赢得客户。我的工作就是完成企业的良性运作。 如果被问到是否需要考虑看分数。应该说用人单位确实需要全面考量。也要考虑应聘者的工作积极性/服从性。实际经验/对开发的理解诶。这些也许比分数更有价值。 应届生的优缺点应该是足够的理论知识和专业能力。缺点是工作和社会经验不足。