1.MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
2.Evalï¼ï¼åBindï¼ï¼çåºå«
3.七爪源码:C# 中的扩展方法
4.C#-Linq源码解析之DefaultIfEmpty
5.è°ç»ç®åä»ç»ä¸ä¸C#ï¼
MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
闲来无事,偶然接触到了MASA Framework,此框架是MASA Stack系列中专门用于构建web系统的开源框架。通过在几个小型项目中的应用,我发现它确实拥有诸多优点。为深入理解其内部结构和设计思路,grub2 源码修改我决定详细阅读MASA Framework的源代码,并记录整个阅读过程。如有任何错误或疑问,还请各位指正。
MASA Framework是一个功能全面且易于扩展的框架,主要由三个部分组成:BuildingBlocks(抽象层)、Contrib(BuildingBlocks的实现)以及Utils(工具库)。官方将BuildingBlocks称为构建块,实际上,合成游戏app源码这个层将日常开发中频繁使用到的功能抽象出来,如多租户、多语言、仓储、配置中心等,形成易于替换的接口,大大提高了框架的灵活性和可扩展性。
MASA Framework包含个主要模块,几乎涵盖了日常开发所需的所有组件,从基础服务到高级功能应有尽有。这些模块协同工作,共同构建了一个强大且功能丰富的框架。
让我们从MASA Framework的核心设计——构建工厂(MasaFactory)开始探讨。构建工厂在框架中起着至关重要的则用源码定点加法作用,它负责通过配置选项来创建不同实现的实例。在实际项目中,构建工厂设计用于解决接口具有多种实现时的依赖注入问题,比如在面对多实现的场景时,如何优雅地注入并使用特定的实现类。以下是构建工厂解决多实现问题的具体步骤:
首先,通过下载MASA Framework的源码(地址:github.com/masastack/MA...)进行研究。我们首先关注的是Masa.BuildingBlocks.Data.Contracts类库的设计。MASA Framework的构建工厂通过选项配置,允许为接口的每个实现类指定一个简短的名称。根据传入的不同名称,构建工厂类的Create方法能够创建对应的实例。
通过使用MASA Framework的构建工厂,我们能够轻松地创建与特定名称对应的查看源码没有颜色面单消息转换类,而无需依赖于IEnumerable集合进行复杂的筛选。这种方法在实现多实现场景时明显更加直观且高效。
以物流面单申请为例,不同销售订单对应不同的商家店铺,而每个商家店铺可能选择不同的物流商。利用MASA Framework构建工厂实现不同物流商的面单申请,不仅简化了开发过程,而且在使用层面保持了无感的效果。
总结而言,MASA Framework提供了强大的构建工厂设计,以解决多实现接口的依赖注入问题,简化了开发流程。这个设计不仅限于构建工厂模块,其他模块同样采用了类似的无入侵改源码设计理念,允许用户根据需要替换官方实现或结合自定义实现,以适应不同场景和需求。
MASA Framework的其他模块同样采用了构建工厂的设计,用户既可以替换官方实现,也可以在程序内同时共存官方实现和自定义实现。例如,Service Caller模块不仅支持使用dapr的服务调用,还提供了HTTP服务调用等选项。
Evalï¼ï¼åBindï¼ï¼çåºå«
Eval(
"
")åBind(
"
")ãè¿ä¸¤ç§ä¸ä¸ªååç»å®ï¼ä¸ä¸ªååç»å®
bindæ¯ååç»å®,ä½éæ°æ®æºå¯æ´æ¹æè½ç¨
ASP.NET
2.0æ¹åäºæ¨¡æ¿ä¸çæ°æ®ç»å®æä½ï¼æv1.xä¸çæ°æ®ç»å®è¯æ³DataBinder.Eval(Container.DataItem,
fieldname)ç®å为Eval(fieldname)ãEvalæ¹æ³ä¸DataBinder.Evalä¸æ ·å¯ä»¥æ¥åä¸ä¸ªå¯éçæ ¼å¼åå符串åæ°ã缩ççEvalè¯æ³ä¸DataBinder.Evalçä¸åç¹å¨äºï¼Evalä¼æ ¹æ®æè¿ç容å¨å¯¹è±¡ï¼ä¾å¦DataListItemï¼çDataItemå±æ§æ¥èªå¨å°è§£æå段ï¼èDataBinder.Evaléè¦ä½¿ç¨åæ°æ¥æå®å®¹å¨ãç±äºè¿ä¸ªåå ï¼Evalåªè½å¨æ°æ®ç»å®æ§ä»¶ç模æ¿ä¸ä½¿ç¨ï¼èä¸è½ç¨äºPageï¼é¡µé¢ï¼å±ãå½ç¶ï¼ASP.NET
2.0页é¢ä¸ä»ç¶æ¯æDataBinder.Evalï¼ä½ å¯ä»¥å¨ä¸æ¯æç®åçEvalè¯æ³çç¯å¢ä¸ä½¿ç¨å®ã
ä¸é¢çä¾åæ¼ç¤ºäºå¦ä½ä½¿ç¨æ°çç®åçEvalæ°æ®ç»å®è¯æ³ç»å®å°DataListæ°æ®é¡¹æ¨¡æ¿ï¼ItemTemplateï¼ä¸çImageãLabelåHyperLinkæ§ä»¶ã
ï¼asp:DataList
ID=
"DataList1
"
RepeatColumns=
"5
"
Width=
"
"
runat=
"server
"
DataSourceID=
"ObjectDataSource1
"ï¼
ãï¼ItemTemplateï¼
ããï¼asp:HyperLink
ID=
"HyperLink1
"
runat=
"server
"
NavigateUrl=
'ï¼%#
Eval(
"PhotoID
",
"PhotoFormViewPlain.aspx?ID={ 0}
")
%ï¼
'ï¼
ããï¼asp:Image
ID=
"Image1
"
Runat=
"server
"
ImageUrl=
'ï¼%#
Eval(
"FileName
",
"images/thumbs/{ 0}
")
%ï¼
'
/ï¼ï¼/asp:HyperLinkï¼
ããï¼asp:Label
ID=
"CaptionLabel
"
runat=
"server
"
Text=
'ï¼%#
Eval(
"Caption
")
%ï¼
'
/ï¼
ãï¼/ItemTemplateï¼
ï¼/asp:DataListï¼ï¼br
/ï¼
ï¼asp:ObjectDataSource
ID=
"ObjectDataSource1
"
runat=
"server
"
TypeName=
"DataComponentTableAdapters.PhotosTableAdapter
"
SelectMethod=
"GetPhotosForAlbum
"ï¼
ããæ°æ®ç»å®ä¹å¯ä»¥ä½ä¸ºæ§ä»¶ç主é¢å®ä¹ï¼theme
definitionï¼çä¸é¨åï¼è¿æ ·æ们就å¯ä»¥éè¿æ¹å主é¢æ¥éæå°æ¹å模æ¿åæ§ä»¶çå¸å±åå¤è§ãä½æ¯Themeï¼ä¸»é¢ï¼æ¨¡æ¿ä¸åªè½ä½¿ç¨Evalï¼æè åé¢è®¨è®ºçBindï¼ãç»å®å°ä»»æçç¨æ·ä»£ç æ¯è¢«ç¦æ¢çã
--------å ³æ³¨ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼ï¼
常è§ç»å®æ ¼å¼ï¼ä¸è¿ä»ä»¬çæ§è½æåºå«ã
<%#
DataBinder.Eval(Container.DataItem,
"[n]")
%>
<%#
DataBinder.Eval(Container.DataItem,
"ColumnName")
%>
<%#
DataBinder.Eval(Container.DataItem,
"ColumnName",
null)
%>
<%#
DataBinder.Eval(Container,
"DataItem.ColumnName",
null)
%>
<%#
((DataRowView)Container.DataItem)["ColumnName"]
%>
<%#
((DataRowView)Container.DataItem).Row["ColumnName"]
%>
<%#
((DataRowView)Container.DataItem)["adtitle"]
%>
<%#
((DataRowView)Container.DataItem)[n]
%>
<%#
((DbDataRecord)Container.DataItem)[0]
%>
<%#
(((èªå®ä¹ç±»å)Container.DataItem)).å±æ§.ToString()
%>ï¼å¦æå±æ§ä¸ºå符串类åå°±ä¸ç¨ToString()äºï¼
ä¸é¢è¿ä¸ä¸ªæ§è½æ好ã
//æ¾ç¤ºäºä½å°æ°
//<%#
DataBinder.Eval(Container.DataItem,
"UnitPrice",
"${ 0:F2}")
%>
//{ 0:G}代表æ¾ç¤ºTrueæFalse
//
//
<asp:Image
Width=""
Height=""
Border="0"
runat="server"
//
AlternateText='<%#
DataBinder.Eval(Container.DataItem,
"Discontinued",
"{ 0:G}")
%>'
//
ImageUrl='<%#
DataBinder.Eval(Container.DataItem,
"Discontinued",
"~/images/{ 0:G}.gif")
%>'
/>
//
//转æ¢ç±»å
((string)DataBinder.Eval(Container,
"DataItem.P_SHIP_TIME_SBM8")).Substring(4,4)
{ 0:d}
æ¥æåªæ¾ç¤ºå¹´ææ¥
{ 0:yyyy-mm-dd}
ææ ¼å¼æ¾ç¤ºå¹´ææ¥
{ 0:c}
è´§å¸æ ·å¼
---------------------------------------------------------
å¨æ¬ç« åé¢ï¼æ们å¨æ¨¡æ¿ä¸ä¸æä¸éå°è¿è¡¨è¾¾å¼ä»¥åEvalæ¹æ³ãEvalæ¹æ³æ¯ä¸ç§å®å¶è¿ç®ç¬¦ï¼å¨æ°æ®ç»å®è¡¨è¾¾å¼ç¨æ¥æ¹æ³æç»å®çæ°æ®é¡¹ä¸çå ¬å ±å±æ§ãåææç¨çEvalæ¹æ³æ¯ä¸ä¸ªASP.NET
2.0ææ¯æçç¹å¾ï¼å¦æå¨ASP.NET
1.xåºç¨ç¨åºä¸ä½¿ç¨ï¼åä¼äº§çä¸ä¸ªç¼è¯é误ã对äºASP.NETçææçæ¬ï¼æ们å¯ä»¥ä½¿ç¨ä¸ä¸ªå¨åè½ä¸ç¸å½çæ¹æ³ï¼è¯¥æ¹æ³ä¹ç§°ä¸ºEvalï¼ä½æ¯æ¥èªå¦ä¸ä¸ªç±»ââDataBinderã
éè¦æ示ï¼
éè¿Evalæ¹æ³(尽管å®æ¥èªDataBinderæPageç±»)ï¼å¯ä»¥è®¿é®æç»å®çæ°æ®é¡¹ä¸çå ¬å ±å±æ§ã让ææ¾æ¸ ä¸ä¸å ¬å ±å±æ§å¨è¯¥ä¸ä¸æä¸æä»ä¹ï¼ä»¥å为ä»ä¹æåææå®ä»¬å«åå±æ§ãä»»ä½ä¸ä¸ªå®ç°äºIEnumerableæ¥å£çç±»é½å¯ä»¥ç»å®å°ä¸ä¸ªæ§ä»¶ãå®é çç±»å表å½ç¶å æ¬DataTable(å ¶ä¸ä¸ä¸ªæ°æ®é¡¹å¨é»è¾ä¸å¯¹åºäºè¡¨è®°å½)ï¼ä½æ¯å®è¿å æ¬å®å¶éå(å ¶ä¸ä¸ä¸ªæ°æ®é¡¹å¯¹åºäºç»å®ç±»çä¸ä¸ªå®ä¾ã)Evalæ¹æ³æç»ä¼æ¥è¯¢è¯¥æ°æ®é¡¹å¯¹è±¡ä»¥å¾å°å®çå±æ§éã表示ä¸ä¸ªè¡¨è®°å½ç对象å°è¿åå®çåæ述符ï¼å ¶ä»å¯¹è±¡å°è¿åå®ä»¬çå ¬å ±å±æ§éã
DataBinderç±»æ¯ææ°æ®ç»å®è¡¨è¾¾å¼ççæå解æãå®çéæéè½½æ¹æ³Evalç¹å«éè¦ã该æ¹æ³ä½¿ç¨åå°æºå¶æ¥è§£æå计ç®ä¸ä¸ªè¿è¡æ¶å¯¹è±¡ç表达å¼ãEvalæ¹æ³ç客æ·å æ¬RADå·¥å ·ï¼è¯¸å¦Microsoft
Visual
Studio
.NET设计å¨åWebæ§ä»¶ï¼å®ä»¬ä»¥å£°æçæ¹å¼è°ç¨è¯¥æ¹æ³ç¨å¨ææ¹åçå¼å¡«å è¿äºå±æ§ã
1.
Evalæ¹æ³
DataBinder.Evalæ¹æ³çè¯æ³å¦ä¸ï¼
<%#
DataBinder.Eval(Container.DataItem,
expression)
%>
ä¸è¿°ä»£ç çæä¸çç¥äºç¬¬3个å¯éåæ°ã该åæ°æ¯ä¸ä¸ªå符串ï¼å å«æç»å®å¼çæ ¼å¼éæ©ãContainer.DataItem表达å¼å¼ç¨å¯¹è¯¥è¡¨è¾¾å¼è¿è¡è®¡ç®ç对象ã该表达å¼é常æ¯ä¸ä¸ªå符串ï¼è¡¨ç¤ºæ°æ®é¡¹å¯¹è±¡ä¸è¦è®¿é®çå段çå称ãå®å¯ä»¥æ¯ä¸ä¸ªå æ¬ç´¢å¼åå±æ§åç表达å¼ãDataItemå±æ§è¡¨ç¤ºå½å容å¨ä¸ä¸æä¸ç对象ã容å¨é常å³å°çæç该æ°æ®é¡¹å¯¹è±¡(ä¾å¦ï¼DataGridItem对象)çå½åå®ä¾ã
åé¢æ示ç代ç é常éå¤åºç°ï¼èä¸ä»¥ç¸åçå½¢å¼ãåªæ表达å¼åæ ¼å¼å符串å¨é¡µä¸é¡µä¹é´ä¼ææååã
2.
æ´ç®æ´çEval
DataBinder.Evalçåå§è¯æ³å¨ASP.NET
2.0ä¸å¯ä»¥è¢«ç®åï¼è¿ä¸ç¹æ们å¨åé¢çRepeater示ä¾ä¸å·²ç»çå°ãå¨ASP.NET
2.0ä¸ï¼åªè¦å¨ASP.NET
1.xä¸æ¥åå¦ä¸è¡¨è¾¾å¼çå°æ¹ï¼
<%#
DataBinder.Eval(Container.DataItem,
expression)
%>
å°±å¯ä»¥ä½¿ç¨ï¼
<%#
Eval(expression)
%>
ä¸ç¨è¯´ï¼ASP.NET
2.0ä¹æ¯å®å ¨æ¯æDataBinder对象çã
å¨<%#
...
%>çå®ç¬¦å åºç°çä»»ä½ä»£ç ï¼é½ä¼å¾å°ASP.NETè¿è¡åºçç¹æ®å¤çã让æ们ç®ååæä¸ä¸è¯¥ä»£ç ä¼åçä»ä¹ãç¼è¯è¯¥é¡µé¢æ¶ï¼Evalè°ç¨ä½ä¸ºä¸ä¸ªç¬ç«çè°ç¨æå ¥è¯¥é¡µé¢çæºä»£ç ä¸ãå¦ä¸ä»£ç 说æäºä¼åçä»ä¹ï¼
object
o
=
Eval("lastname");
string
result
=
Convert.ToString(o);
该è°ç¨çç»æ被转æ¢ä¸ºä¸ä¸ªå符串ï¼å¹¶ä»ç»ä¸ä¸ªæ°æ®ç»å®çæåæ§ä»¶ââDataBoundLiteralControlç±»çä¸ä¸ªå®ä¾ãç¶èææ°æ®ç»å®çæåæå ¥è¯¥é¡µçæ§ä»¶æ ä¸ã
å¨ASP.NET
2.0ä¸ï¼TemplateControlç±»(Pageçç¶ç±»)å®é ä¸æ°å¢äºä¸ä¸ªå为Evalçåä¿æ¤ç(ä½ä¸æ¯èæç)æ¹æ³ãå¦ä¸ä¼ªä»£ç 说æ该æ¹æ³çå·¥ä½æºå¶ï¼
protected
object
Eval(string
expression)
{
if
(Page
==
null)
throw
new
InvalidOperationException(â¦);
return
DataBinder.Eval(Page.GetDataItem(),
expression);
}
æ£å¦æ们å¯ä»¥çå°çï¼Evalæ¯å»ºç«å¨DataBinder.Evalæ¹æ³ä¹ä¸çä¸ä¸ªç®åå è£ ãDataBinder.Evalæ¹æ³ä½¿ç¨å½å容å¨çæ°æ®é¡¹è°ç¨ãé常ææ¾ï¼å½å容å¨çæ°æ®å¨æ°æ®ç»å®æä½ä¹å¤ä¸ºnullââå³ï¼å¨è°ç¨DataBindä¹åçè°ç¨æ ä¸ãè¿ä¸äºå®å¼èµ·äºEvalåDataBinder.Evalä¹é´çä¸ä¸ªå ³é®åºå«ã
éè¦æ示ï¼
TemplateControlçEvalæ¯ä¸ä¸ªæ°æ®ç»å®æ¹æ³ï¼å¨ä¸ä¸ªæ°æ®ç»å®æä½ä¸åªè½å¨ä¸ä¸ªæ°æ®ç»å®æ§ä»¶çä¸ä¸æä¸ä½¿ç¨ãç¸åï¼DataBinder.Evalæ¯ä¸ä¸ªå®å ¨æççæ¹æ³ï¼å¯ä»¥å¨ç¨åºä¸çä»»ä½å°æ¹ä½¿ç¨ãæ们é常å¨å®å¶çæ°æ®ç»å®æ§ä»¶çå®ç°ä¸ä½¿ç¨å®ãæå°å¨æ¬ä¹¦çå§å¦¹ç¯ãProgramming
Microsoft
ASP.NET
2.0
Applications:
Advanced
Topics
ãä¸ä»ç»å®ã
3.
è·å¾é»è®¤çæ°æ®é¡¹
åé¢ç»åºç说æ页é¢çEvalæ¹æ³çè¡ä¸ºç伪ç ï¼å±ç¤ºäºPageç±»çGetDataItemæ¹æ³ãå®æ¯ä»ä¹ï¼å¦åæè¿°ï¼è¿ä¸ç®åè¯æ³éç¨ä¸ä¸ªé»è®¤çContainer.DataItemä¸ä¸æ对象ãGetDataItemåªä¸è¿æ¯è¿å该对象çå½æ°ã
æ´ç²¾ç¡®å°è®²ï¼GetDataItemæ¯è·è¸ªé¡µé¢çå½åç»å®ä¸ä¸æçåºäºæ çæºå¶çç»ç¹ã该æ§ä»¶æ ä¸çæ¯ä¸ªæ§ä»¶å¨è°ç¨åDataBindæ¹æ³æ¶åå ¥è¯¥æ ä¸ãDataBindæ¹æ³è¿åæ¶ï¼æ§ä»¶ä»è¯¥æ ä¸å¼¹åºãå¦ææ æ¯ç©ºçï¼å¹¶ä¸ä¼å¾ä»¥ç¼ç¨çæ¹å¼è°ç¨Evalæ¹æ³ï¼åGetDataItemæåºä¸ä¸ªæ æçæä½å¼å¸¸ãæ»ä¹ï¼æ们åªè½å¨æ¨¡æ¿ä¸ä½¿ç¨Evalç®åæä½ï¼å¦æéè¦å¨ä»£ç ä¸çä»»ä½å ¶ä»å°æ¹è®¿é®ä¸ä¸ªæ°æ®é¡¹çå±æ§ï¼åå©ç¨DataBinder.Evalæ¹æ³ï¼å¹¶æ¾å¼å°æåºæ°æ®é¡¹å¯¹è±¡ã
æ示
å¦åæè¿°ï¼é常åªæå¨å®å¶çæ°æ®ç»å®æ§ä»¶ç代ç ä¸æéè¦ç´æ¥è°ç¨DataBinder.Evalæ¹æ³ã(æå¨Programming
Microsoft
ASP.NET
2.0
Applications:
Advanced
Topicsä¸ä»ç»äºå®å¶æ§ä»¶ã)ç¶èï¼å¦æåçè¿ç§æ åµï¼å¯è½éè¦éè¿è°ç¨DataBinder.GetPropertyValueæ¹æ³æ¥ä¿åå 个å é¨è°ç¨åCPUå¨æãæç»ï¼è¿å®å ¨æ¯ç±DataBinder.Evalå®æçã
七爪源码:C# 中的扩展方法
扩展方法在C#中允许将方法“添加”到现有类型,无需创建新的派生类型或修改原始类型。扩展方法实质上是静态方法,但其调用方式如同实例方法,这在C#、F#和Visual Basic的客户端代码中没有明显区别。常见的扩展方法包括向System.Collections.IEnumerable和System.Collections.Generic.IEnumerable添加查询功能的LINQ标准查询运算符。
例如,使用System.Linq指令将标准查询运算符引入范围后,可以对整数数组调用OrderBy方法进行排序。扩展方法定义为静态方法,使用实例方法语法调用,第一个参数指定方法操作的类型,并带有this修饰符。扩展方法的范围取决于是否使用using指令显式导入命名空间。
以下示例展示了为System.String类定义的扩展方法,WordCount方法,定义在非嵌套、非泛型的静态类中。使用using指令即可进入范围并调用该方法。调用扩展方法时使用实例方法语法,编译器将生成中间语言(IL)以对静态方法进行调用。
扩展方法允许在代码中调用,MyExtensions类和WordCount方法都是静态的,可以通过其他静态成员访问。WordCount方法可以像其他静态方法一样被调用。
扩展方法的调用在编译时进行。当编译器遇到方法调用时,首先在类型的实例方法中查找匹配项,如果没有找到,则搜索该类型定义的任何扩展方法,并绑定到第一个找到的扩展方法。如果一个类型有一个名为Process(int i)的方法,并且有一个具有相同签名的扩展方法,则编译器将始终绑定到实例方法。
使用扩展方法的常见模式包括:
1. 收集功能:过去,为给定类型创建实现System.Collections.Generic.IEnumerable接口并包含该类型集合功能的“集合类”是常见的做法。然而,通过使用System.Collections.Generic.IEnumerable上的扩展,可以实现相同功能,提供从任何集合调用功能的灵活性,如System.Array或System.Collections.Generic.List上的实现。
2. 特定层的功能:在使用洋葱架构或其他分层应用程序设计时,域实体或数据传输对象通常不包含功能或仅包含适用于所有层的最小功能。扩展方法可用于为每个应用程序层添加特定功能,无需引入其他层不需要或不需要的方法。
C#-Linq源码解析之DefaultIfEmpty
在Dotnet开发过程中,`DefaultIfEmpty`作为Enumerable的扩展方法,广为使用。本文简要解析该方法的关键源码,旨在帮助大家更好地掌握并运用此方法。
`DefaultIfEmpty`用于返回一个`IEnumerable`,如果输入序列为空,则返回一个仅包含默认值的单例集合。
比如有一个空集合,通过`DefaultIfEmpty`方法,我们可以向其添加一个默认元素。
方法的核心在于使用延迟执行实现。Enumerable是延迟加载的,每次访问时才取值,因此在返回数据时需要使用`yield`。
实现过程需利用`GetEnumerator()`来判断序列是否有元素。
`DefaultIfEmpty`源码体现了其高效性与灵活性,可处理空集合,避免错误显示。
使用`DefaultIfEmpty`可使代码更加优雅,简化逻辑处理。
若发现更好的使用技巧,欢迎交流分享。本文旨在提供基础理解,希望对大家有所帮助。
技术交流群:联系管理员微信加入(备注:进群);管理员微信:mm;关注公众号:DotNet编程大全
è°ç»ç®åä»ç»ä¸ä¸C#ï¼
C#(读å "C sharp"ï¼ä¸æè¯é³âå¤æ®â)æ¯å¾®è½¯å ¬å¸åå¸çä¸ç§é¢å对象çãè¿è¡äº.NET Frameworkä¹ä¸çé«çº§ç¨åºè®¾è®¡è¯è¨,并å®äºå¨å¾®è½¯èä¸å¼åè 论å(PDC)ä¸ç»å°äº®ç¸.C#æ¯å¾®è½¯å ¬å¸ç 究åAnders Hejlsbergçææ°ææ.C#çèµ·æ¥ä¸Javaæçæ人çç¸ä¼¼;å®å æ¬äºè¯¸å¦åä¸ç»§æ¿,çé¢,ä¸Javaå ä¹åæ ·çè¯æ³,åç¼è¯æä¸é´ä»£ç åè¿è¡çè¿ç¨.ä½æ¯C#ä¸Javaæçææ¾çä¸å,å®åé´äºDelphiçä¸ä¸ªç¹ç¹,ä¸COM(ç»ä»¶å¯¹è±¡æ¨¡å)æ¯ç´æ¥éæç,èä¸å®æ¯å¾®è½¯å ¬å¸.NET windowsç½ç»æ¡æ¶ç主è§.
å¨æ¬æä¸,æå°èå¯å建ä¸ç§æ°è®¡ç®æºè¯è¨çä¸è¬å¨æº,并å°ç¹å«æææ¯ä»ä¹åå 导è´äºC#çåºç°.ç¶åæå°ä»ç»C#åå®ä¸Java,c,c++çç¸ä¼¼ä¹å¤.å ¶æ¬¡æå°è®¨è®ºä¸äºåå¨äºJavaåC#ä¹é´çé«å±æ¬¡ç,ååºç¡çå·®å«.æå°ä»¥è¡¡éå¨ç¨å¤ç§è¯è¨å¼å大ååºç¨ç¨åºçæ¶åæéçç¥è¯(æè 对è¿ç§ç¥è¯ç缺ä¹ç¨åº¦)æ¥ç»ææ¬æ,èè¿æ£æ¯.NETåC#çä¸ä¸ªä¸»è¦æç¥.ç®å,C#å.NETè¿åªè½ä»¥C#è¯è¨è§å,以åWindows çä¸ä¸ª"dé¢è§çæ¬",è¿æMSDNä¸è¿ éå¢å¤çææ¡£éåçå½¢å¼è·å¾(è¿æ²¡ææç»å®å).
微软c#è¯è¨å®ä¹ä¸»è¦æ¯ä»CåC++继æ¿èæ¥ç,èä¸è¯è¨ä¸ç许å¤å ç´ ä¹åæ äºè¿ä¸ç¹.C#å¨è®¾è®¡è ä»C++继æ¿çå¯éé项æ¹é¢æ¯Javaè¦å¹¿æ³ä¸äº(æ¯å¦è¯´structs),å®è¿å¢å äºèªå·±æ°çç¹ç¹(æ¯æ¹è¯´æºä»£ç çæ¬å®ä¹).ä½å®è¿å¤ªä¸æç,ä¸å¯è½æ¤å®Java.C#è¿éè¦è¿åæä¸ç§å¼åè è½å¤æ¥ååéç¨çè¯è¨.è微软å½å为å®çè¿ç§æ°è¯è¨å¤§é 声å¿ä¹æ¯å¼å¾æ³¨æç.ç®å大家çååºæ¯:"è¿æ¯å¯¹Javaçåå»."
C#æ´è±¡Javaä¸äº,è½ç¶å¾®è½¯å¨è¿ä¸ªé®é¢ä¸ä¿ææ²é».è¿ä¹æ¯ææä¸çäºæ ,æè§å¾,å 为Javaè¿æ¥å¾æåè使ç¨Javaçå ¬å¸é½æ¥å说å®ä»¬å¨ç产æçä¸æ¯C++è·å¾äºæé«.
Javaæ带æ¥ç巨大影åå大家对å®ç广æ³æ¥åå·²ç»ç±å·¥ä½äºè¿ç§è¯è¨åå¹³å°ä¹ä¸çç¨åºåæ°éææ¾ç说æäº(估计ä¸çèå´å å ±æ两ç¾äºåä¸ç¨åºå使ç¨Java).ç±è¿ç§è¯è¨åæçåºç¨ç¨åºçæ°éæ¯ä»¤äººæ讶ç并已ç»æ¸éäºæ¯ä¸ä¸ªçº§å«ç计ç®,å æ¬æ 线计ç®å移å¨çµè¯(æ¯å¦æ¥æ¬åæçJavaçµè¯).C#è½å¤å¨ç¨æ·é¢åè·å¾è¿æ ·ç礼éå?æä»¬å¿ é¡»çå¾ å¹¶è§æ,就象已ç»ç±SSIå ¬å¸çCEOå主å¸Kalpathi S. Sureshæåºæ¥çé£æ ·,"æåç°ææè¿äºé½æ¯æ¸è¿ç.å¦æC#ä¸åå¨,æ们æ»è½åå°JavaæCåC++.è¿äºé½ä¸å®å ¨æ¯æ°ææ¯;å®ä»¬å¨æ´å¤§çæä¹ä¸æ¥è¯´åªæ¯å¤§å ¬å¸å¶é çå¸åºå±å¤´.æä»¬å¿ é¡»ç»ä»ä»¬æ¶é´å®é¡¿ä¸æ¥ççè¿äºæ¯ä¸æ¯çç对ITå·¥ä¸æä»ä¹å½±å."
C#ä»Java继æ¿èæ¥çç¹ç¹
ç±»:å¨C#ä¸ç±»çç³æä¸Javaå¾ç¸ä¼¼.è¿æ¯åççå 为ç»éªåè¯æ们Java模åå·¥ä½å¾å¾å¥½.Javaçå ³é®åimportå·²ç»è¢«æ¿æ¢æusing,å®èµ·å°äºåæ ·çä½ç¨.ä¸ä¸ªç±»å¼å§æ§è¡çèµ·ç¹æ¯éææ¹æ³Main().ä¸é¢çHello Worldç¨åºå±ç¤ºäºåºæ¬çå½¢å¼:
using System;
class Hello
{
static void Main()
{
Console.WriteLine("Hello, world");
}
}
å¨è¿ä¸ªä¾åä¸,Systemè¿ä¸ªååæåä¸ä¸ªå æ¬äºåºæ¬C#å®ç¨ç±»éåçå½å空é´(namespace).è¿ä¸ªå½å空é´å æ¬äºConsoleç±»,å®å¨è¿ä¸ªä¾åä¸è¢«ç¨æ¥è¾åºä¸ä¸ªå符串.ç±»å¯ä»¥æ¯æ½è±¡çåä¸å¯ç»§æ¿ç:ä¸ä¸ªè¢«ç³ææabstractçç±»ä¸è½è¢«å®ä¾å;å®åªè½è¢«ç¨åä¸ä¸ªåºç±».C#å ³é®åsealed就象Javaå ³é®åfinal,å®ç³æä¸ä¸ªç±»ä¸æ¯æ½è±¡ç,ä½æ¯å®ä¹ä¸è½è¢«ç¨åå¦ä¸ä¸ªç±»çåºç±».çé¢:就象å¨Javaä¸ä¸æ ·,ä¸ä¸ªçé¢æ¯ä¸ç»æ¹æ³éåçæ½è±¡å®ä¹.å½ä¸ä¸ªç±»æç»æä½å®ç°ä¸ä¸ªçé¢çæ¶å,å®å¿ é¡»å®ç°è¿ä¸ªçé¢ä¸å®ä¹çæææ¹æ³.ä¸ä¸ªåä¸çç±»å¯ä»¥å®ç°å 个çé¢.ä¹è®¸ä»¥åä¼åºç°ä¸äºå¾®å¦çå·®å«,ä½æ¯è¿ä¸ªç¹ç¹çèµ·æ¥ä¸Javaç¸æ¯æ²¡æåå.å¸å°è¿ç®:æ¡ä»¶è¡¨è¾¾å¼çç»ææ¯å¸å°æ°æ®ç±»å,å¸å°æ°æ®ç±»åæ¯è¿ç§è¯è¨ä¸ç¬ç«çä¸ç§æ°æ®ç±»å.ä»å¸å°ç±»åå°å ¶ä»ç±»å没æç´æ¥ç转æ¢è¿ç¨.å¸å°å¸¸étrueåfalseæ¯C#ä¸çå ³é®å.é误å¤ç:å¦Javaä¸é£æ ·,éè¿æåºåææå¼å¸¸å¯¹è±¡æ¥ç®¡çé误å¤çè¿ç¨.å å管ç:ç±åºå±.NETæ¡æ¶è¿è¡èªå¨å ååå¾åæ¶.
C#ä»CåC++继æ¿çç¹ç¹
ç¼è¯:ç¨åºç´æ¥ç¼è¯ææ åçäºè¿å¶å¯æ§è¡å½¢å¼.ä½C#çæºç¨åºå¹¶ä¸æ¯è¢«ç¼è¯æäºè¿å¶å¯æ§è¡å½¢å¼ï¼èæ¯ä¸ä¸ä¸é´è¯è¨ï¼ç±»ä¼¼äºJAVAåèç ãå¦æåé¢çHello Worldç¨åºè¢«ä¿åæä¸ä¸ªææ¬æ件并被å½å为Hello.cs,å®å°è¢«ç¼è¯æå½åHello.exeçå¯æ§è¡ç¨åº.
ç»æä½:ä¸ä¸ªC#çç»æä½ä¸C++çç»æä½æ¯ç¸ä¼¼ç,å 为å®è½å¤å å«æ°æ®å£°æåæ¹æ³.ä½æ¯,ä¸è±¡C++,C#ç»æä½ä¸ç±»æ¯ä¸åçèä¸ä¸æ¯æ继æ¿.ä½æ¯,ä¸Javaç¸åçæ¯,ä¸ä¸ªç»æä½å¯ä»¥å®ç°çé¢.
é¢ç¼è¯:C#ä¸åå¨é¢ç¼è¯æ令æ¯ææ¡ä»¶ç¼è¯,è¦å,é误æ¥ååç¼è¯è¡æ§å¶.å¯ç¨çé¢ç¼è¯æ令æ:
#define
#undef
#if
#elif
#else
#endif
#warning
#error
#line []
没æäº#include 伪æ令.ä½ æ æ³åç¨#define è¯å¥å¯¹ç¬¦å·èµå¼,æ以就ä¸åå¨æºä»£ç æ¿æ¢çæ¦å¿µ--è¿äºç¬¦å·åªè½ç¨å¨#ifå#elif伪æ令é.å¨#line伪æ令éçæ°å(åå¯éçåå)è½å¤ä¿®æ¹è¡å·è¿æ#warningå#errorè¾åºç»æçæ件å.
æä½ç¬¦éè½½:ä¸äºæä½ç¬¦è½å¤è¢«éè½½,èå¦ä¸äºåä¸è½.ç¹å«çæ¯,没æä¸ä¸ªèµå¼è¿ç®ç¬¦è½å¤è¢«éè½½.è½å¤è¢«è¢«éè½½çåç®æä½ç¬¦æ¯:
+ - ! ~ ++ -- true false
è½å¤è¢«éè½½çäºå è¿ç®ç¬¦æ¯:
+ - * / % & | ^ << >> == != > < >= <=
C#ç¬æçç¹ç¹
C#æå¼äººå ¥èçå°æ¹æ¯å®åJavaçä¸å,èä¸æ¯ç¸ä¼¼çå°æ¹.è¿ä¸è(åè¿ä¸ªç³»å第äºé¨åç大é¨åå°æ¹)讲述äºC#å®ç°çåJavaä¸åçå°æ¹æè Javaæ ¹æ¬æ²¡æçç¹ç¹.
ä¸é´ä»£ç :微软å¨ç¨æ·éæ©ä½æ¶MSILåºè¯¥ç¼è¯ææºå¨ç çæ¶åæ¯çäºå¾å¤§çä½å°.å¾®è½¯å ¬å¸å¾å°å¿ç声称MSILä¸æ¯è§£éæ§ç,èæ¯è¢«ç¼è¯æäºæºå¨ç .å®ä¹æç½è®¸å¤--å¦æä¸æ¯å¤§å¤æ°çè¯--ç¨åºå认为Javaç¨åºè¦ä¸å¯é¿å çæ¯Cç¼åçä»»ä½ä¸è¥¿é½è¦æ ¢.èè¿ç§å®ç°æ¹å¼å³å®äºåºäºMSILçç¨åº(æçæ¯ç¨C#,Visual Basic,"Managed C++"--C++çä¸ä¸ªç¬¦åCLSççæ¬--çè¯è¨ç¼åçç¨åº)å°å¨æ§è½ä¸è¶ è¿"解éæ§ç"Java代ç .å½ç¶,è¿ä¸ç¹è¿éè¦å¾å°äºå®è¯æ,å 为C#åå ¶ä»çæMSILçç¼è¯å¨è¿æ²¡æåå¸.ä½æ¯Java JITç¼è¯å¨çæ®éåå¨ä½¿å¾JavaåC#å¨æ§è½ä¸ç¸å¯¹ç¸å.象"C#æ¯ç¼è¯è¯è¨èJavaæ¯è§£éæ§ç,"ä¹ç±»ç声æåªæ¯åä¸æå·§.Javaçä¸é´ä»£ç åMSILé½æ¯ä¸é´çæ±ç¼å½¢å¼çè¯è¨,å®ä»¬å¨è¿è¡æ¶æå ¶å®çæ¶å被ç¼è¯ææºå¨ä»£ç .
å½å空é´ä¸çç³æ:å½ä½ å建ä¸ä¸ªç¨åºçæ¶å,ä½ å¨ä¸ä¸ªå½å空é´éå建äºä¸ä¸ªæå¤ä¸ªç±».åå¨è¿ä¸ªå½å空é´é(å¨ç±»çå¤é¢)ä½ è¿æå¯è½å£°æçé¢,æ举类ååç»æä½.å¿ é¡»ä½¿ç¨usingå ³é®åæ¥å¼ç¨å ¶ä»å½å空é´çå 容.
åºæ¬çæ°æ®ç±»å:C#æ¥ææ¯C,C++æè Javaæ´å¹¿æ³çæ°æ®ç±»å.è¿äºç±»åæ¯bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,ådecimal.象Javaä¸æ ·,ææè¿äºç±»åé½æä¸ä¸ªåºå®ç大å°.å象CåC++ä¸æ ·,æ¯ä¸ªæ°æ®ç±»åé½ææ符å·åæ 符å·ä¸¤ç§ç±»å.ä¸Javaç¸åçæ¯,ä¸ä¸ªå符åéå å«çæ¯ä¸ä¸ªä½çUnicodeå符.C#æ°çæ°æ®ç±»åæ¯decimalæ°æ®ç±»å,对äºè´§å¸æ°æ®,å®è½åæ¾ä½è¿å¶æ°å.
两个åºæ¬ç±»:ä¸ä¸ªåå«objectçç±»æ¯ææå ¶ä»ç±»çåºç±».èä¸ä¸ªåå«stringçç±»ä¹è±¡objectä¸æ ·æ¯è¿ä¸ªè¯è¨çä¸é¨å.ä½ä¸ºè¯è¨çä¸é¨ååå¨æå³çç¼è¯å¨æå¯è½ä½¿ç¨å®--æ 论ä½æ¶ä½ å¨ç¨åºä¸åå ¥ä¸å¥å¸¦å¼å·çå符串,ç¼è¯å¨ä¼å建ä¸ä¸ªstring对象æ¥ä¿åå®.
åæ°ä¼ é:æ¹æ³å¯ä»¥è¢«å£°ææ¥åå¯åæ°ç®çåæ°.缺ççåæ°ä¼ éæ¹æ³æ¯å¯¹åºæ¬æ°æ®ç±»åè¿è¡å¼ä¼ é.refå ³é®åå¯ä»¥ç¨æ¥å¼ºè¿«ä¸ä¸ªåééè¿å¼ç¨ä¼ é,è¿ä½¿å¾ä¸ä¸ªåéå¯ä»¥æ¥åä¸ä¸ªè¿åå¼.outå ³é®åä¹è½å£°æå¼ç¨ä¼ éè¿ç¨,ä¸refä¸åçå°æ¹æ¯,å®ææè¿ä¸ªåæ°å¹¶ä¸éè¦åå§å¼.
ä¸COMçéæ:C#对Windowsç¨åºæ大çåç¹å¯è½å°±æ¯å®ä¸COMçæ ç¼éæäº,COMå°±æ¯å¾®è½¯çWinç»ä»¶ææ¯.å®é ä¸,æç»æå¯è½å¨ä»»ä½.NETè¯è¨éç¼åCOM客æ·åæå¡å¨ç«¯.C#ç¼åçç±»å¯ä»¥åç±»åä¸ä¸ªä»¥åå¨çCOMç»ä»¶;çæçç±»ä¹è½è¢«ä½ä¸ºä¸ä¸ªCOMç»ä»¶ä½¿ç¨,ç¶ååè½ä½¿ç¨,æ¯æ¹è¯´,JScriptè¯è¨åç±»åå®ä»èå¾å°ç¬¬ä¸ä¸ªCOMç»ä»¶.è¿ç§ç°è±¡çç»ææ¯å¯¼è´äºä¸ä¸ªè¿è¡ç¯å¢ç产ç,å¨è¿ä¸ªç¯å¢éçç»ä»¶æ¯ç½ç»æå¡,å¯ç¨ç¨ä»»ä½.NETè¯è¨åç±»å.
ç´¢å¼ä¸æ :ä¸ä¸ªç´¢å¼ä¸å±æ§é¤äºä¸ä½¿ç¨å±æ§åæ¥å¼ç¨ç±»æåèæ¯ç¨ä¸ä¸ªæ¹æ¬å·ä¸çæ°åæ¥å¿åå¼ç¨(就象ç¨æ°ç»ä¸æ ä¸æ ·)以å¤æ¯ç¸ä¼¼ç.
public class ListBox: Control
{
private string[] items;
public string this[int index]
{
get
{
return items[index];
}
set
{
items[index] = value;
Repaint();
}
}
}
å¯ä»¥ç¨ä¸ä¸ªå¾ªç¯å¨æ¥å¿åå¼ç¨å符串å é¨æ°ç»æå,就象ä¸é¢è¿æ ·:
ListBox listBox = ...;
listBox[0] = "hello";
Console.WriteLine(listBox[0]);
代çååé¦:ä¸ä¸ªä»£ç对象å æ¬äºè®¿é®ä¸ä¸ªç¹å®å¯¹è±¡çç¹å®æ¹æ³æéçä¿¡æ¯.åªè¦æå®å½æä¸ä¸ªèªæçæ¹æ³æéå°±è¡äº.代ç对象å¯ä»¥è¢«ç§»å¨å°å¦ä¸ä¸ªå°æ¹,ç¶åå¯ä»¥éè¿è®¿é®å®æ¥å¯¹å·²åå¨çæ¹æ³è¿è¡ç±»åå®å ¨çè°ç¨.ä¸ä¸ªåé¦æ¹æ³æ¯ä»£ççç¹ä¾.eventå ³é®åç¨å¨å°å¨äºä»¶åççæ¶å被å½æ代çè°ç¨çæ¹æ³å£°æ.
è¡¥å ï¼
C#ç®å²ââæèªãç¨åºåãæå¿-æå
C# ç®å²
ç¼è æï¼æ¶é´è¿å¾çå¿«ï¼å± ç¶ç°å¨å°±å¯ä»¥åC#çç®å²äºãä½æ¯æ³æ³ä¹ä¸å¥æªï¼C#å¯è°
èµ·ç¹é«ãåå±å¿«çæ°ä¸ä»£è¯è¨ï¼å®çè¿äºå¹´èµ°è¿äºå¾å¤åè¾åå å¹´çè·¯ãå ¬å å°è¯´ï¼C#æ¯ç®
åå ¼é¡¾ç³»ç»å¼åååºç¨å¼åçæä½³å®ç¨è¯è¨ï¼å¹¶ä¸å¾æå¯è½æ为ç¼ç¨è¯è¨åå²ä¸ç第ä¸ä¸ªâå ¨
è½âåè¯è¨ãçè¿è¿ç¯ç®å²ï¼æ们é½åºè¯¥æç½ï¼ä¸è¦åæC#çæå¹´è½»åçäºââåªè¦æ¯â马
æå¤çº³âï¼å°±æ©æå½âççâã
C# 1.0ï¼çº¯ç²¹çé¢å对象
å½æ¶é´å溯å°å¹´åºï¼å¾®è½¯æ£å¨å¿äºæ°ä¸ä»£COMç设计工ä½ãæ¤åï¼COMä¸ç´æ¯ç»ä»¶åå¼åä¸é常æåçä¸ç§ææ¯ï¼ä½ç±äºå®ä» æä¾äºäºè¿å¶
å±é¢ä¸çç»ä¸ï¼å æ¤æ æ³å°ç±»åä¿¡æ¯åç¨äºæ¯æåºç¡å¹³å°åå¼åå·¥å ·çä¿¡æ¯æ¾å°ç»ä»¶ä¸ãè¿æ¶ï¼Javaæ£å¨éæ¥èµ°åæçãäºæ¯ï¼å¾®è½¯å¦ä¹ Java
çåæ³ï¼å°èææºçæ¦å¿µå¼å ¥å°äºCOMé¢åï¼åæ¶ï¼å¾®è½¯æåºäºâå æ°æ®âçæ¦å¿µï¼ç¨äºæè¿°ç»ä»¶çç±»åä¿¡æ¯åå·¥å ·æ¯æä¿¡æ¯ï¼å¹¶å³å®å°å ¶æ¾å ¥
å°ç»ä»¶å½ä¸ãè¿ç§âCOMèææºâçååå¨ç»åäºè¥å¹²äºè®ºåï¼æç»è¢«å®ä¸ºCLRï¼Common Language Runtimeï¼å ¬å ±è¯è¨è¿è¡æ¶ï¼ãä¸æ¤åæ¶ï¼å¾®
软æåºäºå¨è¯¥è¿è¡æ¶ä¸è¿ä½çè¯è¨åºè¯¥éµå¾ªçä¸äºè§åï¼ä»¥å该èææºçç±»åç³»ç»åæ令éââææè¿äºè§èå½¢æäºæç»çC L Iï¼Common
Language Infrastructureï¼å ¬å ±è¯è¨åºç¡è®¾æ½ï¼ï¼å¹¶æ交ç»äºECMAå§åä¼ãåæ¶ï¼å¾®è½¯å¼åäºCLIçä¸ä¸ªå®ç°ï¼è¿å°±æ¯å¤§åé¼é¼ç.NETäºã
å¹´æï¼å¾®è½¯å¯å¨äºä¸ä¸ªå ¨æ°çè¯è¨é¡¹ç®ââCOOLï¼è¿æ¯ä¸æ¬¾ä¸é¨ä¸ºCLR设计ç纯é¢å对象çè¯è¨ï¼ä¹æ£æ¯æ¬æç主è§ââC#çå身ãåæ¶
åå¹´æä½ï¼å¹´7æ份ï¼å¾®è½¯å®æäºCOOLè¯è¨çä¸ä¸ªå é¨çæ¬ãç´å°å¹´2æ份ï¼å¾®è½¯ææ£å¼å°COOLè¯è¨æ´å为C#ãæ®è¯´èµ·è¿ä¸ªååæ¯å 为
C#å¼åå°ç»ç人å¾è®¨åæç´¢å¼æï¼å æ¤æ大é¨åæç´¢å¼ææ æ³è¯å«çâ#â å符ä½ä¸ºè¯¥è¯è¨ååçä¸é¨åï¼è¿æä¸ç§è¯´æ³æ¯å¨é³ä¹å½ä¸â#âæ¯
åè°è®°å·ï¼è¡¨è¾¾äºå¾®è½¯å¸æå®å¨Cçåºç¡ä¸æ´ä¸ä¸å±æ¥¼çç¾å¥½æ¿æââå½ç¶è¿äºé½åªæ¯ä¼ 说ï¼æ ä»èè¯ãåæ¯åç»äºä¸ç³»åçä¿®æ¹ï¼å¾®è½¯ç»äºå¨
å¹´7æåå¸äºC#è¯è¨ç第ä¸ä¸ªé¢è§çãå æ¤äººä»¬ä¸è¬è®¤ä¸ºC#æ¯å¹´åå¸çï¼å¹¶ä»¥æ¤æ¥è®¡ç®å®çâå¹´é¾âãå¨æ¤åçä¸å¹´å¤æ¶é´éï¼å¾®è½¯ä¸
ç´å¨ä¿®è¡¥å个æµè¯çæ¬ä¸çBUGãç´å°å¹´2æï¼å¾®è½¯ç»äºæ¨åºäºè¿è¿æªä¸å¸çVisual Studio 7.0ï¼å¹¶å°å ¶å®å为âVisualStudio .NET
âãéçè¿å¥å¼åç¯å¢çåºçï¼å¼åè 们ç»äºçå°äºC#è¯è¨ç第ä¸ä¸ªæ£å¼çæ¬ââC# 1.0ãæ¤åï¼å¾®è½¯é©¬ä¸åè¹ï¼Visual Studioä¹æ¢å¤äºå¾æ¥
çå¼åè¿åº¦ãå¨å¹´5æï¼å¾®è½¯å¦ææ¨åºäºVisual Studio .NET ï¼åæ¶ä¹åå¸äºC#çæ¹è¿çæ¬ââC# 1.1ãè¿ä¸æ¶æçC#ï¼ä»¥ä¸ç§°ä¸ºC#
1.xï¼æåºäºçº¯ç²¹çé¢å对象æ¦å¿µï¼å¹¶å¨è¯è¨ç¹æ§ä¸å±ç°å¾æ·æ¼å°½è´ãC++并é纯é¢å对象çï¼ä¸ºäºåCå ¼å®¹ä»¥åæä¾æ´é«çæ§è¡æçï¼å®ä¿çäº
å¾å¤æ¨¡ååçä¸è¥¿ãJava尽管å·ç§°æ¯é¢å对象çï¼ä½å®é ä¸ï¼å¯¹äºå¯¹è±¡æåºè¯¥å ·å¤çä¸ç§ææç»æââå±æ§ãæ¹æ³åäºä»¶ï¼Javaä» æä¾äºæ¹æ³
ï¼å ¶å®ä¸¤ç§ç»æé½è¦éè¿æ¹æ³æ¥æ¨¡æãå¨C# 1.xä¸ï¼ææé¢å对象çæ¦å¿µé½å¨è¯è¨ä¸å¾å°äºé常好çä½ç°ãåæ¶ï¼C#è¿éè¿ç±»ç±»åãå¼ç±»åå
æ¥å£ç±»åçæ¦å¿µå½¢æäºç»ä¸çç±»åç³»ç»ãC#使ç¨äºå¤§å®¶æçç¥çè¯æ³å®ç°äºæ¹æ³ï¼ä»¥è³äºå¾å¤äººè®¤ä¸ºC#åJavaãC++çé¢å对象è¯è¨âé常ç¸å
âï¼è¿ä½¿å¾ä»ä½¿ç¨å ¶ä»é¢å对象è¯è¨è½¬å°ä½¿ç¨C#çè¿ç¨é常ç®åãæ¤å¤ï¼C#è¿éè¿æ åæ°å表çæ¹æ³å£°åè¯æ³ï¼ç»åget/set访é®å¨å®ç°äºä¼é
çå±æ§è¯æ³ãå ¶ä¸çget访é®å¨ç¸å½äºè·åå±æ§å¼çæ¹æ³ï¼å¯ä»¥éè¿ä¸äºè¿ç®è¿åæç»çç»æï¼èä¸æ¯ç®åå°è¿åä¸ä¸ªåéçå¼ï¼èset访é®å¨
ç¸å½äºè®¾ç½®å±æ§å¼çæ¹æ³ï¼å¨å ¶ä¸å¯ä»¥è¿è¡ä¸ç³»åæ£æµï¼æåå°å±æ§å¼èµç»ç¸åºçåéãåæ¶ï¼éè¿åæ¶æä¾getåset访é®å¨ãåªæä¾get访é®
å¨ååªæä¾set访é®å¨ï¼è¿å¯ä»¥å¾æ¹ä¾¿å°å®ç°å¯è¯»åãåªè¯»ååªåçå±æ§ãC#çè¿ç§å±æ§è¯æ³ï¼ä½¿å¾ä¸ä¸ªå±æ§å¨æä¾è¯¥å±æ§çç±»çå é¨çæ¥ï¼é
常åä¸ç»æ¹æ³ï¼è对äºå¤é¨è°ç¨ç±»çæ¥ï¼è®¿é®ä¸ä¸ªå¯¹è±¡çå±æ§å访é®å®çå ¬å ±å没æä»»ä½åºå«ã
éè¿å§æï¼ç¨åä»ç»ï¼ï¼ç»åå ³é®åeventï¼C#æä¾äºä¼é çäºä»¶æ¦å¿µã使ç¨+=è¿ç®ç¬¦ï¼å¼åè å¯ä»¥é常æ¹ä¾¿å°å°ä¸ä¸ªäºä»¶å¤çå¨å ³èå°ä¸ä¸ªäº
件ä¸ï¼è¿ä¸ªè¿ç¨ç§°ä¹ä¸ºâ订é âä¸ä¸ªäºä»¶ãç±äºå§æå é¨å°è£ äºä¸ä¸ªè°ç¨é¾è¡¨ï¼å æ¤å¯ä»¥æ¹ä¾¿å°ä¸ºä¸ä¸ªäºä»¶æ·»å å¤ä¸ªäºä»¶å¤çå¨ï¼è¿äºå¤çå¨
ä¼èªå¨å°ä¾æ¬¡è°ç¨ãå¤å¹´çå¼åè¯è¨è¿åè¯æï¼å½æ°æéæ¯é常éè¦ä¹æ¯é常å±é©çè¯è¨ç¹å¾ä¹ä¸ãåæ¶ï¼åºäºå½æ°æéçåè°æºå¶ä¹Windows
æ ¸å¿æ¦å¿µä¹ä¸ãç¶èï¼ç±äºå½æ°æéå¾é¾éªè¯åæ°çç±»ååç¡®æ§ï¼å æ¤C#ï¼ç¡®åå°è¯´æ¯CLIï¼æåºäºâå§æâçæ¦å¿µï¼è¿æ¯ä¸ç§ç±»åå®å ¨çå½æ°
æéé¾è¡¨ãè¿æå³çï¼C#ä¸ä» å¯ä»¥æä¾åè°æºå¶ï¼åæ¶è°ç¨åè°çä¸æ¹è¿æ éå¨å ¶å é¨ç»´æ¤å½æ°æéå表ï¼æè¦åçä» ä» æ¯å£°åä¸ä¸ªå ·ææ°å½
å§æç±»åçå ¬å ±æåå³å¯ï¼èæä¾åè°çä¸æ¹ä¹åªééè¿æé ä¸ä¸ªå¸¦ææå®æ¹æ³çç¸åºå§æå®ä¾ï¼å¹¶éè¿â+=âè¿ç®ç¬¦æ·»å å°åè°å表å³å¯ã
尽管C# 1.xæä¾äºå¦æ¤å¤çæ°é²æ¦å¿µï¼ä½å®é ä¸ï¼è¿äºæ¦å¿µé½æ¯ç±CLIæåºçãå æ¤å½å°ä¸ä¸ªC#æºç¨åºç¼è¯ä¸ºå¯æ§è¡æ件æ¶ï¼ç¼è¯å¨åçå·¥ä½ç¸
对èè¨å¹¶ä¸å¤ãéè¦ç¼è¯å¨ä»£å³çæ¯è¦å°ä¸ä¸ªç®åçå§æå®ä¹è¯å¥ç¿»è¯ä¸ºä¸ä¸ªç»§æ¿èªSystem.MulticastDelegateç±»åå®ä¹ã
C# 2.0ï¼æ³åç¼ç¨æ°æ¦å¿µ
微软æ¬æç®ç»§ç»ä¿è¯å¼åè¿åº¦ï¼å¹¶å¨å¹´æ¨åºVisual Studio .NET ï¼ä½ç±äºå ¶é´è½¯ä»¶å·¥ç¨å¦å°¤å ¶æ¯è½¯ä»¶ç®¡çå¦ç大è§æ¨¡è¿æ¥ï¼å¾®è½¯ææ
ä¾çè¿ç§ä» å ·å¤å¼ååè°è¯åè½çIDEå·²ç»æ æ³æ»¡è¶³å¢éå¼åçéæ±ãå æ¤å¾®è½¯å³å®å¨é¡¹ç®è®¾è®¡å管çå·¥å ·æ¹é¢è¿è¡äºè¿ä¸æ¥ç åï¼å¹¶å°å ¶éæ
å°Visual Studioä¸ï¼ä»¥èµ¢ååæçå¸åºãå æ¤ï¼å¾®è½¯å°Visual Studio.NET âæ¹åâ为Visual Studio ï¼å¹¶å³å®æ¨è¿ä¸å¹´åå¸ãä¸è¿
ï¼å¾®è½¯è¿æ¯åæå¨å¹´ç6æ份åå¸äºVisual Studioç第ä¸ä¸ªBeta çï¼åæ¶åå¼åè å±ç¤ºäºC#è¯è¨ç2.0çæ¬ãå¹´4æï¼å¾®è½¯åå¸äº
Visual Studio Beta2ï¼è¿å·²ç»æ¯å ·å¤äºå ä¹å ¨é¨åè½çVisualStudioï¼å æ¬ç产åæSQL ServerãTeam Foundation Serverå
TeamSuiteãè¿æ¶çC#ç¼è¯å¨å·²ç»è½å¤å¤çC# 2.0ä¸ææçæ°ç¹æ§ãC# 2.0为å¼åè 带æ¥çæ主è¦çç¹æ§å°±æ¯æ³åç¼ç¨è½åãåé¢å对象ææ³ä¸
æ ·ï¼æ³åææ³ä¹æ¯ä¸ç§å·²ç»æççç¼ç¨ææ³ï¼ä½ä¾ç¶æ¯æ²¡æåªä¸ç§ä¸»æµå¼åè¯è¨è½å¤æ¯æå®å¤çæ³åæ¦å¿µãè¿ä¸»è¦æ¯å 为æ³åçæ¦å¿µå¨ä¸å®ç¨
度ä¸å¯¹é¢å对象æ¦å¿µè¿è¡å²å»ï¼åæ¶ï¼ç±äºå¨ç¼è¯æé´å¯¹ç±»ååæ°çå®å ¨æ£æµå¾é¾åå°ï¼å¾å¤é®é¢ä¼è¢«éçå°è¿è¡æ¶ãC# 2.0å«åºå¿è£ï¼å¯¹æ³
åç±»ååæ°æåºäºâ约æâçæ°æ¦å¿µï¼å¹¶ä»¥ä¼é çè¯æ³ä½ç°å¨è¯è¨ä¹ä¸ãæäºçº¦æï¼ç»åç¼è¯å¨å¼ºå¤§çç±»åæ¨æè½åï¼å¯ä»¥å¨ç¼è¯æ¶
åç°å ä¹ææâå±é©âçæ³ååºç¨ãC# 2.0çå¦ä¸ä¸ªçªåºçç¹æ§å°±æ¯å¿åæ¹æ³ï¼ç¨æ¥å代ä¸äºçå°ç并ä¸ä» åºç°ä¸æ¬¡çå§æï¼ä½¿å¾è¯è¨ç»ææ´
å ç´§åãå¿åæ¹æ³é¤äºå¯ä»¥ä½¿å¾äºä»¶å¤çå¨çç¼åæ´å ç²¾ç®ä»¥å¤ï¼è¿å°å¼åè å¸¦å ¥äºç¨åºè®¾è®¡çä¸ä¸ªæ°çé¢åââå½æ°å¼ç¼ç¨ï¼æ¾ç»æé«äººå°±
ç¨å¿åæ¹æ³ç»åæ³åç¼ç¨å®ç°äºå½æ°å¼ç¼ç¨ä¸çéè¦ç»æââ Lambda 表达å¼ã尽管è¿ç§å®ç°æ¾å¾å¾ç¹çèä¸ä¸æç解ï¼ä½æ¯ç«æ¯å®ç°äºãæ
ç»ï¼å½æ°å¼ç¼ç¨è¿æ¯è¢«å¼å ¥å°äºC#è¯è¨ä¸ï¼è¿å°å¨ä¸ä¸èä¸ä¸ºå¤§å®¶è®²è¿°ã
æ¤å¤ï¼C# 2.0è¿è¿ä¸æ¥å¢å¼ºäºè¯è¨ç表达è½åãå¨C# 2.0ä¸ï¼å±æ§è¯æ³ä¸çgetåset访é®å¨å¯ä»¥æ¥æä¸åçæéï¼è¿å°±ä½¿å¾å®ä¹ä¸ä¸ªå¨åºçå
é¨å¯è¯»åï¼èå¨åºçå¤é¨åªè¯»çå±æ§æ为å¯è½ãåæ¶ï¼C# 2.0è¿æä¾äºè¿ä»£å¨çæ¦å¿µï¼è¿ä½¿å¾ä¸ä¸ªç±»æ éå®ç°IEnumerator åIEnumerableæ¥å£
å³å¯å®ç°ä¸ä¸ªå¯ä»¥è¿è¡éåçç±»åï¼å¹¶ä¸æ éå¨ç±»åä¸ç»´æ¤è¿ä»£ç¶æãæ¤æ¶ç.NETå·²ç»å¾å°äºå¾å¹¿æ³ç认å¯ï¼å¹¶ä¸å 为å æ°æ®ä¸ºç»ä»¶å¸¦æ¥äºå¼º
大çèªææè¿°è½åï¼è®¸å¤ç¨åºåºåå被å¸å¼å°.NETå¹³å°ä¸æ¥ãéç.NETç¨åºåºæ°éçå¢é¿ï¼éæ¸æ´é²äºå½åçé®é¢ãå¨é¢å对象ææ¯å¹¿æ³åå±
åï¼äººä»¬å°±æè¯å°ååç管çé®é¢ï¼å æ¤å ä¹ææçé¢å对象è¯è¨é½æåºäºâå½å空é´âçæ¦å¿µï¼
èå¨C# 1.xæ¶ä»£ï¼è¿ä¸ªé®é¢åä¸æ¬¡åºç°ãå¦æä¸ä¸ªåºååXX å¸æ以XX.Systemæ¥å½åä»ä»¬èªå·±çç³»ç»åºç¡åºï¼é£ä¹å½å¼åè 使ç¨using System
è¯å¥æ¶å°±ä¼äº§çæ§ä¹ã为æ¤ãC# 2.0ä¸æä¾äºglobalå ³é®åï¼è¿ä¸º.NETåºä¸ææçå½å空é´æä¾äºä¸ä¸ªâæ ¹â,éè¿æå®global::Systemå
global::XX.Systemå°±å¯ä»¥åºå«ä¸¤ä¸ªåºäºãè¿ä¸æ¶æçC#ç¼è¯å¨åå¾é常å¤æï¼æ³åçå¼å ¥ä½¿å¾ç¼è¯å¨ä¸å¾ä¸å ·å¤è¶ 强çç±»åæ¨æè½åãåæ¶ï¼
è¿ä»£å¨çææ³å¹¶éæ¯å¨CLIå±é¢ä¸å®ç°çï¼èæ¯ç±ç¼è¯å¨èªå¨çæäºå®ç°I E n u m e r a t o r åIEnumerableæ¥å£ç±»åã
C# 3.0ï¼é鬼
å¨ç»åäºä¸ç³»åçæ¹è¿åå®ååï¼å¾®è½¯å³å®äºå¹´æåå¸Visual Studioï¼è¯¥å¼åç¯å¢å°æ£å¼æ¯æC#2.0ãç±äºæ¤åæ¨åºäºæ°ä¸ªé¢è§ç
åæµè¯çï¼å¤§å®¶çæå¾ ä¹æ ä¼¼ä¹å·²ç»ä¸æ¯é£ä¹å¼ºçäºãèå¹´9 æ份çPDC大ä¼å为å¼åè 们带æ¥äºå¦å¤çæåââC#3.0ï¼ç å代å·âOrcas
âââé鬼ï¼çææ¯é¢è§çã
说å°C# 3.0ï¼å°±ä¸å¾ä¸æä¸ä¸å¾®è½¯çLINQ 项ç®ï¼LINQï¼è¯è¨éææ¥è¯¢ï¼Language Integrated Queryï¼æåºäºä¸ç§éè¿é¢å对象è¯æ³æ¥å®ç°å¯¹
éé¢å对象æ°æ®æºçæ¥è¯¢ææ¯ï¼å¯æ¥è¯¢çæ°æ®æºä»å ³ç³»åæ°æ®åºå»¶ä¼¸å°ä¸è¬æä¹ä¸çéåï¼å¦æ°ç»åå表ï¼ä»¥åXMLãèC# 3.0åæ¯çå å®ç°äº
LINQçè¯è¨ãå¨C# 3.0ä¸ï¼æ们å¯ä»¥ç¨ç±»ä¼¼äºSQLè¯å¥çè¯æ³ä»ä¸ä¸ªæ°æ®æºä¸è½»æ¾å°å¾å°æ»¡è¶³ä¸å®æ¡ä»¶ç对象éåãä¾å¦è¦æ¥æ¾ä¸ä¸ªå符串
æ°ç»namesä¸ææé¿åº¦å¤§äº5çå符串ï¼å°±å¯ä»¥åï¼ var longname = from n in names wheren.Length > 5 select n;è¿æ ·æ们就å¾å°ä¸ä¸ª
æ°çå符æ°ç»longnameï¼å ¶ä¸å å«äºæ们æéè¦çç»æãè¿ç§è¯å¥ç§°ä½æ¥è¯¢è¯å¥ï¼ä¸SQLè¯å¥å¯ä¸çåºå«æ¯C#ä¸çæ¥è¯¢è¯å¥å¾å¾æselectåå¥æ¾
å°æåï¼è¿åèåæäºç±»ä¼¼äºä¸æçé 读顺åºäºï¼ãå次çå°è¿æ ·ä¸ä¸ªè¯å¥ï¼æ们å¯è½ä¼æå¾å¤§çé®ï¼è¿è¿æ¯C#è¯è¨åï¼è¿çç¡®æ¯åä¹è¯æ³è§
åçC#代ç ï¼èä¸ç¼è¯å¨å¯ä»¥è¯å«è¿ç§è¯æ³ãç¶èå®é ä¸ï¼C#ç¼è¯å¨å¹¶ä¸ä¼å¯¹è¿ç§è¯æ³è¿è¡å®é ççç¼è¯ï¼èæ¯å°å ¶ç¿»è¯ä¸ºæ£å¸¸çæ¹æ³è°ç¨ï¼
var longname = names.Where(n => n.
Length > 5).Select(n);ç¶ååè¿è¡è¿ä¸æ¥çç¼è¯ãå¨ä¸é¢çä¾åä¸å·²ç»è¯´æï¼namesæ¯ä¸ä¸ªåæ¾æå符串çæ°ç»ï¼èæ°ç»ç±»å并没æWhereç
æ¹æ³ãçç¡®ï¼Where并énamesçæåæ¹æ³ï¼å¾®è½¯ä¹æ²¡æ对æ°ç»ç±»åè¿è¡ä»»ä½æ¹å¨ãè¿æ¯C# 3.0ä¸å¦å¤ä¸ä¸ªéè¦çæ°ç¹æ§ï¼æ©å±æ¹æ³ãæ©å±æ¹æ³
æ¯å®ä¹å¨å ¶ä»éæç±»ä¸çéææ¹æ³ï¼å ¶ç¬¬ä¸ä¸ªåæ°çç±»åå°±æ¯å¸ææ©å±çç±»åï¼å¹¶ä¸è¿ä¸ªåæ°è¢«å 以this修饰符ãæ©å±æ¹æ³æ¯éæçï¼ä½å¯ä»¥
åè°ç¨è¢«æ©å±ç±»åçå®ä¾æ¹æ³é£æ ·è¿è¡è°ç¨ï¼çèµ·æ¥å¥½åæ¯è¢«æ©å±ç±»åèªå·±çæ¹æ³ä¸æ ·ãè¿å°±ä¸ºè¯è¨å¸¦æ¥äºå¾å¤§ççµæ´»æ§ï¼æ们å¯ä»¥å°ä¸ç»è¿
ä¼¼çåè½å¦ä¸é¢çWhere åSelectçï¼è¿å¨LINQä¸è¢«ç§°ä½âæ åæ¥è¯¢è¡¨è¾¾å¼âï¼å®ä¹å¨ä¸ä¸ªå¤é¨ç±»ä¸ï¼è¿æ ·æ¢æ 须修æ¹ç°æç±»åï¼åå¯ä»¥å°æ°
åè½ç»ç»å¨ä¸èµ·ãå½ç¶ï¼ä¸ºäºåå°é¢å对象çå°è£ æ§ï¼æ©å±æ¹æ³åªè½å¨è¢«æ©å±ç±»åçå ¬å ±æåä¸è¿è¡æä½ï¼å¦æéè¦ä»å é¨å¯¹ç±»åè¿è¡æ¹è¿ï¼
å°±å¿ é¡»æ¹åç°æç±»åç代ç ãå¨Whereæ¹æ³çåæ°å表éï¼æ们ååç°äºä¸ç§å¥æªçè¯æ³ï¼n => n.Length > 5ãè¿å°±æ¯æ们ä¸ææå°è¿ç
Lambda 表达å¼ã微软çå®æ¹è§èä¸ç§°ï¼Lambda 表达å¼æ¯å¿åæ¹æ³çä¸ç§èªç¶è¿åãå æ¤Lambda 表达å¼å ¶å®ä¹æ¯ä¸ç§ç¹æ®çå§æï¼ç±ç¼è¯å¨è´
è´£çæä¸ä¸ªå¿åçå§æç±»åï¼å®æ¥åä¸ä¸ªå符串类åçåæ°nï¼è¿åå¼ä¸ºå¸å°ç±»åï¼è¡¨ç¤ºnçé¿åº¦æ¯å¦å¤§äº5ï¼å ¶ä¸çåæ°ç±»ååè¿åå¼ç±»åé½æ¯
ç±ç¼è¯å¨æ¨æèæ¥çã说å°ç±»åæ¨æï¼è¿è¦è§£éçä¸ç¹å°±æ¯ä¸é¢çè¯å¥ä¸åºç°çæ°å ³é®åvarãä»åºç°çä½ç½®æ¥çï¼varåºè¯¥æ¯ä¸ä¸ªç±»åãç¶è
è¿åä¸æ¯ä¸ä¸ªC#å 建类åï¼ä¹ä¸æ¯CLIæåºçæ°ç±»åï¼å®åªæ¯ä¸ä¸ªâå ä½ç¬¦âï¼å®ç确表示ä¸ä¸ªç±»åï¼ä½å ·ä½æ¯ä»ä¹ç±»åéè¦ç¼è¯å¨å¨ç¼è¯æé´
è¿è¡æ¨æãLamda表达å¼ççæ£æä¹ä¸ä» ä» å¨äºç®åäºå§æçç¼åæ¹å¼ï¼æ´éè¦çæ¯å®æ代ç 表达å¼ä½ç°ä¸ºäºæ°æ®ãæ¢å¥è¯è¯´ï¼Lambda表达å¼ä¸
ä» å¯ä»¥è¢«ç¼è¯ä¸ºä¸æ®µå¯ä»¥æ§è¡ç代ç ï¼ç±»ä¼¼äºå¿åæ¹æ³ï¼ï¼ä¹å¯ä»¥å°å ¶ç¿»è¯ä¸ºä¸ä¸ªæ°æ®ç»æââ表达å¼æ ãèå¦ä½å¤çLambda 表达å¼ï¼æ¯ç±ç¼
è¯å¨æ ¹æ®Lambda表达å¼ç使ç¨æ¹å¼æ¥èªå¨ç¡®å®çãå½æä¸ä¸ªLambda表达å¼èµç»ä¸ä¸ªå ·æå§æç±»åçåãå±æ§æåéæ¶ï¼ç¼è¯å¨åç¼è¯å¿åæ¹æ³
ä¸æ ·å°è¡¨è¾¾å¼ä½ç¿»è¯æä¸æ®µå¯æ§è¡ä»£ç ï¼èå½æä¸ä¸ªL a m b d a 表达å¼èµç»ä¸ä¸ªå ·æExpression<T>ç±»åçåãå±æ§æåéæ¶ï¼ç¼è¯å¨å°±ä¼å°
Lambda表达å¼è§£æ为ä¸ä¸ªè¡¨è¾¾å¼æ ã对äºç¿»è¯ä¸ºä»£ç çLambdaï¼å¯ä»¥åè°ç¨å§æé£æ ·è¿è¡è°ç¨ï¼è对äºç¿»è¯ä¸ºè¡¨è¾¾å¼æ çLambda表达å¼ï¼å°±ä¸
å¯ä»¥äºï¼ä¼å¾å°ä¸ä¸ªç¼è¯é误ãä½è¡¨è¾¾å¼æ åå¨äºä¸ä¸ªç±ç¼è¯å¨çæçæ°æ®ç»æä¸ï¼å æ¤å¯ä»¥å¨è¿è¡æ¶å¯¹å ¶è¿è¡åæçè³ä¿®æ¹ã
é¤äºä¸é¢æå°çä¸äºé大æ¹è¿ä¹å¤ï¼C# 3.0ä¹å¯¹ç»å¾®çè¯æ³è¿è¡äºä¸äºæ¹è¿ï¼ä½¿C#è¯è¨åå¾æ´å ä¼é åå ¨é¢ãå¼å¾è¯´æçæ¯ï¼C# 3.0ç»è¿ç¼è¯
åçæçIL代ç ï¼å®å ¨æ¯åºäº.NET 2.0çï¼C#è¯è¨å·²ç»è¿è¿è·å¨äºä»ææ ççå¹³å°åé¢ãè¿ä¸æ¶æçC#è¯è¨ç¦»CLIå·²ç»è¶æ¥è¶è¿äºï¼ç¼è¯å¨çå·¥
ä½ä¹æå ç¹éèµ·æ¥ãé¦å å¾å¤è¯è¨ç»æï¼å¦æ¥è¯¢è¡¨è¾¾å¼åLambda 表达å¼ï¼é½ä¸æ¯CLIä¸æä¾çç¹æ§ï¼å æ¤éè¦ç¼è¯å¨è¿è¡å¤§éç转è¯å·¥ä½ï¼å ¶
次æ¯è¿äºè¯è¨ç»æ带æ¥ç大éç±»åæ¨æä»»å¡ï¼ä¹é½æ¯é ç¼è¯å¨æ¥å®æçã
C#èµ°å°äº3.0以åï¼å·²ç»å®å ¨ä¸åæ¯å½å¹´é£ä¸ªâç®åâçè¯è¨äºãå®çå¼åè ç§°å ¶ä¸ºâé鬼âï¼èç³ç 满ç®çæ°ç¹æ§ä¹ç确让å¼åè 们ç¼è±ç¼ä¹±
ï¼çè³æå°ææ§ãè¯è¨éææ¥è¯¢çå¼å ¥ï¼ä½¿å¾åä¸æ®µæ¶æå 为å¼åè 们广æ³è®¨è®ºçORMæ¦å¿µå¾å°äºæ´å æ·±å ¥å°ä½ç°ï¼å°¤å ¶æ¯å®ææ¯æçæ°æ®æºä¹
广æ³ï¼è®©ORMç念åå¾å·²ç»ä¸åå¿ è¦äºï¼èä¸äºâ.NETä¸çORMå®ç°âï¼ä¼¼ä¹ä¹æäºå®å ¨ä¸å¿ è¦çæ©å±é¡¹ç®äºãLambda 表达å¼çå¼å ¥ï¼ä½¿å¾C#
å°å¯ä»¥è½»æ¾å°å®æç¹å®é¢åï¼Domain-Specificï¼çå¼åãä¸ä¸ªæåçå¼å人åå¨é¢å¯¹æ°é²äºç©åæ°çå°é¾æ¶ï¼å ´å¥æ¯è¿å¤§äºææ§çã
让é鬼æ¥å¾æ´ççäºå§ï¼