VTK初学者买什么吉他问题

VTK第二篇之菜鸟入门――三维立体显示_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
VTK第二篇之菜鸟入门――三维立体显示
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
你可能喜欢小站会根据您的关注,为您发现更多,
看到喜欢的小站就马上关注吧!
下一站,你会遇见谁的梦想?
本站旨在为.NET程序设计初学者提供学习交流的平台
C#开源资源大汇总
本资料由零度收集(零度编程群号:1888845)&一、AOP框架&Encase 是C#编写开发的为.NET平台提供的AOP框架。Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式。这种部署方面(aspects)的方法帮助缺少经验的开发人员提高开发效率。&&NKalore是一款编程语言,它扩展了C#允许在.net平台使用AOP。NKalore的语法简单、直观,它的编译器是基于Mono C#编译器(MCS)。NKalore目前只能在命令行或#Develop内部使用。NKalore兼容公共语言规范CLS(Common Language Specification),它可以在任何.NET开发环境中使用,包括微软的Visual Studio .NET。&&PostSharp读取.NET字节模块,转换成对象模型。让插件分析和转换这个模型并写回到MSIL。PostSharp使开发程序分析应用程序容易得像分析代码规则和设计模式,它使程序开发的思想变革为面向方面软件开发(AOSD/AOD)思想。&&AspectDNG的目标是为.NET开发人员提供简单而功能强大的AOP-GAOP实现。它效仿java下的开源工具AspectJ 和 Spoon,成熟程度也很接近它们。&&RAIL(Runtime Assembly Instrumentation Library) 开源项目可以在C#程序集加载和运行前进行处理控制调整和重新构建。C#在CLR中,我们已经能够动态加载程序集并且获得程序集中的类和方法,RAIL(Runtime Assembly Instrumentation Library)的出现填补了CLR处理过程中的一些空白。&&SetPoint是一款.NET框架下的全功能(full-featured)AOP引擎.它着重为称为语义切点(semantic pointcuts)的定义依赖RDF/OWL的使用.它的功能为一个IL-level,highly&dynamic weaver&LENDL,一个引人注目的定义语言、、、、、、&&DotNetAOP为 CLR language提供AOP 框架基础属性。&&NAop是一个DotNet下的AOP框架。&&AspectSharp是DotNet下的免费AOP框架,它以Dynamic Proxies和XML作为配置文件。&&二、Ajax框架&&Ajax.NET Professional (AjaxPro)是最先把AJAX技术在微软.NET环境下的实现的AJAX框架之一。它在客户端脚本之上创建代理类来调用服务器端的方法。&&MagicAjax.NET是一款在ASP.NET下创建Web页面提供AJAX技术的框架。它使开发人员很容易把AJAX整合到他们的页面而不需要替换ASP.NET控件或自己写javascript脚本代码。&&Anthem.NET是为ASP.NET开发环境提供的开源AJAX工具包,它可以运行于ASP.NET 1.1和2.0。&&三、工作流(workflow)&&Workflow.Net是使用微软.Net技术基于wmfc标准的创建工作流引擎。&&NetBPM是JBpm移植到.net平台下的一款开源工作流软件。NetBpm可以很容易和.Net应用程序集成在一起,可以创建,执行和管理工作流程序。&&Bpm Tool支持将业务模型转换成软件模型。业务开发人员可以使用模型驱动的方法设计,实现,执行和跟踪业务流程。因此开发人员能够更容易的关注业务逻辑的变化。&&三、文本编辑&&FCKeditor是一款功能强大的开源在线文本编辑器(DHTML editor),它使你在web上可以使用类似微软Word 的桌面文本编辑器的许多强大功能。它是轻量级且不必在客户端进行任何方式的安装。&&FreeTextBox 是一个基于 Internet Explorer 中 MSHTML 技术的 ASP.NET 开源服务器控件。这是一款优秀的自由软件(Free Software),我们可以轻松地将其嵌入到 Web Forms&中实现 HTML 内容的在线编辑,在新闻发布、博客写作、论坛社区等多种 Web 系统中都会有用途。&&VietPad是一个功能完整的跨平台的Java/.NET的Vietnamese Unicode开源文本编辑器。支持打开,编辑,打印,转换,排序,和保存基于文本的Unicode格式的Vietnamese文件。&&NetSpell是一款.NET框架下的开源拼写检查引擎。&&PPC_edit是一款应用在Pocket PC上的开源文本编辑器,它支持TXT, RTF, HTML, WordML,&DocBook 和 ZIP格式的文件,屏幕上会显示国际标准的软键盘。&&四、博客(Blog)&&NovaShare是一款Blog引擎,它使你创建基于交互式的web的新闻和论坛网站,很像WonkoSlice或Slashdot。管理员可以发布文章和发起投票,浏览者可以创建用户帐号,发表议论等等。&&dasBlog是从BlogX 网上日志引擎发展而来。像Trackback ,Pingback 一样增加许多附加的特征,有完整的Blogger/MovableType API支持,API注释,完整的Radio-style模板定制,支持Mail-To-Weblog/POP3的附件和内嵌图片,基于WEB的DHTML,OPML,配置的编辑器。&&DotText是一个被使用了数百个blogs的强劲的blog引擎。这是一个N-tiered应用的例子。&&tBlogger是一个C#开发的完整的blog网站程序,使用XML配置。&&五、系统构建&&.NETZ是一款免费开源工具,它可以压缩和打包微软 .NET 框架可执行文件(EXE, DLL)以使他们更小。更小的可执行文件占用的磁盘空间较少且因为读取文件时对磁盘的访问较少而使读取数度更快。它和PE(portable executable)打包工具不一样,.NETZ是使用 C# 编写的存粹的 .NET 解决方案。.NETZ可以用来打包几乎每一种 .NET 支持的语言编写的程序。.NETZ支持 .NET EXE 和 非共享(non-shared)的 DLL 文件。压缩过的程序能以相同的方式解压缩这些对最终用户是透明的。&&NAntContrib为NAnt提供定制任务的工具。&&Prebuild是XML驱动的一款跨平台pre-build工具,使开发人员很容易就可以为IDE和.NET开发工具生成项目或构建文件。它支持Visual Studio .NET , 2005,&SharpDevelop, MonoDevelop 和 NAnt。&&BusyBeeBuilder是.NET平台下功能强大,易于使用,可扩展的开源构建自动操作工具。&&Draco.NET 是 Windows 服务应用程序。它的设计使其容易持续的集成新特性。Draco.NET监视你的源代码储存库。当探测到你的项目有变化时自动重新创建项目并把包含变化列表的创建结果发送到你的Email。&&Build Studio为软件的自动构件处理提供了一套完整的解决方案。&&CruiseControl.NET是.NET平台下的一款整合服务器。&&NAnt类似Apache项目下的Ant,是.Net下的开源构建工具。适用在自动编译.NET应用的场合,如.NET项目的每日构建(nightly build)。&&五、图表制作&&ZedGraph是C#编写的.NET类库,提供了用户控件和web控件。它可以创建2D的线性图、条形图和饼图。它功能完整且有详细的功能自定义,不过使用默认的选项就足够好用了。一款类似 PieChart, StackBar, LineChart的C#开源图表组件。&&NPlot是一款.NET下的开源图表类库.它值得称道的地方是优雅且灵活的API设计.NPlot包含了Windows Form控件, ASP.NET控件和一个创建Bitmap图片的类。还有一个可用的GTK#控件。&&XSCharting是C#开发的图表组件,提供了多种多样的图表选项。&&DaveChart是一个免费的DotNet类库。&&NChart 提供了很多值得应用在商业,教育等多个领域的2 D图表。&&六、聊天系统&&Dot Net Chat server是基于DotNet框架开发的聊天服务器和客户端项目。&&七、内容管理系统(CMS)&&Ludico是C#编写的居于ASP.NET 2.0的Portal/CMS系统。它的模块化设计是你可以按照你希望的使用或开发网站功能。它里面有高级的用户管理,一个所见即所的(WYSIWYG)的编辑器等。&&mojoPortal是一款C#开发的面相对象网站框架,它可以运行于Windows的ASP.NET 和GNU/Linux 或Mac OS X的Mono的平台上。&&Cuyahoga是C#开发的灵活的CMS / Portal 解决方案。它可以运行于Microsoft .NET 和Mono 平台,支持SQL Server, PostgreSQL或MySQL作为底层数据库。&&Umbraco是一款在.net平台下C#开发的开源内容管理系统,该系统效率,灵活,用户界面都不错。&&Kodai CMS是.NET平台下的一款功能齐全的内容管理系统。&&Rainbow项目是一款使用Microsoft''s ASP.NET和C#技术开发的有丰富功能的开源内容管理系统。&&NkCMS是使用ASP.net和Sql server 2000开发的内容管理系统。&&Amplefile是一款内容管理系统,是.Net环境下的windows应用程序,使用了.Net remoting.&&Go.Kryo是一个用ASP.NET(C#).NET 实现的简单的内容管理系统,后台数据库使用Microsoft SQL Server 。&&ndCMS是 ASP.net (C#)下的一个内容管理系统。它提供了用户管理,文件管理,一个WYSIWYG编辑器,模板管理,拼写检查和内置的http压缩。ndCMS的目标是提供一个简单而快速的方式部署.Net站点以节省你的时间和金钱。&&八、代码覆盖(Code Coverage)&&NCover是.NET框架下的C#版本代码覆盖分析工具。NCover可以对程序进行 line-by-line&的代码覆盖统计。&&九、论坛系统&&YetAnotherForum可以作为ASP.NET开发的网站的论坛或是留言板。它使用MSSQL作为底层数据库。&&十、开发工具(IDE)&&SharpDevelop是一个DotNet平台下的免费开发工具,支持C#和VB.NET。&&MonoDevelop是可以支持C#和其它符合.Net规范的开发语言的IDE。&&C# Studio是 C#/Mono/GTK# 开发者的一个简单的IDE。&&十一、安装制作&&izfree 是一套套免费的工具用于帮助创建使用Microsoft''''s Windows Installer 技术的安装程序。使用izfree 你可以为你的应用程序制作强劲的安装程序。&&Windows Installer XML (WiX)可以重XML源文件创建Windows程序安装包的工具集。它支持命令行方式,开发人员可以把结合它来创建MSI和MSM安装包一个可以和商业软件安装产品相比的开源打包工具。&&十二、IoC容器&&Spring.net是从java的Spring Framework移植过来的。java的Spring包含了许多功能和特性,在当前的Spring.net都有提供。Spring.net最初发布的版本包含了一个很有特色的IoC容器。&&Castle是一组应用开发的工具,内含一个简单的IoC容器。&&StructureMap是.NET环境下的一个轻量级依赖注入工具,StructureMap也是一个灵活的、可扩展的通用&插件&机制的.NE&&十三、Bug追踪&&BugNet是一款C#编写的基于Web的开源Bug跟踪系统。&&BTsys是一款轻量级的开源桌面Bug跟踪系统,是C#和ADO.NET实现。一个Bug记录和跟踪的解决方案,支持文件附件和注释历史。&&BugTracker.NET是使用ASP.NET 和 C#开发的基于web的开源Bug跟踪系统。需要SQL&Server 或 MSDE支持。它安装简单,容易使用,功能强大。&&BugBye是一款ASP.NET和C#开发的基于web的Bug跟踪系统。&&十四、日志工具&&log4net 是一个可以帮助程序员把日志信息输出到各种不同目标的.net类库。它可以容易的加载到开发项目中,实现程序调试和运行的时候的日志信息输出,提供了比.net自己提供的debug类和trace类的功能更多。log4net 是从java下有卓越表现的log4j 移植过来的。它是apache基金资助的项目的一部分。&&NLog是C#编写的开源日志类库,它的设计思想是使其简单而灵活。NLog让你处理诊断的日志消息,用相关信息扩充消息,依照你的选择格式化日志消息和把日志消息输出到一个或多个目的地。&&LogThis是为.NET应用程序提供的一款C#开源日志框架,它可以嵌入到应用程序之中。&&AppLog是一个简单的应用日志工具。它使用C#开发,且使用ByteFX MySQL 数据访问库.。&&C#开发的可扩展日志工具,有高级消息队列支持,可以异步使用。&&CSharp Logger是apache继log4net 项目后设计的又一个日志工具。它用来向Windows的事件日志写入debug、info、warn和error四个等级的信息。&&十五、网络客户端&&.NET FTP Client是C#编写的开源类库。&&.NET Telnet是微软.NET Framework下的C#开发的开源telnet类库。它的灵感来至Java&Telnet Application。&&metro这个项目是C#编写的类库,它提供了一套丰富的类使开发IP version 4, TCP, UDP&and ICMP等工作更容易。它包含了有很有用的工具如包嗅探器,网络分析工具例如路由跟踪,ping等。&&LJ.NET是LiveJournal站点的客户端。它为LJ在线日志服务提供了简单而强大的用户接口。&&NET VNC Viewer 是一款完全用C#开发的开源VNC观察器。它兼容Smartphones, Pocket&PC和Windows的电脑(.NET CF or .NET Framework)。它比起其它观察器的优点是可以在Pocket PC上全屏显示而且可以旋转屏幕。&&GVDownloader允许你从google videos, metacafe, putfile, youtube,
和更多的地方快速下载内含的视频和多媒体。它的包含一个强劲IE插件和位于你系统托盘的独立程序。&&DotNetOpenMail能够使你在微软.net框架开发的asp.net, WinForm应用程序发送Email。它是C#编写的开源组件,它不需要使用System.Web.Mail类库就可以容易的创建带附件HTML和Plain-text的Email。程序员不需要知道很多相关的细节就可以使用不同的字符集或不同的MINE编码来创建multipart/alternative,multipart/related和multipart/mixed的MIME消息。&&DotMSN是一款独立的开源类库,它不需要和官方的MSN Messenger交互,因此不必安装MSN&Messenger就可以使用DotMSN和MSN Messenger服务通信.DotMSN是C#编写的,所以.NET环境支持的语言都能够使用.DotMSN类库使用简单而且实现方便。它灵活,坚固,轻量级利于整合到任何应用系统.使用DotMSN的应用系统能实现从创建消息机器人到自定义客户端等各种不同的功能.如果你的应用程序需要和Messenger服务通信,DotMSN是一个不错的工具.&&SharpSSH使用C#实现了SSH2协议,它支持SSH, SCP 和 SFTP.&&OpenPOP.NET一组和POP Servers通信的.NET类库。&&IceChat是为连接多样的IRC Servers设计的Internet Relay Chat Client。&&lphant 是为edonkey/emule开发的开源客户端程序。&&.NET FTP Client C#开发的类库。&&OpenSmtp.net 是 C# 开发的开源SMTP组件。它不依赖.NET Framework 的System.Web.Mail 包中的类。允许开发人员使用不同于MS SMTP的SMTP 服务器且提供了web service而可以通过HTTP发送email。&&网络服务器&&ODC(#)H是一款C#编写的开源hub software,它功能强大,消耗的资源少且支持插件功能。&&Dawn of Light (DOL)是第一个开源的Dark Age of Camelot (DAOC)游戏服务器,你可以创建自己的服务器且自己设计游戏内容。DOL使用.Net Framework框架的C#编写,使用XML和MySQL存储数据,支持Windows和Mono平台。&&NeatUpload可以让ASP.NET开发人员把磁盘上的文件通过流的方式上传并且可以监视上传进度。它是开源的且在 Mono''s XSP/mod_mono和微软的ASP.NET下运行得一样好。包含2个自定义控件:*用户可以通过INPUTFILE选择一个要上传的文件。&&ProgressBar可以用进度条方式或弹出窗方式显示上传进度。当JavaScript可用时ProgressBar是用类似AJAX的无刷新方式展现,但也允许JavaScript不可用的用户见到上传进度。&&NMail ,C#开发的开源程序,提供SMTP 客户端和服务器, POP3 和 IMAP4 服务器。&&FTP.NET是使用C#编写的开源多线程FTP程序。&&CSharp Email Server C# Email Server是 Java Email Server (JES) 的C#版本。&&PDF类库&&PDFsharp是一款可以让.NET框架支持的任何语言很容易的创建PDF文件的类库。&&ASP.NET FO PDF 是一款C#编写类似于ASP.NET服务器控件的控件。它接受DataTable 和一些其它参数来创建XSL FO,并使用NFOP (Apache FOP Port in J#) PDF Formatter来绘制一个类似PDF Report 的DataGrid 。今后将会增加更多的标签来可以生成XSL FO 。&&Report.NET 开源类库包含了生成精确PDF文档的类。它是.NET平台下的C#编写的,可以帮助你创建简单的灵活的PDF文件。你可以从任何ADO.NET的DataSet取得数据来创建PDF文档。ASP.NET可以用Report.NET来创建动态的PDF响应页面。&&SharpPDF是可以用来简单的创建PDF文件的C#类库。它创建的文件百分白兼容PDF格式。&&iTextSharp是一款开源的PDF操作类库,使用它可以快速的创建PDF文件。/ 是一个关于 iTextSharp 的中文Blog。&&持久层框架&&NHibernate是一个面向.NET环境的针对关系型数据库的对象持久化类库。 NHibernate来源于非常优秀的基于Java的Hibernate关系型持久化工具。 NHibernate从数据库底层来持久化你的.Net对象到关系型数据库。NHibernate为你处理这些,你不用自己写SQL去数据库存取对象。你的代码仅仅和对象关联,NHibernat自动产生SQL语句,并确保对象提交到正确的表和字段中去.大量减少开发时人工使用SQL和ADO.NET处理数据的时间. NHibernate可以帮助你消除或者包装那些针对特定数据库的SQL代码,并且帮你把结果集从表格式的表示形式转换到一系列的对象去。因此对于那些在基于.NET的中间层的应用中,它们实现面向对象的业务模型和商业逻辑的应用,NHibernate是最有用的。&&FileHelpers Library是一款C#编写的开源 .NET 类库。它使用简单,很容易就可以从固定长度文件或界定记录(CSV)读/写数据。它也支持从不同的数据存储格式(Excel, Access,&SqlServer)导入/导出数据。&&Websharp是国人开源的一款开源持久层框架,它的目标是设计一个基于.Net的通用的应用软件系统的框架,以简化基于.Net平台的企业应用软件的开发。目前,Websharp关注于企业应用软件的以下几个方面:1、数据库访问 2、 O/R 映射 3、 AOP 4、 分布式访问&&ObjectBroker是.NET平台下的一款开源O/R映射框架。它支持对象缓存,1:1, 1:n 和 m:n的关联映射等特性。&&Gentle.NET是一款开源的与关系数据库(RDBMS)无关的对象持久层框架,可以自动生成SQL和对象结构。它拥有一个SQL工厂用来创建自定义查询、DataView构建助手和卓越的性能和完善的文档。&&Ubik是C# 2.0下的ORM持久层框架,当前是WinForms应用程序开发提供的.它支持OPath的子集而可以进行面向对象查询,且包含一个网络事件系统.&&NDal是一个数据提取层(DAL)框架,它可以运行在.NET和Mono环境下。&&Persist.NET是C#编写的一款完整的持久层框架。&&ObjectBroker是.NET平台下的数据库对象/关系映射(O/R Mapping)框架。&&iBATIS.NET帮助你的应用系统创建更好的持久层框架。&&Advanced Data Provider是为ADO.NET提供的动态数据提供者。可以让应用程序透明的访问不同的ADO.NET 数据提供者。&&OJB.NET是一款.NET平台下的对象/关系映射(O/R Mapping)工具。&&门户系统&&OmniPortal基于一种web-portal-kernel(Web门户核心)的思想而构建的开源基础框架,它解决了安全控制、主题和本地化等。你可以基于 OmniPortal 来更容易的创建任意的Web应用系统(例如 ERP, CMS, CRM)。它支持Mono 和.Net 。对于Web开发人员来说,OmniPortal为他们提供了一款优秀的二次开发基础类库。&&SharpNuke.NET是一款C#开发的基于 ASP.NET 的开源 Portal/CMS。最初是从流行的VB.NET开发的web portal系统DotNetNuke移植过来的的。以后的版本将会兼容 Windows和 Linux Mono。&&Personal .NET Portal是一个基于Web的个人门户系统。它试图提供一种简单的方式建立个人网站,页面使用标签和模板创建。&&My Community Portal提供了一个统一的Internet门户,作为论坛,群组,聊天,你自己的Email,搜索引擎,网络目录,个人主页,投票还有更多的功能入口。&&剖析工具(Profilers)&&Prof-It是一款独特易用的C#程序剖析工具。当保持对一个最小量的源代码的探测时,它为每一条语句测量执行频率。&&NProf不仅仅是成熟的剖析程序,也是一套可以用来创建其它功能齐全的剖析程序的完整API,以及用可视化的工具扩展的默认GUI。&&NProfiler,.NET平台下的一个应用程序剖析工具。&&项目管理&&SharpForge支持协作多个软件项目的开发和管理,它为你的团队提供类似 SourceForge 和&CodePlex的功能。SharpForge是C#开发的.NET 2.0开源项目。&&User Story.NET是一个Extreme Programming 项目。&&RSS和RDF工具&&Rss Bandit是C#开发的开源RSS阅读器,它内建多国语系,支持Atom 1.0以及其他各种的RSS feed格式。它画面漂亮,拥有分页浏览功能,软件细部设置弹性度高。它的操作画面直观简单易懂,有一个很好的Command模式和ListViewEx来使用,可让使用者很快的上手。&&iPodder.NET 是一款C#编写的开源媒体收集器,它能自动帮你从互联网上下载音乐,能帮你轻松地从成千上万的音乐中选择你喜欢的。用它设置好订阅RSS feeds后,只要节目一有更新,它就自动下载了,你不必大量的浪费时间自己手工下载。它还整合了iTunes,创建播放列表和iPod同步功能,你可以用Apple iTunes或Media Player播放,也可以把音乐导入到你的iPod或其他MP3播放器中。&&FeedExpress主要是让你订阅一些RSS/RDF资源,知名的如FeedExpress里的Subscriptions。它和Outlook Express让你订阅一些新闻组是一样的。&&RSS.NET是一款操作RSS feeds的开源.NET类库。它为解析和编写RSS feeds提供了一个可重用的对象模型。它完全兼容RSS 0.90, 0.91, 0.92, 和 2.0.1等版本。&&GtkSharpRSS是C#开发的开源RSS和RDF客户端,它用于 Mono, Gtk#, 和 RSS.NET。它也可以通过内嵌于Mozilla的窗口来显示内容。&&Atom.NET是一款完全使用C#开发的开源类库,它的目标是提供便捷的方法来操作Arom&Feeds。它提供一个对象模型来写入和解析Atom Feeds。它只兼容0.3Atom规范,可以运行于微软.NET 1.x,Mono 0.29 或更高版本。&&NRss是为微软.NET框架和Mono下提供的开源类库,它读取RSS Feeds元素然后以树型结构来展现对象关系。&&Aggie是一个新闻收集器,它是桌面应用程序,可以下载最新的新闻并通过web页面的形式呈现。&&mail2rss是.NET下的 web service,它在你请求时检查你的电子信箱并返回包含电子信箱里的消息的 RSS feed。它是完全用C#开发的开源项目,没用使用任何第三方控件。&&规则引擎&&NxBRE是.NET平台下的一款开源轻量级的业务规则引擎(aka Rule Based Engine),它由正向串行的推理引擎(forward-chaining inference engine)和XML驱动流控制引擎(XML-driven flow control engine)组成.它支持 RuleML 0.9 Naf Datalog 和 Visio 2003&建模。&&SRE (Simple Rule Engine)是.NET下的一款轻量级的开源正向串行的推理规则引擎(forward&chaining inference rule engine)。它容易理解,可以解决复杂的问题。&&搜索引擎&&NLucene是Lucene的.NET版本。&&DotLucene,Lucene.Net开源项目转向商业化后,DotLucene以Lucene.Net作为基础继续进行开发。&&版本控制(CVS)&&Porc是为CVS和项目管理工具提供了完整的图形化界面,它在CVS的基础上增加了一些有趣的功能。它是.NET平台下用C#编写的。&&Sharpcvslib是C#语言编写的CVS客户端API。当前它为公共CVS命令提供了核心函数。&&NetCvsLib是为.NET平台下C#开发的一个CVS客户端。它作为一个单独的程序集而实现,因而可以很容易的集成到其它项目中去。&&SQL客户端&&SqlBuddy是C#编写的一款用于Microsoft SQL Server和MSDE的开源工具,使用它可以很容易的编写SQL脚本。SqlBuddy提供的功能和查询分析器的目的有些微不同,它倾向于帮助使用者编写SQL。&&QueryCommander是一款开源的Sql editor,模拟微软的查询分析器,Visual Studio的环境类型。QueryCommander的特点包括类似IntelliSense功能,自动注释,xml文档模型,xml2data等。&&SQL Buddy是一款有特色的免费MSDE / Sql Server IDE,它是用.NET框架的C#编写。&&Database Commander是Windows操作系统下的一款用户界面友好的数据库管理工具。&&模板引擎&&NVelocity 是一个以 .NET 为基础的模板引擎。它允许任何人通过简单而强大的模板语言来定义对象。&&测试工具&&NUnit一款单元测试框架,它可以应用于遵循.NET框架标准的所有语言下。NUnit最初是从JUnit移植过来的。NUnit完全使用C#编写且设计时考虑了多数.NET语言的特性,例如自定义属性和其它反射特性。&&NMock是一款.NET平台下的基于动态代理的Mock模拟对象类库,用于C#开发。Mock对象使测试更简单,它测试单个组件或单个类时不需要其它所有组件真正实现。也就是说我们可以仅仅只是测试一个类,比起测试一个完整的对象关系树更容易查清楚Bug。Mock对象一般用于以测试为驱动的开发当中。&&TestDriven.NET是一款和Visual Studio .NET无缝结合的测试插件。它可以和NUnit,&MbUnit 和 Team System紧密结合。&&Rhino.Mocks源于EasyMock.Net,它试图提供一种更简单的方法去创建和使用mock&objects且使你得到更好的重构支持。它结合了EasyMock.Net和NMock的方式。&&Dot NetUnit实现了XUnit 测试框架,是.NET平台下的单元测试组件。&&EasyMock.NET是由Java实现的EasyMock到.net平台的一个移植版本的一组类库。它提供了一个简单的方法用来模拟接口和远程对象。&&dotunit是JUnit移植到微软.net平台的测试框架。它可以实现自动化测试。&&NUnitForms是NUnit的扩展。它为Windows Forms应用程序提供单元测试和压力测试,可以容易的用它为你的Windows Forms类进行自动化测试。&&Web框架&&NStruts 是java下大名鼎鼎的struts开源MVC框架的ASP.NET版本,是jakarta struts框架的一部分。&&Maverick.NET是从Maverick移植来的.NET版本,是一款开源的 Web MVC框架.它专注于MVC逻辑,它支持丰富的模板和转换技术。&&MaverickLite是ASP.Net下的一款简单的开源表现层框架。它在建立在Maverick.Net&framework基础上。它使用front controller的方式来处理请求。&&Ingenious MVC ,基于.NET 2.0的构MVC结构的应用程序,它包含即开即用(out-of-the-box)的特性支持ASP.NET和Windows Forms应用程序.它也可以在大多数方法中扩展和定制.&&Websharp是.NET平台下的一款轻量级应用框架。&&Email客户端&&GmailerXP是为Google的Gmail服务提供了全套的工具开源程序。在线所能做的GmailerXP都允许用户做,它也整合了你任何时候在Gmail需要的其它一些程序的特点(GML, Gmailto,等)。&&RemoteCalendars是C#开发的为Outlook 提供的一款开源 COM-.NET 插件。安装完这款插件后,Outlook的用都可以用Outlook 订阅、重新读取和删除远程iCalendar(RFC 2445)。&&SharpWebMail是一款C#编写的ASP.NET下的EMail客户端。它通过POP3服务器接收邮件,通过SMTP服务器发送邮件。它的配置很简单(只需要在web.config 里面做几个设置)。&&Web测试&&NUnitAsp是一款自动测试 ASP.NET页面的开源工具. 它是从NUnit扩展来的。&&Wiki引擎&&Perspective是一款C#开源Wiki引擎,它使用户可以很容易的合作进行编辑,链接和共享Web页面,它里面有安全和分级的管理环境。Perspective居于奇妙的Wiki思想,包含了其它一些有前途且效果好的特性。&&DevHawk Wiki是一款.NET平台下由C#实现的开源Wiki引擎。&&ProntoWiki是使用VWD (Visual Web Developer)编写的C#开源wiki引擎,ASP.NET 2.0&和 SQLExpress 2005作为后台。Wiki引擎速度快且容易使用,提供了和 rich text editor 一样的文本标记( text markup )功能。它可以自动通过web接口接收图片和文件作为附件。另外,ProntoWiki的特点还有页面可以在贴出或更新之前预览,基于角色的用户认证,使用 web&parts 自定义外观和布局,历史跟踪,和功能查询。&&FlexWiki是一款使用.NET技术(C#和ASP.NET)编写实现的开源多人协作的写作工具。&&Thufir提供了字处理和文档链接功能。它类似Wiki-Wiki ,且它具有&所见即所得&的界面。它还可以通过和Word交互来利用Word的拼写检查功能。&&XML解析&&ODF Add-in for Microsoft Word 是一款开源的XML转换器,它提供的工具为在 Open XML&Formats 和 Open Document Format(ODF)之间转换提供了桥梁。作为第一款这类组件,ODF Add-in for Microsoft Word 2007使你可以在Word里打开和保存ODF文档。&&NDigester是Jakarta Commons-Digester 工具的.NET实现版本。提供了完整的对XML文档的处理控制。&&SAX.NET是用来操作XML的简单的API。它是从最初在java上被广泛使用的API移植来的。&&多媒体工具&&FreeImage是为开发人员提供的开源类库项目,它支持多种流行的图片格式(PNG, JPEG, TIFF,&BMP等).FreeImage简单,易用,快速,多线程安全,兼容所以32位的windows并且是跨平台的(Linux和Mac OS X).&&TVGuide是一款显示通过简单而清晰的接口下载的TV列表的Windows程序。&&DirectShow.NET Library 这个类库的目的是使你可以从.NET应用程序内部调用Microsoft''''s DirectShow的功能。它支持Visual Basic .NET 和 C#,理论上应该是可以支持任何.NET语言。&&iTunes Agent 是和iTunes 一起使用的C#开源MP3播放器。它可以使得在播放MP3时,播放列表与MP3自动播放器同步。&&MeGUI是一款基于ISO MPEG-4的全面的GUI解决方案。它可以支持使用MPEG-4 ASP&(XviD & libavcodec MPEG-4)标准的mencoder,使用MPEG-4 AVC (x264) 标准的x264.exe 或 mencoder,使用(HE)AAC audio标准的BeSweet、Nero AAC encoder和使用MP4 muxing标准的mp4box。&&OpenImageManager是一款C#开发的新的开源图片管理器。它基于非常流行的图片查看器ACDSee(TM)的思想设计,它的功能有缩略图生成,HTML相册生成器,支持10种语言等等。&&abrViewer.NET是C#编写的可以批量浏览和输出Adobe Photoshop的笔刷(.abr files)的开源工具。&&MeWiG是使用.NET框架开发的Windows下的开源MEncoder(MPlayer的一个组成部分)。你能够转换成几乎任何视频资源,无需要命令行操作。&&VTK.NET是.NET包装的Visualization Toolkit。你可以使用它来编写C#、C++、Visual Basic&或 J#的Windows Forms应用程序。它包含在设计时可拖拽的Windows Forms控件。&&SubtitleCreator使你可以为你的DVD创建对白字幕。它拥有先进的同步特性,DVD预览,和一个简单的所见即所得(WYSIWYG)的编辑器。当然你也能够修改现有DVD的对白字幕的定位和颜色。&&Paint.NET是在Windows下使用C#编写的一款出色的开源图像编辑器。&&MediaPortal试图帮你把电脑变成一个高级的Multi-Media Center / HTPC。它允许你听你喜欢的音乐&收音机,看你的video和DVD,观看,确定和记录实况电视等其它功能。MediaPortal是开源的系统,你可以完全免费的获得它。任何人都可以帮组开发MediaPortal 或者根据自己的需要把Media Portal 进行调整。&&C#游戏&&Exult是可以在现在的操作系统上面运行Ultima7的游戏引擎,它提供了一个地图编辑器和其它的一些工具让你制作属于你自己的模型和游戏.&&Ch2r是第一款为光晕2(Halo 2)提供的开源模型编辑器。&&这是一款从在Palm平台上流行的Space Trader游戏移植的Windows版本。&&EMU7800是C#编写的一款Atari 模拟器。&&BooGame是面相对象的 CLS-compliant,开源2D游戏引擎框架。它提供了高级的硬件加速video,audio,keyboard,mouse,内嵌脚本和许多图片格式。它使用C#开发的,目标是支持.NET 1.1, 2.0 和 Mono 平台。&&RealmForge这款开源的.NET 3D游戏引擎前身是Visual3D.NET,它是一套使用C#、 .NET&2.0和XNA进行可视化设计和开发3D游戏、模拟软件和交互式环境的框架和工具集。&&Pocket Sudoku是 Pocket PC (Windows Mobile)上的数独(Sudoku)游戏。它可以有五种不同等级的难度来创建数独(Sudoku)迷题,解答正确任何迷题,都会用铅笔标记。&&CsGL在.Net框架下为OpenGL 1.1 - 1.4和许多扩展的支持提供支持.&&文档工具&&NDoc 可以将 C#.NET 编译生成的程序集和对应的 /doc XML 文档,自动转换成如 .NET&Framework SDK 类库文档或者 MSDN Library 在线 .NET 类库文档形式的代码文档,让您快速拥有专业级的类库API 文档。&&脚本语言&&Sharp Vector Graphics (SVG#)是.Net框架下C#开发的文档对象模型。它帮助你在.Net平台上进行SVG开发。&&IronPython是.NET平台上的Python的CodeName。它拥有一个完全动态的交互式解释器,可以支持所有的.NET类型库,并且集成了.NET Framework的诸多优点,甚至可以用Python的类来扩展.NET类。IronPython遵从ECMA的CLI标准(ECMA-335),可以运行在Microsoft .NET Framework和MONO上。&&地理信息系统(GIS)&&SharpMap是一款易于使用的地图渲染器,它可以为Web和Windows应用程序渲染GIS数据。SharpMap是使用C#编写,基于.NET 2.0框架上开发的开源项目。&&monoGIS将成为Mono平台下的开源完整GIS。已经发布了internet mapserver,OGC WMS实现和一些工具像空间格式转换。&&NASA World Wind 是C#开发的个人电脑上的开源的3D图形虚拟地球系统。它结合了美国国家航空航天局(NASA)从卫星拍摄的图像,这些图像应用于Blue Marble, Landsat 7, SRTM,&MODIS 以及其它更多的地方。&&其它C#开源项目&&DockPanel Suite是一款开源的.Net Windows Forms开发环境下的停靠控件(docking)类库。它模仿Visual Studio .Net的效果开发的。&&wx.NET是基于.NET通用语言基础结构 (CLI)的开源项目。它致力于开发一个基于.NET的GUI库,它按照wxWidgets的类层次用C#编写,可以在多种CLI下执行,包括.NET,Mono,和DotGNU Portable.NET。&&MMC .NET类库是为Windows的MMC+Snapin开发提供支持而包装的一套开源类库。&&DPAToolkit(Design Pattern Automation Toolkit)是应用设计模式设计应用程序的开源工具包,它有便捷的代码生成,反向工程功能。拖拽(Drag and Drop)方式便捷的创建UML类图。支持为代码生成,反向工程编写自定义插件。&&mjbWorld 是一款开源的3D编辑器,它允许用户通过图形界面的选择和拖拽方式来编辑图形。它基于和应用X3D与VRML标准。该软件目的用于利用建立开放免费程序建立3D世界。同时它也可以用于其他免费开放软件程序之间进行数据交换。mjbWorld有Java, C# 和C++ /Qt等版本。&&MonoCalendar是.NET平台下的开源日历程序,它的目的是为Mac平台之外的其它平台提供一款类似iCal 的日历程序。&&Data Tier Generator是一款微软 .NET平台下的开源项目,它为访问SQL Server 2000而生成存储过程的SQL Server 2000脚本和C#类。这些存储过程包含了Insert, Update,&Delete, Select, 根据PK的Select, 根据FK的Select的SQL脚本。&&Finisar.SQLite是.NET框架下的一款为存取SQLite-Databases提供的ADO.NET Data&Provider。&&Math.NET的目标是为提供一款自身包含清晰框架的符号运算和数学运算/科学运算,它是C#开发的开源类库。Math.NET含了一个支持线性代数的解析器,分析复杂微分,解方程等等功能。&&Ascii Generator dotNET (ascgen2)是一款把图片转换成高质量的ASCII字符组合(ASCII&art - text)。第一个版本支持变形和粗体字体,和实时调节输出。&&GPSProxy是.NET Compact Framework下的开源程序。它通过COM口在Pocket PC之间拷贝GPS数据,可以把GPS数据格式从NMEA 0183转换成Garmin GPS。它是基于.NET Fra的Windows版本。&&FOP C# Port这是Apache居于java的 XSL-FO 格式转换器的C#版本。它采用并扩展了XSL-FO标准使FOPs在可以嵌入.NET CLR管理代码应用。&&
【转】一个程序员的爱情故事
不多说了,大家都是程序员,看代码,大家都懂的!
//一个程序员的爱情故事
publicclass MyLoveStory {
publicstaticvoid Main(string[] args) {
//The ForeStory
int result =1;
bool love =false;//以前有个小男孩,没有爱情,孤孤单单一个人。
if (love) //他认为如果是爱情。
result = AtOneTime();//那必须是两个人在同一个时间爱上彼此。
//But Now...
//但是现在长大了,有了爱情,却出现了第三者
if (args[0] =="Has"&& args[1] =="Third"&& args[2] =="One") { love =false;//爱情没了
result = DoPart();//分手,独自一个人。
//现在这个男孩的心情是:如果女生生活的很悲惨,自己会伤心。
//如果看到女生活的很幸福,自己更伤心,因为幸福不是自己给的。
Console.WriteLine(GetNowHeartState.ToString()); } }
//男生的心情
internalenum HeartState { Sad, MoreSad }
//女生的生活状态
internalenum LifeState { Nice, Poor, }
//男生现在的心情
internal HeartState GetNowHeartState(LifeState girlLife) {
//现在这个小男孩的心情是:如果生活的很悲惨,自己会伤心。
//如果看到女生活的很幸福,自己更伤心,因为幸福不是自己给的。
if (gilrLife == LifeState.Poor)
return HeartState.S
return HeartState.MoreS }
//爱情是在同一时间爱上彼此
internalstaticint AtOneTime() {
return1+1; }
internalstaticint DoPart() {
return2-1; } }
问:宅男最喜欢学什么编程语言?答:Lua
程序猿(@ikuqin) : 青年去问禅师:大师,我最近烦恼总是无穷无尽的,我觉得我这辈子烦恼都不会到头了。禅师说:万物有始就有终,太阳升起终要落下,花开始终会谢,难道有无始无终的东西吗?青年略一思索,写下while(true)
禅师对年轻人说:即使是while(true)也有终止之时。随即在while(true){}中加上break
献之学编程三年,某程序上线前请羲之审核,被加了一行assert语句。不解。母亲郗氏读代码时喜道:我儿编程三年整,唯有一行像父亲。献之惭愧,问如何才能学好编程。羲之在京东上下单18套机械键盘,说,把它们都用废,你就学会了。(via腾讯微博@程序猿)
程序猿(@ikuqin) “我爱你,杰克,再见。” “别这样,别说再见,时候还没到,懂吗?” “我好冷。” “听我说,露丝,你会脱险的,你会活下去,生很多孩子,然后看着他们长大,孩子死了还有孙子,孙子会学习C、Java 和C++,研习《算法导论》、《设计模式》,他们是只乱码不乱性的程序猿好孩纸!”
排序算法(1)——冒泡、简单选择、直接插入、希尔(VB.NET语言实现,站长原创)
Public Class SortAlgorithm
&&& ''' &summary&
&&& ''' Swaps para1 and para2
&&& ''' &/summary&
&&& ''' &typeparam name="T"&Data Type&/typeparam&
&&& ''' &param name="para1"&The para1.&/param&
&&& ''' &param name="para2"&The para2.&/param&
&&& Private Sub Swap(Of T)(ByRef para1 As T, ByRef para2 As T)
&&&&&&& Dim temp As T = para1
&&&&&&& para1 = para2
&&&&&&& para2 = temp
&&& End Sub
&&& ''' &summary&
&&& ''' Bubble Sort 冒泡排序
&&& ''' &/summary&
&&& ''' &typeparam name="T"&Data Type&/typeparam&
&&& ''' &param name="oldArray"&The old array.&/param&
&&& ''' &param name="comparison"&The comparison.&/param&
&&& Public Sub BubbleSort(Of T)(ByRef oldArray As IList(Of T), ByVal comparison As Func(Of T, T, Boolean))
&&&&&&& Dim swapped As Boolean = True
&&&&&&& While swapped
&&&&&&&&&&& swapped = False
&&&&&&&&&&& For i As Integer = 0 To oldArray.Count - 2
&&&&&&&&&&&&&&& If comparison(oldArray(i + 1), oldArray(i)) Then
&&&&&&&&&&&&&&&&&&& Me.Swap(oldArray(i), oldArray(i + 1))
&&&&&&&&&&&&&&&&&&& swapped = True
&&&&&&&&&&&&&&& End If
&&&&&&&&&&& Next
&&&&&&& End While
&&& End Sub
&&& ''' &summary&
&&& ''' Simple& Selection Sort 简单选择排序
&&& ''' &/summary&
&&& ''' &typeparam name="T"&Data Type&/typeparam&
&&& ''' &param name="oldArray"&The old array.&/param&
&&& ''' &param name="comparison"&The comparison.&/param&
&&& Public Sub SimpleSelectionSort(Of T)(ByRef oldArray As IList(Of T), ByVal comparison As Func(Of T, T, Boolean))
&&&&&&& Dim min As Integer
&&&&&&& For i As Integer = 0 To oldArray.Count - 2
&&&&&&&&&&& min = i
&&&&&&&&&&& For j As Integer = i + 1 To oldArray.Count - 1
&&&&&&&&&&&&&&& If comparison(oldArray(j), oldArray(min)) Then
&&&&&&&&&&&&&&&&&&& min = j
&&&&&&&&&&&&&&& End If
&&&&&&&&&&& Next
&&&&&&&&&&& If min && i Then
&&&&&&&&&&&&&&& Me.Swap(oldArray(min), oldArray(i))
&&&&&&&&&&& End If
&&&&&&& Next
&&& End Sub
&&& ''' &summary&
&&& ''' Straight Insertion Sort 直接插入排序
&&& ''' &/summary&
&&& ''' &typeparam name="T"&Data Type&/typeparam&
&&& ''' &param name="oldArray"&The old array.&/param&
&&& ''' &param name="comparison"&The comparison.&/param&
&&& Public Sub StraightInsertionSort(Of T)(ByRef oldArray As IList(Of T), ByVal comparison As Func(Of T, T, Boolean))
&&&&&&& For i As Integer = 1 To oldArray.Count - 1
&&&&&&&&&&& Dim temp As T = oldArray(i)
&&&&&&&&&&& Dim j As Integer = i
&&&&&&&&&&& '后移
&&&&&&&&&&& While j & 0 AndAlso comparison(temp, oldArray(j - 1))
&&&&&&&&&&&&&&& oldArray(j) = oldArray(j - 1)
&&&&&&&&&&&&&&& j -= 1
&&&&&&&&&&& End While
&&&&&&&&&&& oldArray(j) = temp
&&&&&&& Next
&&& End Sub
&&& ''' &summary&
&&& ''' Shell Sort 希尔排序
&&& ''' &/summary&
&&& ''' &typeparam name="T"&Data Type&/typeparam&
&&& ''' &param name="oldArray"&The old array.&/param&
&&& ''' &param name="comparison"&The comparison.&/param&
&&& Public Sub ShellSort(Of T)(ByRef oldArray As IList(Of T), ByVal comparison As Func(Of T, T, Boolean))
&&&&&&& Dim increment As Integer = oldArray.Count
&&&&&&& While increment & 1
&&&&&&&&&&& increment = increment \ 3 + 1 '增量
&&&&&&&&&&& For i As Integer = increment + 1 To oldArray.Count - 1
&&&&&&&&&&&&&&& If comparison(oldArray(i), oldArray(i - increment)) Then
&&&&&&&&&&&&&&&&&&& '增量子表插入排序
&&&&&&&&&&&&&&&&&&& Dim temp As T = oldArray(i)
&&&&&&&&&&&&&&&&&&& Dim j As Integer = i - increment
&&&&&&&&&&&&&&&&&&& While j &= 0 AndAlso comparison(temp, oldArray(j))
&&&&&&&&&&&&&&&&&&&&&&& oldArray(j + increment) = oldArray(j)
&&&&&&&&&&&&&&&&&&&&&&& j -= increment
&&&&&&&&&&&&&&&&&&& End While
&&&&&&&&&&&&&&&&&&& oldArray(j + increment) = temp
&& &&&&&&&&&&&&&End If
&&&&&&&&&&& Next
&&&&&&& End While
&&& End Sub
程序猿(@ikuqin) 专供Java程序猿的汽车:三菱伊柯丽斯,英文名eclipse
计算机的普及要从娃娃抓起
【连载】Effective C# 改善C#程序的50种方法 —— 原则9:明白ReferenceEquals(), static Equals(), instance Equals(), 和运算行符==之间的关系
当你创建你自己的类型时(不管是类还是结构),你要定义类型在什么情况下是相等的。C#提供了4个不同的方法来断定两个对象是否是相等的:public static bool ReferenceEquals& ( object left, object right );public static bool Equals& ( object left, object right );public virtual bool Equals( object right);public static bool operator==( MyClass left, MyClass right );这种语言让你可以为上面所有的4种方法创建自己的版本。But just because you can doesn't mean that you should.你或许从来不用重新定义前面两个方法。你经常遇到的是创建你自己实例的Equals()方法,来为你的类型定义语义;或者你偶而重载运==运算符,但这只是为了考虑值类型的性能。幸运的是,这4个方法的关系,当你改变其中一个时,会影响到其它的几个。是的,须要4个方法来完整的测试对象是否完全相等。但你不用担心,你可以简单的搞定它们。和C#里其它大多数复杂元素一样,这个(对相等的比较运算)也遵守这样的一个事实:C#充许你同时创建值类型和引用类型。两个引用类型的变量在引用同一个对象时,它们是相等的,就像引用到对象的ID一样。两个值类型的变量在它们的类型和内容都是相同时,它们应该是相等的。这就是为什么相等测试要这么多方法了。我们先从两个你可能从来不会修改的方法开始。Object.ReferenceEquals()在两个变量引用到同一个对象时返回true,也就是两个变量具有相同的对象ID。不管比较的类型是引用类型还是值类型的,这个方法总是检测对象ID,而不是对象内容。是的,这就是说当你测试两个值类型是否相等时,ReferenceEquals()总会返回false,即使你是比较同一个值类型对象,它也会返回false。这里有两个装箱,会在原则16中讨论。(译注:因为参数要求两个引用对象,所以用两个值类型来调用该方法,会先使两个参数都装箱,这样一来,两个引用 对象自然就不相等了。)int i = 5;int j = 5;if ( Object.ReferenceEquals( i, j ))& Console.WriteLine( "Never happens." );else& Console.WriteLine( "Always happens." );if ( Object.ReferenceEquals( i, i ))& Console.WriteLine( "Never happens." );else& Console.WriteLine( "Always happens." );你或许决不会重新定义Object.ReferenceEquals(),这是因为它已经确实实现了它自己的功能:检测两个变量的对象ID(是否相同)。第二个可能从来不会重新定义的方法是静态的Object.Equals()。这个方法在你不清楚两个参数的运行类型时什么时,检测它们是否相等。记住:C#里System.Object是一切内容的最终基类。任何时候你在比较两个变量时,它们都是System.Object的实例。因此,在不知道它们的类型时,而等式的改变又是依懒于类型的,这个方法是怎样来比较两个变量是否相等的呢?答案很简单:这个方法把比较的职责委交给了其中一个正在比较的类型。静态的Object.Equals()方法是像下面这样实现的:public static bool Equals( object left, object right ){& // Check object identity& if (left == right )&&&& // both null references handled above& if ((left == null) || (right == null))&&&& return left.Equals (right);}这个示例代码展示的两个方法是我还没有讨论的:操作符==()和实例的Equals()方法。我会详细的解释这两个,但我还没有准备结束对静态的Equals()的讨论。现在,我希望你明白,静态的Equals()是使用左边参数实例的Equals()方法来断定两个对象是否相等。与ReferenceEquals()一样,你或许从来不会重新定义静态的Object.Equals()方法,因为它已经确实的完成了它应该完成的事:在你不知道两个对象的确切类型时断定它们是否是一样的。因为静态的Equals()方法把比较委托给左边参数实例的Equals(),它就是用这一原则来处理另一个类型的。现在你应该明白为什么你从来不必重新定义静态的ReferenceEquals()以及静态的Equals()方法了吧。现在来讨论你须要重载的方法。但首先,让我们先来讨论一下这样的一个与相等相关的数学性质。你必须确保你重新定义的方法的实现要与其它程序员所期望的实现是一致的。这就是说你必须确保这样的一个数学相等性质:相等的自反性,对称性和传递性。自反性就是说一个对象是等于它自己的,不管对于什么类型,a==a总应该返回true;对称就是说,如果有a==b为真,那么b==a也必须为真;传递性就是说,如果a==b为真,且b==c也为真,那么a==c也必须为真,这就是传递性。现在是时候来讨论实例的Object.Equals()函数了,包括你应该在什么时候来重载它。当默认的行为与你的类型不一致时,你应该创建你自己的实例版本。Object.Equals()方法使用对象的ID来断定两个变量是否相等。这个默认的Object.Equals()函数的行为与Object.ReferenceEquals()确实是一样的。但是请注意,值类型是不一样的。System.ValueType并没有重载Object.Equals(),记住,System.ValueType是所有你所创建的值类型(使用关键字struct创建)的基类。两个值类型的变量相等,如果它们的类型和内容都是一样的。ValueType.Equals()实现了这一行为。不幸的是,ValueType.Equals()并不是一个高效的实现。ValueType.Equals()是所有值类型的基类(译注:这里是说这个方法在基类上进行比较)。为了提供正确的行为,它必须比较派生类的所有成员变量,而且是在不知道派生类的类型的情况下。在C#里,这就意味着要使用反射。正如你将会在原则44里看到的,对反射而言它们有太多的不利之处,特别是在以性能为目标的时候。相等是在应用中经常调用的基础结构之一,因此性能应该是值得考虑的目标。在大多数情况下,你可以为你的任何值类型重载一个快得多的Equals()。简单的推荐一下:在你创建一个值类型时,总是重载ValueType.Equals()。你应该重载实例的Equals()函数,仅当你想改变一个引用类型所定义的(Equals()的)语义时。.Net结构类库中大量的类是使用值类型的语义来代替引用类型的语义。两个字符中对象相等,如果它们包含相同的内容。两个DataRowViewc对象相等,如果它们引用到同一个DataRow。关键就是,如果你的类型须要遵从值类型的语义(比较内容)而不是引用类型的语义(比较对象ID)时,你应该自己重载实例的Object.Equals()方法。好了,现在你知道什么时候应该重载你自己的Object.Equals(),你应该明白怎样来实现它。值类型的比较关系有很多装箱的实现,装箱在原则17中讨论。对于用户类型,你的实例方法须要遵从原先定义行为(译注:前面的数学相等性质),从而避免你的用户在使用你的类时发生一些意想不到的行为。这有一个标准的模式:public class Foo{& public override bool Equals( object right )& {&&& // check null:&&& // the this pointer is never null in C# methods.&&& if (right == null)&&&&&&&& if (object.ReferenceEquals( this, right ))&&&&&&&& // Discussed below.&&& if (this.GetType() != right.GetType())&&&&&&&& // Compare this type's contents here:&&& return CompareFooMembers(&&&&& this, right as Foo );& }}首先,Equals()决不应该抛出异常,这感觉不大好。两个变量要么相等,要么不等;没有其它失败的余地。直接为所有的失败返回false,例如null引用或者错误参数。现在,让我们来深入的讨论这个方法的细节,这样你会明白为什么每个检测为什么会在那里,以及那些方法可以省略。第一个检测断定右边的对象是否为null,这样的引用上没有方法检测,在C#里,这决不可能为null。在你调用任何一个引用到null的实例的方法之前,CLR可能抛出异常。下一步的检测来断定两个对象的引用是否是一样的,检测对象ID就行了。这是一个高效的检测,并且相等的对象ID来保证相同的内容。接下来的检测来断定两个对象是否是同样的数据类型。这个步骤是很重要的,首先,应该注意到它并不一定是Foo类型,它调用了this.GetType(),这个实际的类型可能是从Foo类派生的。其次,这里的代码在比较前检测了对象的确切类型。这并不能充分保证你可以把右边的参数转化成当前的类型。这个测试会产生两个细微的BUG。考虑下面这个简单继承层次关系的例子:public class B{& public override bool Equals( object right )& {&&& // check null:&&& if (right == null)&&&&&&&& // Check reference equality:&&& if (object.ReferenceEquals( this, right ))&&&&&&&& // Problems here, discussed below.&&& B rightAsB = right as B;&&& if (rightAsB == null)&&&&&&&& return CompareBMembers( this, rightAsB );& }}public class D : B{& // etc.& public override bool Equals( object right )& {&&& // check null:&&& if (right == null)&&&&&&&& if (object.ReferenceEquals( this, right ))&&&&&&&& // Problems here.&&& D rightAsD = right as D;&&& if (rightAsD == null)&&&&&&&& if (base.Equals( rightAsD ) == false)&&&&&&&& return CompareDMembers( this, rightAsD );& }}//Test:B baseObject = new B();D derivedObject = new D();// Comparison 1.if (baseObject.Equals(derivedObject))& Console.WriteLine( "Equals" );else& Console.WriteLine( "Not Equal" );// Comparison 2.if (derivedObject.Equals(baseObject))& Console.WriteLine( "Equals" );else& Console.WriteLine( "Not Equal" );
在任何可能的情况下,你都希望要么看到两个Equals或者两个Not Equal。因为一些错误,这并不是先前代码的情形。这里的第二个比较决不会返回true。这里的基类,类型B,决不可能转化为D。然而,第一个比较可能返回true。派生类,类型D,可以隐式的转化为类型B。如果右边参数以B类型展示的成员与左边参数以B类型展示的成员是同等的,B.Equals()就认为两个对象是相等的。你将破坏相等的对称性。这一架构被破坏是因为自动实现了在继承关系中隐式的上下转化。当你这样写时,类型D被隐式的转化为B类型:baseObject.Equals( derived )如果baseObject.Equals()在它自己所定义的成员相等时,就断定两个对象是相等的。另一方面,当你这样写时,类型B不能转化为D类型,derivedObject.Equals( base )
B对象不能转化为D对象,derivedObject.Equals()方法总是返回false。如果你不确切的检测对象的类型,你可能一不小心就陷入这样的窘境,比较对象的顺序成为一个问题。当你重载Equals()时,这里还有另外一个可行的方法。你应该调用基类的System.Object或者System.ValueType的比较方法,除非基类没有实现它。前面的代码提供了一个示例。类型D调用基类,类型B,定义的Equals()方法,然而,类B没有调用baseObject.Equals()。它调用了Systme.Object里定义的那个版本,就是当两个参数引用到同一个对象时它返回true。这并不是你想要的,或者你是还没有在第一个类里的写你自己的方法。原则是不管什么时候,在创建一个值类型时重载Equals()方法,并且你不想让引用类型遵从默认引用类型的语义时也重载Equals(),就像System.Object定义的那样。当你写你自己的Equals()时,遵从要点里实现的内容。重载Equals()就意味着你应该重写GetHashCode(),详情参见原则10。解决了三个,最后一个:操作符==(),任何时候你创建一个值类型,重新定义操作符==()。原因和实例的Equals()是完全一样的。默认的版本使用的是引用的比较来比较两个值类型。效率远不及你自己任意实现的一个,所以,你自己写。当你比较两个值类型时,遵从原则17里的建议来避免装箱。注意,我并不是说不管你是否重载了实例的Equals(),都还要必须重载操作符==()。我是说在你创建值类型时才重载操作符==()。.Net框架里的类还是期望引用类型的==操作符还是保留引用类型的语义。C#给了你4种方法来检测相等性,但你只须要考虑为其中两个提供你自己的方法。你决不应该重载静态的Object.ReferenceEquals()和静态的Object.Equals(),因为它们提供了正确的检测,忽略运行时类型。你应该为了更好的性能而总是为值类型实例提供重载的Equals()方法和操作符==()。当你希望引用类型的相等与对象ID的相等不同时,你应该重载引用类型实例的Equals()。简单,不是吗?
【连载】Effective C# 改善C#程序的50种方法 —— 原则8:确保0对于值类型数据是有效的
.Net系统默认所有的对象初始化时都为0。这并没有提供一个方法来预防其他程序员创建的值类型数据的实例在初始化是都是0。请让你的数据类型默认值也是0。一个特殊情况是在枚举类型数据中。决不要创建一个不包括0在内的枚举类型。所有的枚举类型都是从System.ValueType派生的。枚举类型的值是从0开始的,但你可以改变这一行为:public enum Planet{& // Explicitly assign values.& // Default starts at 0 otherwise.& Mercury = 1,& Venus = 2,& Earth = 3,& Mars = 4,& Jupiter = 5,& Saturn = 6,& Neptune = 7,& Uranus = 8,& Pluto = 9}Planet sphere = new Planet();sphere此时的值就是0,而这并不是一个有效的值。枚举类型的取值限制在所有列举的值中,任何依懒这一(普通)事实的代码都将无法工作。当你为你的枚举类型创建你自己的取值时,请确保0是当中的一个。如果你的枚举类型采用的是以位(bit)模式,把0定义为其它属性不存在时的取值。按照现在的情况,你迫使用户必须精确的初始化值:Planet sphere = Planet.M这将使包含(Planet)这一类型的其它类型很难创建:public struct ObservationData{& Planet&& _whichP //what am I looking at?& Double& _ // perceived brightness.}创建一个新ObservationData实例的用户会创建一个不合法的Planet成员:ObservationData d = new ObservationData();最后创建的ObservationData的成员_magnitude的值是0,这是合理的。但_whichPlanet却是无效的。你须要让0也是有效的(状态)。如果可能,选择把0做为一个最好的默认。Planet枚举类型没有一个明确的默认值,无论用户是否任意的选择一些行星,这都不会给人留下好的感觉。当你陷入这样的情况时,使用0做为一个非初始化的值,这也是在后面可以更新的:public enum Planet{& None = 0,& Mercury = 1,& Venus = 2,& Earth = 3,& Mars = 4,& Jupiter = 5,& Saturn = 6,& Neptune = 7,& Uranus = 8,& Pluto = 9}Planet sphere = new Planet();此时,sphere具有一个(默认)值None。为Planet枚举类型添加的这个非初始化的默认值,对ObservationData结构。最新创建的ObservationData对象的目标上具有None和一个数值0。添加一个清晰的构造函数让用户为你的类型的所有字段明白的初始化:public struct ObservationData{& Planet&& _whichP //what am I looking at?& Double& _ // perceived brightness.& ObservationData( Planet target,&&& Double mag )& {&&& _whichPlanet =&&& _magnitude =& }}
但请记住,默认的构造函数还是可访问的,而且是结构的部份。用户还是可以创建一个系统初始化的变量,而你无法阻止它。在结束枚举类型转而讨论其它类型之前,你须要明白几个用于标记的特殊枚举类型规则。枚举类型在使用Flags特性时,必须把None的值设置为0:[Flags]public enum Styles{& None = 0,& Flat = 1,& Sunken = 2,& Raised = 4,}很多开发人员使用枚举标记和位运算操作AND进行运行,0值会与位标记产生严重的问题。下面这个实验如果Flat的值是0时,是决不会成功的:if ( ( flag & Styles.Flat ) != 0 ) // Never true if Flat == 0.& DoFlatThings( );如果你遇到Flags,确保0对它来说是有效的,并且这就着:&对所有缺少的标记。&另一个很常见的初始化问题就是值类型中包含了引用类型。字符串是一个常见的例子:public struct LogMessage{& private int _ErrL& private string _}LogMessage MyMessage = new LogMessage( );MyMessage包含了一个_msg为null的引用字段。这里没有办法强行使用另一个不同的初始化方法,但你利用属性来局部化这个问题。你创建一个属性向所用的用户暴露_Msg的值。添加一个业务逻辑,使得当字符串为null引用是,用空 串来取而代之:public struct LogMessage{& private int _ErrL& private string _& public string Message& {&&& get&&& {&&&&& return (_msg != null ) ?&&&&&&& _msg : string.E&&& }&&& set&&& {&&&&& _msg =&&& }& }}(译注:我个人觉得这里违反了原则一。当对两个实例进行赋值COPY时,会出现,你明明使用了a=b的运行,但实际上a!=b的结果。可以参见原则1。)在你自己的数据类型内部,你应该添加这样的一个属性。做了这样的局部处理后,null引用在某一位置做了验证。当调用是在你的程序集内时,Message的访问器基本上是可以很好的内联的。你将会取得高效低错的代码。系统为所有的值类型数据初始化为0,而没有办法防止用户在创建一个值类型实例时,给所有的值类型都赋值为0。如果可能,把0设置为自然的默认值。特殊情况下,使用Flags特性的枚举类型必须确保0是所有缺省标记的值。
微软讽刺谷歌Google Apps广告 Googlighting (中英)
站长在关注

我要回帖

更多关于 初学者买什么吉他 的文章

 

随机推荐