深入解析:Ref关键字的多重含义与应用领域
è°ç»ç®åä»ç»ä¸ä¸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 2000çä¸ä¸ª"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ç¸åçæ¯,ä¸ä¸ªå符åéå å«çæ¯ä¸ä¸ª16ä½çUnicodeå符.C#æ°çæ°æ®ç±»åæ¯decimalæ°æ®ç±»å,对äºè´§å¸æ°æ®,å®è½åæ¾28ä½10è¿å¶æ°å.
ä¸¤ä¸ªåºæ¬ç±»:ä¸ä¸ªåå«objectçç±»æ¯ææå ¶ä»ç±»çåºç±».èä¸ä¸ªåå«stringçç±»ä¹è±¡object䏿 ·æ¯è¿ä¸ªè¯è¨çä¸é¨å.ä½ä¸ºè¯è¨çä¸é¨åå卿å³çç¼è¯å¨æå¯è½ä½¿ç¨å®--æ è®ºä½æ¶ä½ å¨ç¨åºä¸åå ¥ä¸å¥å¸¦å¼å·çå符串,ç¼è¯å¨ä¼å建ä¸ä¸ªstring对象æ¥ä¿åå®.
åæ°ä¼ é:æ¹æ³å¯ä»¥è¢«å£°ææ¥åå¯åæ°ç®çåæ°.缺ççåæ°ä¼ éæ¹æ³æ¯å¯¹åºæ¬æ°æ®ç±»åè¿è¡å¼ä¼ é.refå ³é®åå¯ä»¥ç¨æ¥å¼ºè¿«ä¸ä¸ªåééè¿å¼ç¨ä¼ é,è¿ä½¿å¾ä¸ä¸ªåéå¯ä»¥æ¥åä¸ä¸ªè¿åå¼.outå ³é®åä¹è½å£°æå¼ç¨ä¼ éè¿ç¨,ä¸refä¸åçå°æ¹æ¯,宿æè¿ä¸ªåæ°å¹¶ä¸éè¦åå§å¼.
ä¸COMçéæ:C#对Windowsç¨åºæå¤§çåç¹å¯è½å°±æ¯å®ä¸COMçæ ç¼éæäº,COMå°±æ¯å¾®è½¯çWin32ç»ä»¶ææ¯.å®é ä¸,æç»æå¯è½å¨ä»»ä½.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#ç®å²ââæèªãç¨åºåãæå¿2005-12æå
C# ç®å²
ç¼è æï¼æ¶é´è¿å¾çå¿«ï¼å± ç¶ç°å¨å°±å¯ä»¥åC#çç®å²äºã使¯æ³æ³ä¹ä¸å¥æªï¼C#å¯è°
èµ·ç¹é«ãåå±å¿«çæ°ä¸ä»£è¯è¨ï¼å®çè¿äºå¹´èµ°è¿äºå¾å¤åè¾åå å¹´çè·¯ãå ¬å å°è¯´ï¼C#æ¯ç®
åå ¼é¡¾ç³»ç»å¼åååºç¨å¼åçæä½³å®ç¨è¯è¨ï¼å¹¶ä¸å¾æå¯è½æä¸ºç¼ç¨è¯è¨åå²ä¸ç第ä¸ä¸ªâå ¨
è½âåè¯è¨ãçè¿è¿ç¯ç®å²ï¼æä»¬é½åºè¯¥æç½ï¼ä¸è¦åæC#çæå¹´è½»åçäºââåªè¦æ¯â马
æå¤çº³âï¼å°±æ©æå½âççâã
C# 1.0ï¼çº¯ç²¹çé¢å对象
彿¶é´å溯å°1998å¹´åºï¼å¾®è½¯æ£å¨å¿äºæ°ä¸ä»£COMç设计工ä½ãæ¤åï¼COMä¸ç´æ¯ç»ä»¶åå¼åä¸é常æåçä¸ç§ææ¯ï¼ä½ç±äºå®ä» æä¾äºäºè¿å¶
å±é¢ä¸çç»ä¸ï¼å æ¤æ æ³å°ç±»åä¿¡æ¯åç¨äºæ¯æåºç¡å¹³å°åå¼åå·¥å ·çä¿¡æ¯æ¾å°ç»ä»¶ä¸ãè¿æ¶ï¼Javaæ£å¨éæ¥èµ°åæçãäºæ¯ï¼å¾®è½¯å¦ä¹ Java
çåæ³ï¼å°èææºçæ¦å¿µå¼å ¥å°äºCOMé¢åï¼åæ¶ï¼å¾®è½¯æåºäºâå æ°æ®âçæ¦å¿µï¼ç¨äºæè¿°ç»ä»¶çç±»åä¿¡æ¯åå·¥å ·æ¯æä¿¡æ¯ï¼å¹¶å³å®å°å ¶æ¾å ¥
å°ç»ä»¶å½ä¸ãè¿ç§âCOMèææºâçååå¨ç»åäºè¥å¹²äºè®ºåï¼æç»è¢«å®ä¸ºCLRï¼Common Language Runtimeï¼å ¬å ±è¯è¨è¿è¡æ¶ï¼ã䏿¤åæ¶ï¼å¾®
软æåºäºå¨è¯¥è¿è¡æ¶ä¸è¿ä½çè¯è¨åºè¯¥éµå¾ªçä¸äºè§åï¼ä»¥åè¯¥èææºçç±»åç³»ç»åæä»¤éââææè¿äºè§èå½¢æäºæç»çC L Iï¼Common
Language Infrastructureï¼å ¬å ±è¯è¨åºç¡è®¾æ½ï¼ï¼å¹¶æäº¤ç»äºECMAå§åä¼ãåæ¶ï¼å¾®è½¯å¼åäºCLIçä¸ä¸ªå®ç°ï¼è¿å°±æ¯å¤§åé¼é¼ç.NETäºã
1998å¹´12æï¼å¾®è½¯å¯å¨äºä¸ä¸ªå ¨æ°çè¯è¨é¡¹ç®ââCOOLï¼è¿æ¯ä¸æ¬¾ä¸é¨ä¸ºCLR设计ç纯é¢å对象çè¯è¨ï¼ä¹æ£æ¯æ¬æç主è§ââC#çå身ãåæ¶
åå¹´æä½ï¼1999å¹´7æä»½ï¼å¾®è½¯å®æäºCOOLè¯è¨çä¸ä¸ªå é¨çæ¬ãç´å°2000å¹´2æä»½ï¼å¾®è½¯ææ£å¼å°COOLè¯è¨æ´å为C#ãæ®è¯´èµ·è¿ä¸ªå忝å 为
C#å¼åå°ç»ç人å¾è®¨åæç´¢å¼æï¼å æ¤æå¤§é¨åæç´¢å¼ææ æ³è¯å«çâ#â å符ä½ä¸ºè¯¥è¯è¨ååçä¸é¨åï¼è¿æä¸ç§è¯´æ³æ¯å¨é³ä¹å½ä¸â#âæ¯
åè°è®°å·ï¼è¡¨è¾¾äºå¾®è½¯å¸æå®å¨Cçåºç¡ä¸æ´ä¸ä¸å±æ¥¼çç¾å¥½æ¿æââå½ç¶è¿äºé½åªæ¯ä¼ è¯´ï¼æ ä»èè¯ã忝åç»äºä¸ç³»åçä¿®æ¹ï¼å¾®è½¯ç»äºå¨
2000å¹´7æåå¸äºC#è¯è¨ç第ä¸ä¸ªé¢è§çãå æ¤äººä»¬ä¸è¬è®¤ä¸ºC#æ¯2000å¹´åå¸çï¼å¹¶ä»¥æ¤æ¥è®¡ç®å®çâå¹´é¾âã卿¤åçä¸å¹´å¤æ¶é´éï¼å¾®è½¯ä¸
ç´å¨ä¿®è¡¥å个æµè¯çæ¬ä¸çBUGãç´å°2002å¹´2æï¼å¾®è½¯ç»äºæ¨åºäºè¿è¿æªä¸å¸çVisual Studio 7.0ï¼å¹¶å°å ¶å®å为âVisualStudio .NET 2002
âãéçè¿å¥å¼åç¯å¢çåºçï¼å¼åè 们ç»äºçå°äºC#è¯è¨ç第ä¸ä¸ªæ£å¼çæ¬ââC# 1.0ãæ¤åï¼å¾®è½¯é©¬ä¸åè¹ï¼Visual Studio乿¢å¤äºå¾æ¥
çå¼åè¿åº¦ãå¨2003å¹´5æï¼å¾®è½¯å¦ææ¨åºäºVisual Studio .NET 2003ï¼åæ¶ä¹åå¸äº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ï¼æ³åç¼ç¨æ°æ¦å¿µ
å¾®è½¯æ¬æç®ç»§ç»ä¿è¯å¼åè¿åº¦ï¼å¹¶å¨2004å¹´æ¨åºVisual Studio .NET 2004ï¼ä½ç±äºå ¶é´è½¯ä»¶å·¥ç¨å¦å°¤å ¶æ¯è½¯ä»¶ç®¡çå¦çå¤§è§æ¨¡è¿æ¥ï¼å¾®è½¯ææ
ä¾çè¿ç§ä» å ·å¤å¼ååè°è¯åè½çIDEå·²ç»æ æ³æ»¡è¶³å¢éå¼åçéæ±ãå æ¤å¾®è½¯å³å®å¨é¡¹ç®è®¾è®¡å管çå·¥å ·æ¹é¢è¿è¡äºè¿ä¸æ¥ç åï¼å¹¶å°å ¶éæ
å°Visual Studioä¸ï¼ä»¥èµ¢ååæçå¸åºãå æ¤ï¼å¾®è½¯å°Visual Studio.NET 2004âæ¹åâ为Visual Studio 2005ï¼å¹¶å³å®æ¨è¿ä¸å¹´åå¸ãä¸è¿
ï¼å¾®è½¯è¿æ¯åæå¨2004å¹´ç6æä»½åå¸äºVisual Studio2005ç第ä¸ä¸ªBeta çï¼åæ¶åå¼åè å±ç¤ºäºC#è¯è¨ç2.0çæ¬ã2005å¹´4æï¼å¾®è½¯åå¸äº
Visual Studio 2005 Beta2ï¼è¿å·²ç»æ¯å ·å¤äºå ä¹å ¨é¨åè½çVisualStudioï¼å æ¬ç产åæSQL Server2005ã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ï¼é鬼
å¨ç»åäºä¸ç³»åçæ¹è¿åå®ååï¼å¾®è½¯å³å®äº2005å¹´11æåå¸Visual Studio2005ï¼è¯¥å¼åç¯å¢å°æ£å¼æ¯æC#2.0ãç±äºæ¤åæ¨åºäºæ°ä¸ªé¢è§ç
åæµè¯çï¼å¤§å®¶çæå¾ 乿 ä¼¼ä¹å·²ç»ä¸æ¯é£ä¹å¼ºçäºãè2005å¹´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ï¼çå¼åãä¸ä¸ªæåçå¼å人åå¨é¢å¯¹æ°é²äºç©åæ°çå°é¾æ¶ï¼å ´å¥æ¯è¿å¤§äºææ§çã
让é鬼æ¥å¾æ´ççäºå§ï¼
MySQL之EXPLAIN全方位详解
在MySQL中,使用EXPLAIN关键字可以模拟查询优化器执行SQL语句,分析出SELECT语句的执行逻辑,帮助排查性能问题和优化SQL语句。通过EXPLAIN,可以直观地了解SQL执行计划,判断是否有效利用了索引,是否进行了全表扫描,从而进行针对性优化。接下来,让我们深入了解EXPLAIN的各个方面。
### 应用场景
日常工作中,面对耗时较长的SQL语句,通过打印和分析,可以使用EXPLAIN来查看SQL执行计划,判断索引使用情况和扫描方式,为后续优化提供依据。
### 概述
EXPLAIN关键字在SQL查询中用于分析语句执行逻辑,它可以揭示查询优化器如何处理SQL,帮助理解执行计划,有效利用索引,避免全表扫描,提升查询性能。
### SQL执行计划解析
查询优化器的主要目标是利用索引,选择最严格的索引排除最多数据行。排除数据行越快,找到匹配数据行的速度就越快。优先测试严格条件有助于加速查询。
### EXPLAIN属性详解
#### 准备两张表
表1和表2字段相同,`id`为主键索引,`uni_key`为唯一索引,`key_1`、`key_2`和`key_3`为普通索引,`c_key_1`、`c_key_2`和`c_key_3`建立了联合索引。
### EXPLAIN属性列含义
#### id
每个执行部分对应一个id,id值越大优先级越高,id相同则执行顺序由上至下,NULL值表示最后执行。
#### select_type
定义查询在计划中的角色,如SIMPLE、PRIMARY、UNION、SUBQUERY、DEPENDENT SUBQUERY等。
#### table
表示访问的表名,无论查询多复杂,最后都会单表访问。
#### type
标识关联类型或访问类型,系统、const、eq_ref、ref、range、index、ALL,最优到最差排序。
#### possible_keys
可能使用的索引,空值表示没有可用索引。
#### key
实际使用的索引,为NULL表示未使用索引。
#### key_len
使用索引记录的最大长度,用于评估索引效率。
#### ref
等值匹配的列或常量。
#### rows
预计扫描的索引记录行数或预计扫描的行数。
#### Extra
额外信息,如No tables used、Impossible WHERE等。
通过这些属性,可以深入分析查询的执行策略,优化SQL语句,提高查询效率。理解并应用EXPLAIN,是数据库性能优化的重要手段。
“Samref”缩写为何意?
英语缩写词“Samref”通常代表“Saudi Aramco Mobile Refinery Company”,中文名直译为“沙特阿美移动炼油公司”。本文将深入解析Samref的含义,包括其英文全称的中文拼音(shā tè ā měi yí dòng liàn yóu gōng sī),以及它在商业领域的分类——商务缩写词,适用于公司企业。它在英语中的流行度和实际应用示例如何,也将一并提供。
“Samref”这个缩写词实际上指的是Saudi Aramco Mobile Refinery Company,这是一个移动炼油公司的专业术语。通过这个缩写,我们可以快速识别其英文原意,同时在商业交流中节省空间。它的应用广泛,尤其是在石油和能源行业,用于描述阿美公司移动炼油设施的相关操作或项目。
请注意,尽管“Samref”在互联网上广泛使用,但请确保准确引用和理解其含义,因为信息来源于网络,仅为学习和交流之用,版权归属原作者,使用时应谨慎辨别,避免潜在风险。
什么是“GEOREF”?
英语缩写“GEOREF”在学术和专业领域中通常代表"World GEOgraphic REFerence System",中文直译为“世界地理参考系”。这个系统是一个标准化的地理坐标系统,用于定位和描述地球上的地理位置。本文将深入解析GEOREF的含义,包括其英文全称的拼音"shì jiè dì lǐ cān kǎo xì",以及它在政府和军事领域的分类,以及其在地图制作、导航系统和科学研究等应用中的广泛使用。
作为官方缩写,GEOREF在英语中的流行度表明其在地理信息处理和全球定位系统中占据重要地位。了解这个缩写,可以帮助人们在跨文化交流和专业文档中准确理解和使用。其应用示例如地图制作软件中的坐标输入,或者GPS定位设备中的坐标表示。
请注意,虽然网络上广泛使用GEOREF,但所有信息仅供参考,使用者应自行确认其准确性和适用性,以避免潜在的风险。版权归属原作者,仅限于学习和交流目的。
深入研究ast-grep的模式: 一文解析Tree-Sitter核心概念
如果你对代码重构工具有兴趣,你可能听说过 ast-grep,它是一个基于 Tree-sitter 的工具,可以进行结构搜索和替换。 ast-grep 允许你编写代码模式,根据代码的结构,而不仅仅是文本来查找和修改代码。但它是如何在引擎盖下工作的呢?在这篇文章中,我将为你深入介绍ast-grep的模式。它还能帮助你理解Tree-sitter的核心概念。
模式是一种写和读描述语法树的表达式的方便方法。 它类似于代码,但有一些特殊的语法和语义,允许你根据语法树的结构、类型或内容来匹配部分。
ast-grep的模式易学难精。它要求你了解目标语言的Tree-sitter语法和含义,以及ast-grep的规则和惯例。
在本文中,我们将帮助你掌握所有基于Tree-sitter的工具所共有的核心概念。我们还将向你展示如何编写ast-grep模式,让它的全部威力都为你所用。
什么是Tree-sitter? ast-grep使用 Tree-sitter作为它的底层解析框架,这是因为它的流行度、高性能和健壮性。
Tree-sitter是一个生成解析器的工具,并提供一个增量解析库。
解析器是一个将源代码文件作为输入并产生一个描述代码组织的树状结构的程序。(该树状结构不是抽象语法树,我们将在后面看到)。
为各种编程语言编写优秀的解析器是一项艰巨的任务,尤其是对于像ast-grep这样的单一项目。幸运的是,Tree-sitter是一个被社区广为传唱的好工具。许多主流语言,如C、Java、JavaScript、Python、Rust等,都被Tree-sitter支持。使用Tree-sitter作为ast-grep的底层解析库,可以让这个工具支持任何具有良好维护的语法的语言。
Tree-sitter的另一个好处是它的增量性质。增量解析器是指当源代码文件被编辑时能够有效地更新语法树的解析器,而不需要重新解析整个文件。在 ast-grep的交互式编辑中,它可以非常快速地运行在每一个代码变化上。
最后,Tree-sitter还可以优雅地处理语法错误,它可以在同一个文件中解析多种语言。这使得模式代码的解析更加稳健,更容易编写。在未来,我们还可以像Vue那样支持多语言的源代码。
当你使用 ast-grep 来搜索源代码中的模式时,你需要了解文本匹配和结构匹配之间的区别。
源代码输入是文本,是遵循某些语法规则的字符序列。你可以使用常见的搜索工具,如 silver-searcher或 ripgrep来搜索源代码中的文本模式。
然而,ast-grep并不直接与文本匹配模式。相反,它将文本解析成一个代表代码语法的树状结构。这使得ast-grep能够根据代码的语义来匹配模式,而不仅仅是其表面现象。这就是所谓的 结构搜索,它搜索的是具有特定结构的代码,而不仅仅是特定的文本。
因此,你写的模式也必须是有效的语法,可以与代码树进行比较。
ast-grep中的文本搜索 虽然pattern在结构上匹配代码,但你可以使用ref=" ast-grep.github.io/guid...">原子规则regex通过指定正则表达式来匹配节点的文本。这样,就可以在ast-grep中结合文本和结构匹配。
我们可以用两种类型的树结构来表示代码的语法和语义: AST和CST。
AST代表 抽象语法树,它是代码的简化表示,省略了一些细节,如标点符号和空白处。CST代表 具体语法树(Concrete Syntax Tree),它是对代码的一种更保真的表示,包括所有的细节。
Tree sitter是一个库,可以将代码解析为许多编程语言的CST。因此,ast-grep与它的名字相反,是根据CST模式而不是AST来搜索和重写代码的。
让我们通过一个例子来看看为什么CST更有意义。考虑一下1 + 1这个JavaScript片段。它的AST表示法 看起来像这样:
精明的读者应该注意到重要的运算符+并没有在AST中被编码。与此同时,代码的CST则忠实地表达了所有的关键信息。
你可能会想,使用CST是否会让不重要的空白影响你的搜索结果。幸运的是,ast-grep使用了一种智能匹配算法,可以在适当的时候跳过CST中的琐碎节点,帮你节省了很多麻烦。
如果不关心标点符号和空白,我们就可以将CST转换为AST。Tree-sitter有两种类型的节点:命名节点和匿名节点(未命名节点)。
更重要的命名节点在语法规则中被定义为常规名称,如binary_expression或identifier。不太重要的匿名节点是用字面字符串定义的,如", "或 "+"。
命名节点对于理解代码的结构和意义更为重要,而匿名节点则不那么重要,有时会被 ast-grep 的匹配算法跳过。
下面的例子改编自 Tree-sitter的官方指南,显示了语法定义的不同。
实际上,命名的节点有一个叫做kind的属性,表示它们的名字。你可以使用ast-grep的ref=" ast-grep.github.io/guid...">原子规则kind来找到具体的AST节点。下面的例子的 Playground链接。
更进一步,ast-grep的元变量默认只匹配命名的节点。return $A 只匹配下面的第一条语句。 Playground链接。
我们可以使用两个米元符号(非笔误)$$VAR在模式匹配的结果中包括匿名节点。return $$A将匹配上面的两个语句。 Playground链接。
有时,仅仅使用kind并不足以找到我们想要的节点。一个节点可能有几个具有相同kind的子节点,但在代码中的作用不同。例如,在JavaScript中,一个对象可能有多个键和值,但它们都可以是字符串。
为了区分它们,我们可以使用field来指定一个节点和它的父节点之间的关系。在ast-grep中,field可以用在两个 关系规则中:has和inside。
has和inside接受一个特殊的配置项,叫做field。field的值是父-子关系的字段名。例如,JavaScript对象中的键值对有两个孩子:一个字段是key,另一个字段value。我们可以用 这个规则来匹配string的key节点。
field可以帮助我们缩小搜索范围,使模式更加精确。
我们也可以用has重写上面的规则,搜索带有字符串key的键值对。 Playground链接。
kind和field的关键区别: kind是节点本身的属性。只有命名节点才有。 field是父子关系的属性。匿名节点也可以有。
一个节点同时拥有kind和field可能会让新用户感到困惑。kind属于节点本身,在ast-grep的Playground上用蓝色文本表示。子节点只有相对于它的父节点才有field,反之亦然。字段在Playground中用深**文本表示。由于field是节点关系的一个属性,匿名节点也可以有field。例如,binary_expression的1 + 1中的+的field就是operator。
ast-grep比Tre-sitter走得更远。它有关于节点的 "重要性 "的概念。
即使是“重要性”这个概念也是不够的。 大多数Tree-Sitter语言没有在命名节点AST中编码所有的关键语义。即使我们定义了范围更广的显著节点,也不足以表示代码的意义。我们必须保留一些琐碎节点来进行精确匹配。
Tree-sitter一般不会用命名节点来编码所有的语义。例如,class A { get method() {} } 和 class A { method() {} } 在Tree-sitter的AST中是等同的。关键标记get没有命名,也没有field。它是一个琐碎节点!
如果你不关心这个方法是getter方法、静态方法还是实例方法,你可以使用class $A { method() {} }来 一次性匹配所有三种方法。如果你需要区分getter方法和普通方法,你可以 拼出完整的方法修饰符。
感谢你阅读到这里! 这篇文章中有许多概念。让我们用一段话来总结一下。
ast-grep使用Tree-sitter将文本源代码解析成一个详细的树状结构,称为CST。我们可以从CST中得到AST,只保留命名节点,这些节点有kind。为了搜索语法树中的节点,可以同时使用节点kind和节点field,后者是一个子节点相对于其父节点的特殊标记。一个有kind或者有field的节点就是一个重要的节点。
MySQL explain执行计划详解
在数据库领域,MySQL的explain关键字扮演着关键角色。它能帮助我们模拟优化器执行SQL语句,揭示SQL性能瓶颈所在。
要使用explain,只需在SQL语句前添加它即可。例如,执行如下命令:
解释结果包括多个字段,每个字段代表SQL执行的不同方面。下面以users表为例,假设其包含联合索引name_age_school。
我们执行以下查询:
查询结果如下,详细解析各个字段含义:
1. ID:select查询的序列号,表明查询或操作表的执行顺序。可能有三种结果。
2. SELECT_TYPE:查询类型,共有6种可能值。
3. TYPE:查询类型,显示所用的查询方法。
4. TABLE:查询涉及的表名。
5. POSSIBLE_KEYS:可能应用的索引列表,若查询字段有索引,则会列出。
6. KEY:实际使用的索引。若未使用索引,该值为NULL。若使用覆盖索引,则仅显示该索引。
7. KEY_LEN:索引字段的使用长度,表示索引中使用的字节数。
8. REF:使用索引的列,以及在索引列上查找值的列或常量。
9. ROWS:根据统计信息和索引选择,估算所需的行数。
10. PARTITIONS:匹配的分区信息。
11. FILTERED:查询行数占总行数的百分比。
12. EXTRA:包含重要但不适合在其他列中显示的额外信息。
有时,explain结果与预期不符,可能是因为MySQL优化器在成本计算时选择了不同的执行路径。此时,我们可以借助trace工具深入了解。
例如,我们观察以下SQL语句的执行计划:
解释结果中未使用任何索引。为了深入了解执行成本,可使用trace工具进行详细分析。
“REF”作为“Referee”的缩写,它在英语中通常用于哪个领域?
英语缩写词"REF"在中文中通常被译为"裁判员",其英文原词是"Referee"。本文将深入解析REF的含义、中文发音(cái pàn yuán),以及其在英语中的普遍使用情况,包括流行度、分类和应用领域。REF主要应用于体育领域,下面是一些具体示例:
比赛将由来自威尔士的Derek Bevan担任裁判:The match will be refereed by Derek Bevan from Wales.
Vautrot曾执法过两届世界杯:Vautrot has refereed in two World Cups.
裁判Michael Reed毫不犹豫地判给了点球:Referee (REF) Michael Reed had no hesitation in awarding a penalty.
警察护送裁判离开足球场:Policemen had to escort the referee from the football field.
Lawrence无视规则撞人,但裁判未予警告:Lawrence kept on butting me but the referee did not warn him.
REF作为Referee的缩写,主要用于网络交流和学习,版权归属原作者。请注意,这些信息仅供参考,读者在使用时需自行甄别。
“REF”代表什么?
英语中,“REF”这个缩写词通常对应于“Régimen Económico Fiscal”,中文译为“经济财政制度”。此篇文章将深入解析REF的含义,包括其英文全称、中文拼音、详细解释以及在英语中的广泛使用情况。我们还将探讨REF的分类、适用领域以及具体的使用示例。
具体来说,"REF"的全称为"Régimen Económico Fiscal",在英语中的流行度为267,表明它在特定语境中较为常见。从分类上看,它属于国际缩写词,主要应用于西班牙语领域。通过了解这些信息,可以帮助我们更好地理解和使用这个缩写词。
这个缩写词主要用于表示经济财政方面的制度,例如在讨论国家的经济政策或财政管理时,"REF"可以简洁地代表“经济财政制度”。然而,需要注意的是,尽管REF在网络和学术环境中广泛使用,但请确保在引用时确保信息的准确性和版权,仅为学习和交流目的。
major/minor/reference/alternative/risk/effect allele 概念解析
在遗传学领域,理解allele的各种概念是至关重要的。近期,@橙子牛奶糖的见解引发了我对allele分类的思考,特别是major、minor、reference、alternative、risk以及effect allele。这些术语在实际应用中容易混淆,但它们在不同的上下文中扮演着关键的角色。让我们一起深入解析这些概念,以避免误解和错误。
1. 频率主导的major与minor allele
major和minor allele的区分基于特定群体的频率。在一个二态SNP(单核苷酸多态性)环境中,频率最高的那个allele被称为major allele,频率较低的则是minor allele。在多态性更高的SNP中,minor allele通常是指频率第二高的。例如,在PLINK 1.9中,MAF(minor allele frequency)会显示A1(minor allele)的频率,如SNP1中的T(MAF为0.1258)。
2. 与参考基因组相关的reference与alternative allele
reference和alternative allele的概念不再与频率挂钩,而是基于所选择的参考基因组。参考基因组上的allele往往被标记为major,但并非总是如此。在PLINK 2中,ref和alt的概念保持明确,如SNP1的T是ref allele,但因其在群体中的频率较低,也是minor allele。使用plink2 --ref-from-fa可以将数据与参考基因组对齐,确保准确性。
关联检验中的reference与risk/effect allele
在关联检测中,reference allele(non-risk或non-effect)是效应估计的基准,与参考基因组中的ref/alt概念分离。早期研究中,minor allele常被作为reference allele,但现在,为了消除混淆,研究者倾向于保持与reference genome的统一。risk allele则是与疾病关联的allele,常见于minor allele,而effect allele则关注其对表型或疾病的影响。
理解这些基本概念后,我们在处理遗传数据时就能游刃有余,避免混淆。记住,无论使用哪种表述方式(如A1、A2),关键在于理解背后的生物学含义。希望这篇文章能帮助你在遗传数据分析中更加准确地运用这些概念。
参考资料:
“REF”指代“参考文献”时的详细含义和应用
英语中的“REF”一词通常作为“参考文献</”的缩写,中文即为“cān kǎo wén xiàn”。本文将深入探讨这一缩写词的含义,包括其英文原词“REFerences”,以及它在英语中的使用频率、分类和常见应用场景。REF在社区和住房设施领域中具有一定的流行度,共267次引用。
REF</的中文解释是,它代表了对文献的引用和参考,特别是在文件处理和学术交流中,如推断文件的日期通过提及内战,间接地讨论对手,或者在文学创作中作为作品参考的汇集。例如,小说中可能充满了文学引用,而在文件解析中,它还涉及对目录定义的引用。
这个缩写词的广泛使用,体现了它在学术交流中的重要性,是理解历史、分析观点和构建知识体系时不可或缺的一部分。请记住,REF</作为“参考文献”的缩写,是网络上广泛传播和学习的资源,但请注意版权和信息的准确性,以避免潜在风险。
相关文章
发表评论