标签存档: C#

2,151 查看

闭包(Closure)详解及Javascript静态变量实现分析

闭包这一词很抽象,事实上概念并不抽象,但是应用起来还真的是很抽象。 先来看看定义(引自百度百科): 闭包是可以包含自由变(未绑定到特定对象)量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在代码块的环境中定义。“闭包”一词来源于以下两者的结合:要执行的代码块和自由变量提供绑定的计算环境。   读完后感觉困惑是很正常的,我现在来好好解释下。 为了方便解释,我们给定义中出现的角色赋上代号,首先我们命名闭包为snippet,包含的自由变量为fvar,全局上下文变量统称为globals,代码块环境是context。 根据定义,我们可以如下改述: snippet含有fvar,此fvar在snippet中没有定义,同时globals中也不含有fvar的定义,所以,当我们单看snippet时候,你会发现fvar是一个未定义的变量。当我们把snippet放到context中,为了让其正常执行,我们需要补全fvar的定义,但又不能在snippet中定义。所以就要在context中定义。   有了上面改述的内容,我们再看一个实例,来加深理解,下面的代码,我使用JavaScript解释: var displayItemName=function(item){ var itemDefault = “default”; var closure1 = function(){ alert(item); } var closure2 = function(){ alert(itemDefault); } closure1(); closure2(); } displayItemName(“football”)   这里的displayItemName函数对应context,这里没有globals,closure对应我们前面说的snippet,closure中的item和itemDefault,对于closure来说是自由变量,也即对应fvar。但是对于context(displayItemName函数)来说,不是自由变量,并在其中定义了。   从这么多角度说,应该能搞清楚闭包的意思了。接下来我们用一句话总结闭包(针对JavaScript),就是: 在一个函数(父函数)中,定义另一个函数(子函数),子函数用到了父函数的变量,但自己并没有重新定义此变量,此时称该子函数为一个闭包。   上面的定义应该比原本的定义好理解多了,但要注意这主要是根据JavaScript的特性总结的,不同的语言室不同的。   …

继续阅读 »

1,536 查看

ASP.NET中一些常用第三方DLL

c5.dll——一个C#和其他CLI语言的泛型集合类。.Net2.0及以上才可以使用。简介地址:http://www.itu.dk/research/c5/ com.yeepay.dll——易宝支付接口的DLL文件 Common.Logging.dll——由http://netcommon.sourceforge.net/提供的一套基础类库,提供一些通用方法 Facebook.dll,Facebook.Web.dll,Facebook.Web.Mvc.dll——这三个均为facebook提供的.net SDK,具体网址详见http://facebooksdk.codeplex.com,不同的后缀代表适用于不同的.net framework版本。 Enyim.Caching.dll——Enyim缓存,是一个用C#写的memcached的.net客户端库,具体地址:https://github.com/enyim/EnyimMemcached ICSharpCode.SharpZipLib.dll——一个用c#写的Zip, GZip, Tar and BZip2库,支持多个.net版本,地址见:http://www.icsharpcode.net/opensource/sharpziplib/ Iesi.Collections.dll——一个第三方的用于提供集合操作的类库(集合中的元素与或等的操作),项目地址:http://www.codeproject.com/Articles/3190/Add-Support-for-quot-Set-quot-Collections-to-NET,使用参考教程:http://blog.csdn.net/mydriverc/article/details/2254895 log4net.dll——由Apache发起的一个日志库,是一个用于数据日志到不同数据目标的工具。项目地址:http://logging.apache.org/log4net/ Lucene.Net.dll——用c#编写的Lucene的.net客户端库 Moxiecode.TinyMCE.dll——用.net封装的tinyMCE库。不过,目前已经不更新了,比较老。项目地址:http://sourceforge.net/projects/tinymce/files/TinyMCE%20.NET%20Package/ 应用教程:http://world.episerver.com/Code/Magnus-Ellinge1/TinyMCE-spellchecker/    MySql.Data.dll——一个针对MySQL的ADO.NET驱动。项目地址:http://dev.mysql.com/downloads/connector/net/1.0.html Newtonsoft.Json.dll——很出名的.net中用于处理Json的库。项目地址:http://json.codeplex.com/ NHibernate.dll——一个很出名的开源的对象关系映射器。项目地址:http://www.nhibernate.com/ RSS.NET.dll——一个开源的.net类库,用于RSS订阅,项目地址:http://www.rssdotnet.com/ Quartz.dll——一个拥有DirectShow函数的类库,是DirectX的一部分。

1,335 查看

C#中匿名方法变量共享原理分析

先上几篇我分析中用到例子的文章 利用Reflector把“闭包”看清楚 警惕匿名方法造成的变量共享   进入正题,正向老赵说的那样,c#本来没有什么匿名方法之说,只是编译器施展的魔法。那么我们首先先看看老赵文中提出的,魔法施展的方法。 “编译器将匿名方法中需要访问的所有成员一起包含在闭包中,确保所有的成员调用都符合.NET标准。” 它的处理方式可以用老赵“友好化”处理的类来说明。 源代码: class TestClass { private void Print(string message) { Console.WriteLine(message); } public void Test() { string[] messages = new string[] { "Hello", "World" }; int index = 0; Action<string> action = (m) => …

继续阅读 »

604 查看

.net托管代码和非托管代码的精要理解

托管代码:managed code 非托管代码:unmanaged code 在这里要理解一点,所有的代码都在.net framework里面,其中的代码本身没有托管不托管的概念。 直到,引入了CLR(Common Language Runtime)后,才有了托管或不托管的概念。 引入CLR的原因:编写C或C++时,我们都知道,需要对数组的边界要由考虑,否则会出现数组溢出的情况。这个问题,只是在软件开发中遇到的众多程序问题中的一个,其他的还有诸如没有正常释放等。为了能提高开发的效率,也提高程序的可靠性。那么就只有牺牲一部分的性能,来提出一个可以统一管理或监控的中间程序,该程序就是CLR。在这里微软也为这个CLR提供了一种语言,叫IL(中间语言),这个语言的提出最大的考虑是为程序提供更好的跨平台性。CLR在这里的作用,正如它的角色,主要负责垃圾收集,版本控制,线程管理等。这就构成了完整的.Net。   有了以上基础,托管和不托管也就明晰了,托管指的是把.net framework中的代码交给了CLR代为管理。非托管就是指没有交给CLR管理的那部分。 下面列举一些常用的非托管资源:AppliactionContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,StreamReader,Timer,Tooltip等。   垃圾回收时自动运行的,但是有的时候垃圾回收无法及时或者全部删除过期数据。同时垃圾回收机制对于非托管代码也是无能为力的。 针对这种情况,我们有两个途径去手动完成“垃圾清理”工作: 1、声明一个析构函数,作为类的一个成员 这个方法是不推荐的,但是一般会作为一种安全保险的机制被引入,即用了方法2,然后再使用此方法确保一下。我们可以再析构函数中执行释放资源的工作,但是这么做事有局限的。由于垃圾回收器的运行规则导致了我们不能在析构函数中放置在特定时刻运行的代码(比如像要提前释放,不想等到快结束的时候释放)。但是如果对象占用了宝贵而重要的资源,就应该尽快释放,此时我们就引入了IDisposable接口 2、在类中实现System.IDisposable接口 该方法是推荐的。IDisposable接口有一个Dispose()方法,该方法用于显示释放由对象直接使用的所有未托管资源。与该Dispose()方法可以配合使用的是using,using确定了一个程序作用域,当超出该域时,Dispose()会被自动调用(注意不是Close())。如果在IL语言级别看生成的代码与try块一样。   using(ResourceGobbler instance=new ResourceGobbler()) { //…….Code } 与 try { ResourceGobbler instance=new ResourceGobbler() //……Code } finally { instance.Dispose(); } …

继续阅读 »

734 查看

ado.net entity framework容易忽视的一个小问题

如果把数据库导成ado.net entity framework单独作为类库时候,需要注意,其中app.config中会自动设置connectstring,这个connectstring需要同样出现在调用这个模型的项目中的config文件里面。 否则,会有错误提示。 其实这个很容易理解,这个和.net的架构有关。.net往往是一个website,然后,其他的类库等都是以dll的形式被引用的。所以,此时如果在该dll里面用到configuration的是话,指的是当前的website的configuration。这个也同样适用于unitest项目。

无觅相关文章插件,快速提升流量