06 2013 档案

摘要:引言在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制。从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NET Entity Framework,.NET 都为并发控制提供好良好的支持方案。并发处理方式一般分为乐观必并发与悲观必并发两种,本文将为大家介绍 Entity Framework 、 LINQ to SQL 中的并发处理方式。在本文最后,将提供一个了可参考的方案,结合事务 Transaction 处理复杂性对象的并发。目录一、并发处理的定义二、模型属性的并发处理选项三、Entity Framewrok 悲观并发四、Entity Framework 阅读全文
posted @ 2013-06-21 09:56 于为 阅读(349) 评论(0) 推荐(0)
摘要:引言其实事务在数据层、服务层、业务逻辑层多处地方都会使用到,在本篇文章将会为大家一一细说。其中前面四节是事务的基础,后面的三节是事务的重点,对事务有基础的朋友可以跳过前面四节。文章有错漏的地方欢迎各位点评。目录一、事务的定义二、事务管理器三、在ADO.NET中实现事务四、隐式事务 TransactionScope五、在WCF中实现事务六、嵌套式事务七、异步事务一、事务的定义所谓事务,它是一个操作集合,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。典型的例子就像从网上银行系统的帐户A转帐到帐户B,它经过两个阶段:1.从帐户A取出款项。2.把款项放入帐户B中。这两个过程要么同时成功 阅读全文
posted @ 2013-06-21 09:55 于为 阅读(240) 评论(0) 推荐(0)
摘要:引言本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发。其中委托的BeginInvoke方法以及回调函数最为常用。而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作。特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax或者在服务器端使用UpdatePanel。其实合理使用I/O线程在通讯项目或文件下载时,能尽量降低IIS的压力。并行编程是Framework4.0中极力推广的异步操作方式,更值得更深入地学习。希望本篇文章能对各位的学习研究有所帮助,当中有所错漏的地方敬请点评。 阅读全文
posted @ 2013-06-21 09:53 于为 阅读(257) 评论(0) 推荐(0)
摘要:引言本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发。其中委托的BeginInvoke方法以及回调函数最为常用。而 I/O线程可能容易遭到大家的忽略,其实在开发多线程系统,更应该多留意I/O线程的操作。特别是在ASP.NET开发当中,可能更多人只会留意在客户端使用Ajax或者在服务器端使用UpdatePanel。其实合理使用I/O线程在通讯项目或文件下载时,能尽可能地减少IIS的压力。并行编程是Framework4.0中极力推广的异步操作方式,更值得更深入地学习。希望本篇文章能对各位的学习研究有所帮助,当中有所错漏的地方敬请点 阅读全文
posted @ 2013-06-21 09:51 于为 阅读(284) 评论(0) 推荐(0)
摘要:引言本文主要是介绍进程(Process)、应用程序域(AppDomain)、.NET上下文(Context)的概念与操作。虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高系统的性能有莫大的帮助。在本篇最后的一节当中将会介绍到三者与线程之间的关系,希望对多线程开发人员能提供一定的帮助。因为时间仓促,文中有错误的地方敬请点评。目录一、进程的概念与作用二、应用程序域三、深入了解.NET上下文四、进程应用程序域与线程的关系一、进程的概念与作用进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。进程之间是相对独立的,一个进程无法直接访 阅读全文
posted @ 2013-06-21 09:50 于为 阅读(255) 评论(0) 推荐(0)
摘要:引言本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单。还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单。在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用。最后一节,将介绍Predicate<T>、Action<T>、Func<T,TResult>多种泛型委托的使用和Lambda的发展过程与其使用方式。因为时间仓促,文中有错误的地方敬请点评。目录一、委托类型的 阅读全文
posted @ 2013-06-21 09:48 于为 阅读(281) 评论(0) 推荐(0)
摘要:添加命名空间using ESRI.ArcGIS.SystemUI;using ESRI.ArcGIS.Controls;A类:前面有Controls后面有tool的工具都可以用同一类的代码实现(最后的tool或toolclass都可以)示例:privatevoid放大ToolStripMenuItem_Click(objectsender,EventArgse){ICommandCmd=newControlsMapZoomInTool();Cmd.OnCreate(this.axMapControl1.Object);this.axMapControl1.CurrentTool=CmdasIT 阅读全文
posted @ 2013-06-20 14:16 于为 阅读(1174) 评论(0) 推荐(0)
摘要:前言:我们都知道面向对象的三大特性:封装,继承,多态。封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象的魅力体现了出来,那就是多态,多态用的好,可以提高程序的扩展性。常用的设计模式,比如简单工厂设计模式,核心就是多态。其实多态就是:允许将子类类型的指针赋值给父类类型的指针。也就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。如果这边不理解可以先放一放,先看下面的事例,看完之后再来理解这句话,就很容易懂了。理解多态之前首先 阅读全文
posted @ 2013-06-13 10:22 于为 阅读(228) 评论(0) 推荐(0)
摘要:最近写了几篇《c#扩展方法奇思妙用》的文章,一直只是讨论如何扩展、如何使用的问题,几乎没有涉及效率方面。而大家的回复好多都在问效率如何、性能怎样,也引起了我对效率的关注,今天将初步测试的结果发出来,大家一起探讨一下。以前没太写过性能测试的代码,上网找了一下,说可以用Stopwatch进行计时,比较准确。Stopwatch使用比较简单,几个方法从名字上就知道用用途:Reset(计时清零)、Start(开始计时)、Stop(停止计时),属性ElapsedMilliseconds就是执行操作所用的毫秒数。为了简化测试,让更多人看明白,我们这是对IsNullOrEmpty扩展进行测试,它只是简单调用s 阅读全文
posted @ 2013-06-09 13:43 于为 阅读(284) 评论(0) 推荐(0)
摘要:string是各种编程语言中最基础的数据类型,长期以来受尽其它类的压迫,经常被肢解(Substring、Split)、蹂躏(Join)...而现在string要“翻身闹革命”了,它几乎无所不能,可以为所欲为,令其它类心惊胆颤...让我们来看一下革命后的string做了些什么?打开文件或网址1"c:\\t.txt".Open();2"http://www.cnblogs.com/ldp615/".Open();怎么做到的呢?看扩展,很简单,直接调用调用了Process.Start函数:1publicstaticvoidOpen(thisstrings)2{ 阅读全文
posted @ 2013-06-09 13:42 于为 阅读(338) 评论(0) 推荐(0)
摘要:变态篇二中给出了对if/else、swith/case及while 的扩展,大家评价各不相同,其实本人也感觉有点牵强。其中举了一个Swith扩展的应用,今天突然有了新想法,对它改进了一些。所谓“语不惊人死不休”,且看这次的改进如何。我先把扩展的源代码贴出来,折叠一下,等看完后面的例子和讲解再回来看。(和前面一样,本文侧重想法,代码演示用,如需使用,请自行完善)1publicstaticclassSwithCaseExtension2{3#regionSwithCase4publicclassSwithCase<TCase,TOther>5{6publicSwithCase(TCas 阅读全文
posted @ 2013-06-09 13:41 于为 阅读(341) 评论(0) 推荐(0)
摘要:本文探讨如何使用扩展方法封装 if/else、swith/case及while,通过使用这些扩展,写出的代码将使用很少的大括号{ }。扩展的效果如何,还请大家来评判!声明:本文属于(改)变(形)态篇,只是提出一种想法,所提供的代码也只是示例,可以测试通过,但不完善。首先我们来对看if/else和swith/case,两者在代码中都用来表达分支结构。这里我们统一封装成一个If扩展:publicstaticTIf<T>(thisTt,Predicate<T>predicate,Action<T>action)whereT:class{if(t==null)thr 阅读全文
posted @ 2013-06-09 13:39 于为 阅读(307) 评论(0) 推荐(0)
摘要:先回顾一个数列的概念:按一定次序排列的一列 数 称为数列...(请参见百度百科:数列)几个简单的数列:1, 1, 1, 1, 1, 1, 1... //数列10, 1, 2, 3, 4, 5, 6, 7... //数列20, 1, 4, 9, 16, 25, 36, 49... //数列3通项公式的定义:数列的第n项与项的序数这间的关系,也就是数列生成算法上面几个数列可表示为An = F(n) = 1An = F(n) = nAn = F(n) = n * n有了数列和通项公式的定义,我们的任务就好描述了:用最简洁的代码描述通项公式,用最简洁算法生成数列的前N个数。在此要求下,用常规代码是做不 阅读全文
posted @ 2013-06-09 13:38 于为 阅读(200) 评论(0) 推荐(0)
摘要:下面是Queryable 类中最常用的两个排序的扩展方法:12 public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector); public static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey>(this IQue 阅读全文
posted @ 2013-06-09 13:37 于为 阅读(553) 评论(0) 推荐(0)
摘要:Type 类提供了大量的属性和方法,但在一些基础性开发工作中,Type类功能还有些欠缺,尤其上在处理泛型类型时,如可空类型和泛型集合类型。下面的类就针对这些地方进行扩展。扩展源码1publicstaticclassTypeHelper2{3publicstaticboolIsNullableType(thisTypetype)4{5return(((type!=null)&&type.IsGenericType)&&6(type.GetGenericTypeDefinition()==typeof(Nullable<>)));7}89publicst 阅读全文
posted @ 2013-06-09 13:36 于为 阅读(304) 评论(0) 推荐(0)
摘要:我的上一篇随笔《c#扩展方法奇思妙用高级篇六:WinForm 控件选择器》中给出了一个WinForm的选择器,其实质就是一个“树”的遍历器,但这个遍历局限于WinForm的Control类。在数据结构中,“树”的遍历是一个通用算法,那我们为什么不做一个通用的“树”遍历扩展呢?先看一个简单的类People(将作为测试用的例子):1publicabstractclassPeople2{3publicboolIsMale{get;privateset;}4publicabstractIEnumerable<People>Children{get;}5}People类有一个Children 阅读全文
posted @ 2013-06-09 13:28 于为 阅读(299) 评论(0) 推荐(0)
摘要:在Web开发中,jQuery提供了功能异常强大的$选择器来帮助我们获取页面上的对象。但在WinForm中,.Net似乎没有这样一个使用起来比较方便的选择器。好在我们有扩展方法,可以很方便的打造一个。我们先看几个类图,深入认识一下我们常用的WinForm控件:图1 ScrollableControl类图图2 ButtonBase类图图3 TextBoxBase类图图4 ListControl类图图5 Label类图图6 其它常用从图1中可以看出,Form与Button、Label一样,也是一个Control。WinForm中的一些控件(如Form、GroupBox、Panel)可以包含其它控件, 阅读全文
posted @ 2013-06-09 13:27 于为 阅读(494) 评论(0) 推荐(0)
摘要:在.Net中,System.Object.ToString()是用得最多的方法之一,ToString()方法在Object类中被定义为virtual,Object类给了它一个默认实现:1publicvirtualstringToString()2{3returnthis.GetType().ToString();4}.Net中原生的class或struct,如int,DateTime等都对它进行重写(override),以让它返回更有价值的值,而不是类型的名称。合理重写的ToString()方法中编程、调试中给我们很大方便。但终究一个类只有一个ToString()方法,不能满足我们多样化的需求 阅读全文
posted @ 2013-06-09 13:26 于为 阅读(303) 评论(0) 推荐(0)
摘要:从系列文章开篇到现在,已经实现的很多扩展了,但过多的扩展会给我们带来很多麻烦,试看下图:面对这么多“泛滥”的扩展,很多人都会感到很别扭,的确有种“喧宾夺主”的感觉,想从中找出真正想用的方法来太难了!尽管经过扩展后的string类很“强大”,但易用性确很差。很多人因此感觉扩展应适可而止,不该再继续下去...其实这是一种逃避问题的态度,出现问题我们应该主动去解决,而不是去回避!有很多种方法可以解决以上问题,最简单的就是使用将扩展放入不同namespace中,使用时按需using相应namespace,可达到一定效果。但这种方法有很大缺点:一个命名空间中的扩展若太多同样会让我们的智能提示充斥着扩展方 阅读全文
posted @ 2013-06-09 13:25 于为 阅读(288) 评论(0) 推荐(0)
摘要:Enumerable.Cast<T>用于将IEnumerable转换为泛型版本IEnumerable<T>。转换后可尽情享用Enumerable的其它方法(如Where、Select),给我们的编码带来极大便利。但MSDN中仅给出一个转换ArrayList的例子,很多人看了感觉现在都在用List<T>,还有谁会用ArrayList,Cast<T>没多少用处,除非处理一些之前遗留的一些代码。其实Cast<T>并非如此简单,它可以用在很多地方。先看MSDN中举的例子吧:1System.Collections.ArrayListfruits 阅读全文
posted @ 2013-06-09 13:24 于为 阅读(616) 评论(0) 推荐(0)
摘要:Enumerable.Aggregate 扩展方法在System.Linq命名空间中,是Enumerable类的第一个方法(按字母顺序排名),但确是Enumerable里面相对复杂的方法。MSDN对它的说明是:对序列应用累加器函数。备注中还有一些说明,大意是这个方法比较复杂,一般情况下用Sum、Max、Min、Average就可以了。看看下面的代码,有了Sum,谁还会用Aggregate呢!publicstaticvoidTest1(){int[]nums=newint[]{1,2,3,4,5,6,7,8,9,10};intsum1=nums.Sum();intsum2=nums.Aggreg 阅读全文
posted @ 2013-06-09 13:23 于为 阅读(377) 评论(0) 推荐(0)
摘要:先看下ScottGu对In的扩展:调用示例1:调用示例2:原文地址:New "Orcas" Language Feature: Extension Methods很多介绍扩展方法的也大都使用"In"作为例子,但很少有人再深入想一步。个人感觉这个In扩展的不够彻底,试看如下代码:publicstaticvoidExample1(){boolb1=1.In(newint[]{1,2,3,4,5});boolb2="Tom".In(newstring[]{"Bob","Kitty","Tom 阅读全文
posted @ 2013-06-09 13:22 于为 阅读(260) 评论(0) 推荐(0)
摘要:.net 中创建Expression Trees最简单的方式是使用 lambda 表达式:12Expression<Func<Person, bool>> exp = p => p.Name.Contains("ldp") && p.Birthday.Value.Year > 1990;其中 Person 类定义如下:1234public class Person { public string Name { get; set; } public DateTime? Birthday { get; set; }}但有些时候 阅读全文
posted @ 2013-06-09 13:21 于为 阅读(397) 评论(0) 推荐(1)
摘要:刚看了篇文章 《Linq的Distinct太不给力了》,文中给出了一个解决办法,略显复杂。试想如果能写成下面的样子,是不是更简单优雅:12var p1 = products.Distinct(p => p.ID);var p2 = products.Distinct(p => p.Name);使用一个简单的 lambda 作为参数,也符合 Linq 一贯的风格。可通过扩展方法实现:Distinct 扩展方法首先,创建一个通用比较的类,实现 IEqualityComparer<T> 接口:123456789101112131415161718192021222324usi 阅读全文
posted @ 2013-06-09 13:18 于为 阅读(287) 评论(0) 推荐(0)
摘要:相信大家在看了本文的题目之后,马上就能写出 IsBetween 扩展来:public static bool IntIsBetween(this int i, int lowerBound, int upperBound, bool includeLowerBound = false, bool includeUpperBound = false){ return (includeLowerBound && i == lowerBound) || (includeUpperBound && i == upperBound) || (i > lowerB.. 阅读全文
posted @ 2013-06-09 13:17 于为 阅读(418) 评论(0) 推荐(0)
摘要:一、Where 扩展的不足如下界面,可通过姓名、编号和地址对人员进行模糊查询:我们通常会写出如下代码:public IQueryable<Person> Query(IQueryable<Person> source, string name, string code, string address){ var result = source; if(string.IsNullOrEmpty(name) == false) result = source.Where(p => p.Name.Contains(name)); if (string.IsNullOr. 阅读全文
posted @ 2013-06-09 13:16 于为 阅读(391) 评论(0) 推荐(1)
摘要:向字典中添加键和值添加键和值使用Add方法,但很多时候,我们是不敢轻易添加的,因为Dictionary<TKey, TValue>不允许重复,尝试添加重复的键时Add方法引发ArgumentException。大多时候,我们都会写成以下的样子:var dict = new Dictionary<int, string>();// ...// 情形一:不存在才添加if (dict.ContainsKey(2) == false) dict.Add(2, "Banana");// 情形二:不存在添加,存在则替换if (dict.ContainsKey(3 阅读全文
posted @ 2013-06-09 13:13 于为 阅读(305) 评论(0) 推荐(0)
摘要:在 .Net 中,我们一般使用Random类来生成随机数,它仅提供了以下几个基本方法供我们使用:名称说明Next()返回非负随机数。Next(Int32)返回一个小于所指定最大值的非负随机数。Next(Int32, Int32)返回一个指定范围内的随机数。NextBytes用随机数填充指定字节数组的元素。NextDouble返回一个介于 0.0 和 1.0 之间的随机数。如果想生成一些特殊的随机数,如枚举、日期等,则要再进行几步处理。本文将会扩展Random类,让随机更方便。Random 常用扩展布尔:NextBool随机返回 true 或 false,这个实现比较简单:public stat 阅读全文
posted @ 2013-06-09 13:11 于为 阅读(254) 评论(0) 推荐(0)
摘要:转换为十六进制字符串1publicstaticstringToHex(thisbyteb)2{3returnb.ToString("X2");4}56publicstaticstringToHex(thisIEnumerable<byte>bytes)7{8varsb=newStringBuilder();9foreach(bytebinbytes)10sb.Append(b.ToString("X2"));11returnsb.ToString();12}第二个扩展返回的十六进制字符串是连着的,一些情况下为了阅读方便会用一个空格分开,处理比 阅读全文
posted @ 2013-06-09 13:10 于为 阅读(251) 评论(0) 推荐(0)
摘要:string是c#里面最最常用的类,和它的使用频度比起来,它的操作确少的可怜,实例方法只有三十个左右,静态方法只有十多个,远远满足不了我们日常的需求。本文使用扩展方法来增加string的功能,举出几个例子,也算是抛砖引玉吧!首先我们把string类最常用的静态方法IsNullOrEmpty扩展成“实例”方法:publicstaticboolIsNullOrEmpty(thisstrings){returnstring.IsNullOrEmpty(s);}下面是调用代码:1publicstaticvoidTest1()2{3strings="";4boolb1=string. 阅读全文
posted @ 2013-06-09 13:08 于为 阅读(285) 评论(0) 推荐(0)
摘要:声明:本文仅提供一种编程思路,所提供代码仅供参考,如需使用,请自行完善。我们在做程序的的时候经常要处理用户输入,作为我们的主要语言中文,经常会出现全角、半角的问题,这会在查询时给我们带来很多麻烦。本文采用扩展方法解决全半角切换的问题,效果图代码如下:publicstaticvoidExample(stringuserInput){stringsbc=userInput.ToSBC();//转全角//具体操作,如存入数据库stringdbc=userInput.ToDBC();//转半角//具体操作,如存入数据库}///<summary>///转全角(SBCcase)///</ 阅读全文
posted @ 2013-06-09 13:05 于为 阅读(210) 评论(0) 推荐(0)
摘要:1.1前言不刷新地图而能让数据实时显示,这在ArcGIS中已经不在是一个困扰我们的难题,在ArcGIS Engine的开发过程中,每一次更新数据后都需要刷新才能,更改大量数据并不断的刷新,让用户在静静的等待,这不是很痛苦吗?为此ArcGIS提供了一个动态图层,专门用于解决这样问题。ArcGIS 显示子系统管理着要素的显示和刷新,异步刷新显示和大量数据的渲染使得CPU的利用率增大,这可能导致显示延迟等问题.我们看一下ArcGIS 显示子系统的结构图,从这张图我们更能清楚的看到ArcGIS的显示原理:动态显示技术将渲染大量的数据从CPU端移动到了显卡上,利用了显卡的性能,这明显提高了显示性能.动态 阅读全文
posted @ 2013-06-05 13:59 于为 阅读(2895) 评论(1) 推荐(0)