摘要:
上文已经提到接口的基本知识,以及如何从面向对象的角度去认知接口与抽象类的联系和区别。本文将从另外的一些技术角度来继续讨论接口和抽象类的取舍问题。首先,在C#中,一个类仅可以继承于一个基类(可以是抽象类,也可以是普通的非密封类),但是它可以实现多个接口。因此,当某个类需要同时拥有多种不同的操作时,封装这些操作的类型就不得不被定义为接口。例如,“学生”实体本身可以根据年龄来比较... 阅读全文
摘要:
为了将问题描述清楚,我们先来看一个例子。在这个例子中,WinForm上有一个按钮,当用户点击这个按钮后,就会装载一个已经存在的Assembly,并且在界面的Label控件上显示出这个Assembly的FullName。对Reflection稍微熟悉一点的朋友都知道,这是非常简单的事情,只需要用Assembly.LoadFile方法获得Assembly,然后用FullName属性来显示即可,比如下面... 阅读全文
摘要:
经过一个多月的努力,用于在.NET下开发控制台程序的框架ACF终于有了新的版本。ACF简化了.NET下具有复杂命令行语法的控制台程序的开发过程,不仅使得控制台程序具备可测试性,而且开发人员还能够非常方便地向控制台程序发布新的命令行语法。本次版本更新涉及到了下面几个方面:性能优化支持多个“契约仓储(Contract Repository)”,以使得控制台程序有着良好的扩展性支... 阅读全文
摘要:
原本我一直是使用Windows Live Writer(WLW)在自己的英文博客上发布文章,在将博客换成中文的PJBLOG后,我也就没有再使用WLW了。今天我重新打开了WLW,尝试着配置以便能够支持PJBLOG。结果发现,WLW确实能够很好的兼容PJBLOG,而且图片的发布也非常方便,这对于广大博友来说,无非是一个很好的消息,WLW也能够满足广大博友的写博需求。然而,对于我这个时不时会在博客中加入... 阅读全文
摘要:
事件定义的时候,可以使用add和remove关键字来自定义事件处理函数的添加与移除功能。例如,可以在添加和移除之前,使用lock关键字实现线程同步。虽然MethodImplAttribute会用当前类的对象作为同步对象实现线程同步,但当对象需要向外界公布多个事件的时候,这样做会产生效率问题。比如:对象A向外界公布了E1、E2两个事件,订阅方O1使用+=运算符试图订阅E1事件;订阅方O2也使用+=运... 阅读全文
摘要:
在此把平时经常去的学习C#和.NET的地址链接整理一下,当然也还包括其它不错的站点,也会列举在此,以作必要时参考(不断更新中)。CodeProject:http://www.codeproject.com,不仅仅是学习C#/.NET,它还包括了诸如C++、COM等其它技术的内容CodePlex:http://www.codeplex.com,MS支持的开源网站,有N多源代码可供下载或参考。本人写的... 阅读全文
摘要:
上个礼拜收到了CCSE(全国软件工程大会暨系统分析员年会)组委会给我寄来的CCSE2008论文集:《计算机工程与应用》特刊。其中包括了我发表的一篇论文,题目是《领域驱动设计的研究与实践》。在这篇论文中,我以一个实际项目为例,简要地阐述了领域驱动设计(Domain Driven Design,简称DDD,下同)的基本理论及其在软件项目中的应用。由于篇幅有限,刊登出来的论文只能介绍个大概,事实上我应该... 阅读全文
摘要:
在讨论事件订阅之前,我们先来看看委托的另一个特性,即调用列表(invocation list)。对于某个特定的委托而言,我们既可以将其它的委托加入其调用列表中,也可以从其调用列表中将其它的委托移除。那么当程序使用这个委托的时候,就会循环遍历并执行其调用列表中的所有委托。下面请看一个例子,在这个例子中,我们定义了一个委托Callback,并将指代两个函数Func1和Func2的委托依次加入其调用列表... 阅读全文
摘要:
ACF(Adaptive Console Framework)是一款.NET下的控制台程序开发框架。控制台程序不是非常简单吗?还需要开发框架干什么?当你回答完下面的问题以后,你就会发现,原来自己也需要一套合理的控制台程序的开发方案。控制台程序都提供命令行参数以及参数值,是否每次开发的时候,都需要去解析用户给定的参数?如果控制台程序需要提供多种参数组合,那么要针对每种参数组合开发一套解析机制,是否感... 阅读全文
摘要:
上篇文章介绍了C#中事件的基本实现方式,在本文中,将对最常见的事件委托EventHandler和EventHandler<T>做介绍。事实上,在前面文章的介绍中,已经涉及到了EventHandler和EventHandler<T>。在C# 2.0泛型出现之前,EventHandler对C#中最常见的事件处理函数进行了签名定义,它指代了这样一些函数,这些函数没有返回值,有两个... 阅读全文
摘要:
前面简要介绍了委托的基本知识,包括委托的概念、匿名方法、Lambda表达式等,现在讲讲与委托相关的另一个概念:事件。事件由委托定义,因为事件的触发方(或者说发布方)并不知道事件的订阅方会用什么样的函数名称,这个函数名称由订阅方自己决定。假如不这样做,那么事件的订阅方必须公开一个专门用于处理事件的函数给事件触发方,由触发方在事件触发的时候调用这个函数。这样一来,触发方必须知道订阅方的细节,才能有效地... 阅读全文
摘要:
今天弄到了一份Visual Studio 2010 CTP的虚拟机,是微软官方发布的。解压后虚拟机的磁盘大小估计有25GB,需要内存1GB,因此你的机器配置至少要2GB的内存,才能比较流利地体验2010。该虚拟机所使用的操作系统是Windows Server 2008。在完成第一次运行的配置后,崭新的Start Page映入眼帘:基本界面现在开始新建一个Console Application。在&... 阅读全文
摘要:
从委托的角度来看,Lambda表达式与匿名方法没有区别。在【C#基础:匿名方法】一文中,我使用了匿名方法来调用List<T>的FindAll方法。从C# 3.0开始,在使用匿名方法的地方,完全可以用Lambda表达式来代替。Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算&ld... 阅读全文
摘要:
匿名方法是C# 2.0的语言新特性。首先看个最简单的例子:view plaincopy to clipboardprint?classProgram { staticvoidMain(string[]args) { List<string>names=newList<string>(); names.Add("SunnyChen"); names.Add("KittyWan... 阅读全文
摘要:
泛型委托是委托的一种特殊形式,感觉看上去比较怪异,其实在使用的时候跟委托差不多,不过泛型委托更具有类型通用性。就拿C#里最常见的委托EventHandler打比方。在.NET 2.0以前,也就是泛型出现以前,普通的事件处理函数都由EventHandler定义,如下:view plaincopy to clipboardprint?publicdelegatevoidEventHandler(obj... 阅读全文
摘要:
首先来看一个简单的例子:小明在烧水,等水烧开以后,将开水灌入热水瓶,然后开始整理家务小文在烧水,在烧水的过程中整理家务,等水烧开以后,放下手中的家务活,将开水灌入热水瓶,然后继续整理家务这也是日常生活中很常见的情形,小文的办事效率明显要高于小明。从C#程序执行的角度考虑,小明使用的同步处理方式,而小文则使用的异步处理方式。同步处理方式下,事务是按顺序一件一件处理的;而异步方式则是,将子操作从主操作... 阅读全文
摘要:
委托是C#中最为常见的内容。与类、枚举、结构、接口一样,委托也是一种类型。类是对象的抽象,而委托则可以看成是函数的抽象。一个委托代表了具有相同参数列表和返回值的所有函数。比如:view plaincopy to clipboardprint?delegateintGetCalculatedValueDelegate(intx,inty);在上面的定义中,我们定义了一个委托,这个委托代表着一类函数,... 阅读全文
摘要:
在C#中,ref的意思是按引用传递。可以参考C++:view plaincopy to clipboardprint?inta=10,b=20; voidswap(intx,inty) { inttemp=x; x=y; y=temp; }如果简单的调用这个swap,比如:swap(a, b),那么你根本没办法交换这两个变量的值,因为x和y都是形参,在swap返回的时候,x和y都被释放了。但如果是... 阅读全文
摘要:
应用程序配置文件的文件名是可以任意更改的。比如:向当前的可执行项目中添加一个XML文件,取名abc.config,输入以下代码 view plaincopy to clipboardprint?<?xmlversion="1.0"encoding="utf-8"?><configuration><appSettings><addkey="k"value="... 阅读全文
摘要:
很多人都说使用Abort方法来终止线程,其实这种做法并不可取!如果你的线程正在操作临界资源,很有可能会造成资源没有正确释放而出现死锁问题。正确的做法应该是使用标记来终止线程的执行。基本思路是:定义一个用于描述“停止”信号的变量,在整个程序启动前,设置该变量为false。在线程中,循环判断该变量是否已经被设置为true,如果没有,则继续执行,否则就退出循环并释放资源,然后退出... 阅读全文