1.java中Arraylist是类源干什么的?怎么用?
2.è°ç»ç®åä»ç»ä¸ä¸C#ï¼
3.如何将Unity的Coroutine封装到Async/Await模式中
java中Arraylist是干什么的?怎么用?
java中的ArrayList就是传说中的动态数组,用MSDN中的码c码说法,就是类源Array的复杂版本。它提供了如下一些好处:动态的码c码增加和减少元素实现了ICollection和IList接口灵活的设置数组的大小 。
ArrayList 的类源用法:
ArrayList List = new ArrayList(); for( int
i=0;i<;i++ ) //
给数组增加个Int元素 List.Add(i); //..
程序做一些处理
List.RemoveAt(5);//
将第6个元素移除 for( int i=0;i<3;i++ ) //
再增加3个元素
List.Add(i+); Int[] values =
(Int[])List.ToArray(typeof(Int));//
返回ArrayList包含的数组 。
扩展资料:
Arraylist的码c码切水果布局源码定义:
List 接口的大小可变数组的实现,位于API文档的类源java.util.ArrayList<E>。
实现了所有可选列表操作,码c码并允许包括 null 在内的类源所有元素。
除了实现 List 接口外,码c码此类还提供一些方法来操作内部用来存储列表的类源数组的大小。(此类大致上等同于 Vector 类,码c码-73的源码除了此类是类源不同步的。)
size、码c码isEmpty、类源get、set、iterator 和 listIterator 操作都以固定时间运行。
add 操作以分摊的固定时间 运行,也就是说,添加 n 个元素需要 O(n) 时间。
其他所有操作都以线性时间运行(大体上讲)。
与用于 LinkedList 实现的qml源码架构常数因子相比,此实现的常数因子较低。
每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。
它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。
并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单
在添加大量元素前,应用程序可以使用
ensureCapacity 操作来增加 ArrayList
实例的容量。这可以减少递增式再分配的数量。
注意,彩票排序源码此实现不是同步的。如果多个线程同时访问一个 ArrayList
实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。
(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)
这一般通过对自然封装该列表的对象进行同步操作来完成。
如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的383的源码访问:
List list = Collections.synchronizedList(new ArrayList(...));
此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的。
在创建迭代器之后,除非通过迭代器自身的
remove 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出
ConcurrentModificationException。
因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。
注意,迭代器的快速失败行为无法得到保证。
因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出
ConcurrentModificationException。
因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测
bug。
参考资料:
è°ç»ç®åä»ç»ä¸ä¸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ï¼çå¼åãä¸ä¸ªæåçå¼å人åå¨é¢å¯¹æ°é²äºç©åæ°çå°é¾æ¶ï¼å ´å¥æ¯è¿å¤§äºææ§çã
让é鬼æ¥å¾æ´ççäºå§ï¼
如何将Unity的Coroutine封装到Async/Await模式中
在探索Unity Coroutine返回值处理的解决方案时,发现原有的方法显得勉强,尤其是在事件处理器嵌套于多层 Coroutine 中时,逻辑变得复杂难懂。于是,我继续在网络上寻求前人经验,发现了一种更优雅的解决方案 - Async/Await模式。
Async/Await模式是目前成熟的异步编程方法,其价值不在于提升程序运行速度,而是使代码结构符合人类日常习惯。通过了解此模式,我们能够实现代码的简洁清晰,如同派遣赵子龙跑快递并等待回信。网上已有开发者对Coroutine和IEnumerator进行了扩展,使其可以轻松封装到Async/Await模式中。
游戏蛮牛多年前就有过相关项目的中文翻译,通过阅读原文,发现已有代码示例展示了如何将Unity中的常见协程转换为可await的等待。感兴趣者可以克隆GitHub上的源代码深入研究。项目的核心在于实现CustomAwaiter。
为了实现最简单版本的UnityWebRequestResourceLoader资源加载类,首先需要创建一个Awaiter类,需引用System.Runtime.CompilerServices库,并实现INotifyCompletion接口的OnCompleted方法以及GetAwaiter、IsCompleted、GetResult、Complete方法和属性。业务逻辑类中,将业务逻辑分为两部分:传统Unity协程方法和Awaiter返回值的方法。通过这种方式,主程序可以使用await语法调用。
主程序挂载在场景中的GameObject上,采用await xxx()的写法,使得代码结构更为清晰。对于自定义Async/Await封装Unity协程的过程,其关键在于实现CustomAwaiter和合理安排业务逻辑。在测试中,使用Thread.Sleep模拟耗时任务导致卡顿,这在Unity中可能因单线程导致。调整为WaitForSeconds后,问题得到解决。
通过这个过程,我们能够实现Unity Coroutine的封装到Async/Await模式,使代码逻辑更符合人类习惯,提升代码可读性和维护性。未来,可进一步研究svermeulen的开源项目,利用SynchronizationContext将耗时任务转至其他线程,优化性能。