文章編號:11717時間:2024-10-01人氣:
ListBox控件是VB.NET中一種非常有用的控件,它允許用戶在一個列表中選擇多個項目。
ListBox控件引發(fā)以下事件:
ListBox控件的常用屬性包括:
ListBox控件常用的方法包括:
ListBox控件是一個非常強大的控件,可以用來創(chuàng)建各種用戶界面元素。它可以用來顯示簡單的文本列表、綁定到數(shù)據(jù)源或顯示自定義格式的項目。
ListBox控件可以通過
ListBox控件可以通過MultiColumn屬性顯示多列項目。這使您可以創(chuàng)建更復(fù)雜的列表視圖。
例如,以下代碼創(chuàng)建了一個顯示三列項目的列表框:
```vbnetListBox1.MultiColumn = TrueListBox1.Columns.Add("Column1")ListBox1.Columns.Add("Column2")ListBox1.Columns.Add("Column3")ListBox1.Items.Add(New String() {"Item1", "Item2", "Item3"})ListBox1.Items.Add(New String() {"Item4", "Item5", "Item6"})```ListBox控件是一個功能強大且用途廣泛的控件,可以用來創(chuàng)建各種用戶界面元素。它易于使用并支持多種屬性、事件和方法,使您可以自定義其行為和外觀。
C#(讀做 C sharp,中文譯音“夏普”)是微軟公司發(fā)布的一種面向?qū)ο蟮摹⑦\行于 Framework之上的高級程序設(shè)計語言,并定于在微軟職業(yè)開發(fā)者論壇(PDC)上登臺亮相.C#是微軟公司研究員ANDers Hejlsberg的最新成果.C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司 windows網(wǎng)絡(luò)框架的主角. 在本文中,我將考察創(chuàng)建一種新計算機語言的一般動機,并將特別指明是什么原因?qū)е铝薈#的出現(xiàn).然后我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在于Java和C#之間的高層次的,和基礎(chǔ)的差別.我將以衡量在用多種語言開發(fā)大型應(yīng)用程序的時候所需的知識(或者對這種知識的缺乏程度)來結(jié)束本文,而這正是和C#的一個主要戰(zhàn)略.目前,C#和還只能以C#語言規(guī)則,以及Windows 2000的一個d預(yù)覽版本,還有MSDN上迅速增多的文檔集子的形式獲得(還沒有最終定型). 微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設(shè)計者從C++繼承的可選選項方面比Java要廣泛一些(比如說structs),它還增加了自己新的特點(比方說源代碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進化成一種開發(fā)者能夠接受和采用的語言.而微軟當(dāng)前為它的這種新語言大造聲勢也是值得注意的.目前大家的反應(yīng)是:這是對Java的反擊. C#更象Java一些,雖然微軟在這個問題上保持沉默.這也是意料中的事情,我覺得,因為Java近來很成功而使用Java的公司都報告說它們在生產(chǎn)效率上比C++獲得了提高. Java所帶來的巨大影響和大家對它的廣泛接受已經(jīng)由工作于這種語言和平臺之上的程序員數(shù)量明顯的說明了(估計世界范圍內(nèi)共有兩百五十萬程序員使用Java).由這種語言寫成的應(yīng)用程序的數(shù)量是令人驚訝的并已經(jīng)滲透了每一個級別的計算,包括無線計算和移動電話(比如日本發(fā)明的Java電話).C#能夠在用戶領(lǐng)域獲得這樣的禮遇嗎?我們必須等待并觀望,就象已經(jīng)由SSI公司的CEO和主席Kalpathi S. Suresh指出來的那樣,我發(fā)現(xiàn)所有這些都是漸進的.如果C#不存在,我們總能回到Java或C和C++.這些都不完全是新技術(shù);它們在更大的意義上來說只是大公司制造的市場噱頭.我們必須給他們時間安頓下來看看這些是不是真的對IT工業(yè)有什么影響. C#從Java繼承而來的特點 類:在C#中類的申明與Java很相似.這是合理的因為經(jīng)驗告訴我們Java模型工作得很好的關(guān)鍵字import已經(jīng)被替換成using,它起到了同樣的作用.一個類開始執(zhí)行的起點是靜態(tài)方法Main().下面的Hello World程序展示了基本的形式: using System; class Hello { static void Main() { (Hello, world); } } 在這個例子中,System這個名字指向一個包括了基本C#實用類集合的命名空間(namespace).這個命名空間包括了Console類,它在這個例子中被用來輸出一個字符串.類可以是抽象的和不可繼承的:一個被申明成abstract的類不能被實例化;它只能被用做一個基類.C#關(guān)鍵字sealed就象Java關(guān)鍵字final,它申明一個類不是抽象的,但是它也不能被用做另一個類的基類.界面:就象在Java中一樣,一個界面是一組方法集合的抽象定義.當(dāng)一個類或結(jié)構(gòu)體實現(xiàn)一個界面的時候,它必須實現(xiàn)這個界面中定義的所有方法.一個單一的類可以實現(xiàn)幾個界面.也許以后會出現(xiàn)一些微妙的差別,但是這個特點看起來與Java相比沒有變化.布爾運算:條件表達(dá)式的結(jié)果是布爾數(shù)據(jù)類型,布爾數(shù)據(jù)類型是這種語言中獨立的一種數(shù)據(jù)類型.從布爾類型到其他類型沒有直接的轉(zhuǎn)換過程.布爾常量true和false是C#中的關(guān)鍵字.錯誤處理:如Java中那樣,通過拋出和捕捉異常對象來管理錯誤處理過程.內(nèi)存管理:由底層框架進行自動內(nèi)存垃圾回收. C#從C和C++繼承的特點 編譯:程序直接編譯成標(biāo)準(zhǔn)的二進制可執(zhí)行形式.但C#的源程序并不是被編譯成二進制可執(zhí)行形式,而是一中中間語言,類似于JAVA字節(jié)碼。
如果前面的Hello World程序被保存成一個文本文件并被命名為,它將被編譯成命的可執(zhí)行程序. 結(jié)構(gòu)體:一個C#的結(jié)構(gòu)體與C++的結(jié)構(gòu)體是相似的,因為它能夠包含數(shù)據(jù)聲明和方法.但是,不象C++,C#結(jié)構(gòu)體與類是不同的而且不支持繼承.但是,與Java相同的是,一個結(jié)構(gòu)體可以實現(xiàn)界面. 預(yù)編譯:C#中存在預(yù)編譯指令支持條件編譯,警告,錯誤報告和編譯行控制.可用的預(yù)編譯指令有: #define #undef #if #elif #else #endif #warning #error #line [] 沒有了#include 偽指令.你無法再用#define 語句對符號賦值,所以就不存在源代碼替換的概念--這些符號只能用在#if和#elif偽指令里.在#line偽指令里的數(shù)字(和可選的名字)能夠修改行號還有#warning和#error輸出結(jié)果的文件名. 操作符重載:一些操作符能夠被重載,而另一些則不能.特別的是,沒有一個賦值運算符能夠被重載.能夠被被重載的單目操作符是: + - ! ~ ++ -- true false 能夠被重載的二元運算符是: + - * / % & | ^ << >> == != > < >= <= C#獨有的特點 C#最引人入勝的地方是它和Java的不同,而不是相似的地方.這一節(jié)(和這個系列第二部分的大部分地方)講述了C#實現(xiàn)的和Java不同的地方或者Java根本沒有的特點. 中間代碼:微軟在用戶選擇何時MSIL應(yīng)該編譯成機器碼的時候是留了很大的余地.微軟公司很小心的聲稱MSIL不是解釋性的,而是被編譯成了機器碼.它也明白許多--如果不是大多數(shù)的話--程序員認(rèn)為Java程序要不可避免的比C編寫的任何東西都要慢.而這種實現(xiàn)方式?jīng)Q定了基于MSIL的程序(指的是用C#,Visual Basic,Managed C++--C++的一個符合CLS的版本--等語言編寫的程序)將在性能上超過解釋性的Java代碼.當(dāng)然,這一點還需要得到事實證明,因為C#和其他生成MSIL的編譯器還沒有發(fā)布.但是Java JIT編譯器的普遍存在使得Java和C#在性能上相對相同.象C#是編譯語言而Java是解釋性的,之類的聲明只是商業(yè)技巧的中間代碼和MSIL都是中間的匯編形式的語言,它們在運行時或其它的時候被編譯成機器代碼. 命名空間中的申明:當(dāng)你創(chuàng)建一個程序的時候,你在一個命名空間里創(chuàng)建了一個或多個類.同在這個命名空間里(在類的外面)你還有可能聲明界面,枚舉類型和結(jié)構(gòu)體.必須使用using關(guān)鍵字來引用其他命名空間的內(nèi)容. 基本的數(shù)據(jù)類型:C#擁有比C,C++或者Java更廣泛的數(shù)據(jù)類型.這些類型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一樣,所有這些類型都有一個固定的大小.又象C和C++一樣,每個數(shù)據(jù)類型都有有符號和無符號兩種類型.與Java相同的是,一個字符變量包含的是一個16位的Unicode字符.C#新的數(shù)據(jù)類型是decimal數(shù)據(jù)類型,對于貨幣數(shù)據(jù),它能存放28位10進制數(shù)字. 兩個基本類:一個名叫object的類是所有其他類的基類.而一個名叫string的類也象object一樣是這個語言的一部分.作為語言的一部分存在意味著編譯器有可能使用它--無論何時你在程序中寫入一句帶引號的字符串,編譯器會創(chuàng)建一個string對象來保存它. 參數(shù)傳遞:方法可以被聲明接受可變數(shù)目的參數(shù).缺省的參數(shù)傳遞方法是對基本數(shù)據(jù)類型進行值傳遞關(guān)鍵字可以用來強迫一個變量通過引用傳遞,這使得一個變量可以接受一個返回值關(guān)鍵字也能聲明引用傳遞過程,與ref不同的地方是,它指明這個參數(shù)并不需要初始值. 與COM的集成:C#對Windows程序最大的賣點可能就是它與COM的無縫集成了,COM就是微軟的Win32組件技術(shù).實際上,最終有可能在任何語言里編寫COM客戶和服務(wù)器端.C#編寫的類可以子類化一個以存在的COM組件;生成的類也能被作為一個COM組件使用,然后又能使用,比方說,JScript語言子類化它從而得到第三個COM組件.這種現(xiàn)象的結(jié)果是導(dǎo)致了一個運行環(huán)境的產(chǎn)生,在這個環(huán)境里的組件是網(wǎng)絡(luò)服務(wù),可用用任何語言子類化. 索引下標(biāo):一個索引與屬性除了不使用屬性名來引用類成員而是用一個方括號中的數(shù)字來匿名引用(就象用數(shù)組下標(biāo)一樣)以外是相似的. public class ListBox: Control { private string[] items; public string this[int index] { get { return items[index]; } set { items[index] = value; Repaint(); } } } 可以用一個循環(huán)器來匿名引用字符串內(nèi)部數(shù)組成員,就象下面這樣: ListBox listBox = ...; listBox[0] = hello; (listBox[0]); 代理和反饋:一個代理對象包括了訪問一個特定對象的特定方法所需的信息.只要把它當(dāng)成一個聰明的方法指針就行了.代理對象可以被移動到另一個地方,然后可以通過訪問它來對已存在的方法進行類型安全的調(diào)用.一個反饋方法是代理的特例關(guān)鍵字用在將在事件發(fā)生的時候被當(dāng)成代理調(diào)用的方法聲明.補充:C#簡史——摘自《程序員》雜志2005-12月刊C# 簡史編者按:時間過得真快,居然現(xiàn)在就可以寫C#的簡史了。
但是想想也不奇怪,C#可謂起點高、發(fā)展快的新一代語言,它的這五年走過了很多前輩十幾年的路。
公允地說,C#是目前兼顧系統(tǒng)開發(fā)和應(yīng)用開發(fā)的最佳實用語言,并且很有可能成為編程語言歷史上的第一個“全能”型語言。
看過這篇簡史,我們都應(yīng)該明白,不要再把C#看成年輕后生了——只要是“馬拉多納”,就早晚當(dāng)“球王”。
C# 1.0,純粹的面向?qū)ο螽?dāng)時間回溯到1998年底,微軟正在忙于新一代COM的設(shè)計工作。
此前,COM一直是組件化開發(fā)中非常成功的一種技術(shù);但由于它僅提供了二進制層面上的統(tǒng)一,因此無法將類型信息和用于支持基礎(chǔ)平臺和開發(fā)工具的信息放到組件中。
這時,Java正在逐步走向成熟。
于是,微軟學(xué)習(xí)Java的做法,將虛擬機的概念引入到了COM領(lǐng)域;同時,微軟提出了“元數(shù)據(jù)”的概念,用于描述組件的類型信息和工具支持信息,并決定將其放入到組件當(dāng)中。
這種“COM虛擬機”的名字在經(jīng)歷了若干爭論后,最終被定為CLR(Common Language Runtime,公共語言運行時)。
與此同時,微軟提出了在該運行時上運作的語言應(yīng)該遵循的一些規(guī)則,以及該虛擬機的類型系統(tǒng)和指令集——所有這些規(guī)范形成了最終的C L I(Common Language Infrastructure,公共語言基礎(chǔ)設(shè)施),并提交給了ECMA委員會。
同時,微軟開發(fā)了CLI的一個實現(xiàn),這就是大名鼎鼎的了。
1998年12月,微軟啟動了一個全新的語言項目——COOL,這是一款專門為CLR設(shè)計的純面向?qū)ο蟮恼Z言,也正是本文的主角——C#的前身。
歷時半年有余,1999年7月份,微軟完成了COOL語言的一個內(nèi)部版本。
直到2000年2月份,微軟才正式將COOL語言更名為C#。
據(jù)說起這個名字是因為C#開發(fā)小組的人很討厭搜索引擎,因此把大部分搜索引擎無法識別的“#” 字符作為該語言名字的一部分;還有一種說法是在音樂當(dāng)中“#”是升調(diào)記號,表達(dá)了微軟希望它在C的基礎(chǔ)上更上一層樓的美好愿望——當(dāng)然這些都只是傳說,無從考證。
又是歷經(jīng)了一系列的修改,微軟終于在2000年7月發(fā)布了C#語言的第一個預(yù)覽版。
因此人們一般認(rèn)為C#是2000年發(fā)布的,并以此來計算它的“年齡”。
在此后的一年多時間里,微軟一直在修補各個測試版本中的BUG。
直到2002年2月,微軟終于推出了遲遲未上市的Visual Studio 7.0,并將其定名為“VisualStudio 2002”。
隨著這套開發(fā)環(huán)境的出爐,開發(fā)者們終于看到了C#語言的第一個正式版本——C# 1.0。
此后,微軟馬不停蹄,Visual Studio也恢復(fù)了往日的開發(fā)進度。
在2003年5月,微軟如期推出了Visual Studio 2003,同時也發(fā)布了C#的改進版本——C# 1.1。
這一時期的C#(以下稱為C# 1.x)提出了純粹的面向?qū)ο蟾拍睿⒃谡Z言特性中展現(xiàn)得淋漓盡致。
C++并非純面向?qū)ο蟮模瑸榱撕虲兼容以及提供更高的執(zhí)行效率,它保留了很多模塊化的東西。
Java盡管號稱是面向?qū)ο蟮模珜嶋H上,對于對象所應(yīng)該具備的三種構(gòu)成結(jié)構(gòu)——屬性、方法和事件,Java僅提供了方法,其它兩種結(jié)構(gòu)都要通過方法來模擬。
在C# 1.x中,所有面向?qū)ο蟮母拍疃荚谡Z言中得到了非常好的體現(xiàn)。
同時,C#還通過類類型、值類型和接口類型的概念形成了統(tǒng)一的類型系統(tǒng)。
C#使用了大家所熟知的語法實現(xiàn)了方法,以至于很多人認(rèn)為C#和Java、C++等面向?qū)ο笳Z言“非常相像”,這使得從使用其他面向?qū)ο笳Z言轉(zhuǎn)到使用C#的過程非常簡單。
此外,C#還通過無參數(shù)列表的方法聲名語法,結(jié)合get/set訪問器實現(xiàn)了優(yōu)雅的屬性語法。
其中的get訪問器相當(dāng)于獲取屬性值的方法,可以通過一些運算返回最終的結(jié)果,而不是簡單地返回一個變量的值;而set訪問器相當(dāng)于設(shè)置屬性值的方法,在其中可以進行一系列檢測,最后將屬性值賦給相應(yīng)的變量。
同時,通過同時提供get和set訪問器、只提供get訪問器和只提供set訪問器,還可以很方便地實現(xiàn)可讀寫、只讀和只寫的屬性。
C#的這種屬性語法,使得一個屬性在提供該屬性的類的內(nèi)部看來,非常像一組方法;而對于外部調(diào)用類看來,訪問一個對象的屬性和訪問它的公共域沒有任何區(qū)別。
通過委托(稍后介紹),結(jié)合關(guān)鍵字event,C#提供了優(yōu)雅的事件概念。
使用+=運算符,開發(fā)者可以非常方便地將一個事件處理器關(guān)聯(lián)到一個事件上,這個過程稱之為“訂閱”一個事件。
由于委托內(nèi)部封裝了一個調(diào)用鏈表,因此可以方便地為一個事件添加多個事件處理器,這些處理器會自動地依次調(diào)用。
多年的開發(fā)語言進化證明,函數(shù)指針是非常重要也是非常危險的語言特征之一。
同時,基于函數(shù)指針的回調(diào)機制也Windows 核心概念之一。
然而,由于函數(shù)指針很難驗證參數(shù)的類型準(zhǔn)確性,因此C#(確切地說是CLI)提出了“委托”的概念,這是一種類型安全的函數(shù)指針鏈表。
這意味著,C#不僅可以提供回調(diào)機制,同時調(diào)用回調(diào)的一方還無需在其內(nèi)部維護函數(shù)指針列表,所要做的僅僅是聲名一個具有恰當(dāng)委托類型的公共成員即可;而提供回調(diào)的一方也只需通過構(gòu)造一個帶有指定方法的相應(yīng)委托實例,并通過“+=”運算符添加到回調(diào)列表即可。
盡管C# 1.x提供了如此多的新鮮概念,但實際上,這些概念都是由CLI提出的。
因此當(dāng)將一個C#源程序編譯為可執(zhí)行文件時,編譯器做的工作相對而言并不多。
需要編譯器代勞的是要將一個簡單的委托定義語句翻譯為一個繼承自類型定義。
C# 2.0,泛型編程新概念微軟本打算繼續(xù)保證開發(fā)進度,并在2004年推出Visual Studio 2004,但由于其間軟件工程學(xué)尤其是軟件管理學(xué)的大規(guī)模進步,微軟所提供的這種僅具備開發(fā)和調(diào)試功能的IDE已經(jīng)無法滿足團隊開發(fā)的需求。
因此微軟決定在項目設(shè)計和管理工具方面進行了進一步研發(fā),并將其集成到Visual Studio中,以贏回原有的市場。
因此,微軟將Visual 2004“改名”為Visual Studio 2005,并決定推遲一年發(fā)布。
不過,微軟還是堅持在2004年的6月份發(fā)布了Visual Studio2005的第一個Beta 版,同時向開發(fā)者展示了C#語言的2.0版本。
2005年4月,微軟發(fā)布了Visual Studio 2005 Beta2,這已經(jīng)是具備了幾乎全部功能的VisualStudio,包括的產(chǎn)品有SQL Server2005、Team Foundation Server和TeamSuite。
這時的C#編譯器已經(jīng)能夠處理C# 2.0中所有的新特性。
C# 2.0為開發(fā)者帶來的最主要的特性就是泛型編程能力。
和面向?qū)ο笏枷胍粯樱盒退枷胍彩且环N已經(jīng)成熟的編程思想,但依然是沒有哪一種主流開發(fā)語言能夠支持完備的泛型概念。
這主要是因為泛型的概念在一定程度上對面向?qū)ο蟾拍钸M行沖擊,同時,由于在編譯期間對類型參數(shù)的完全檢測很難做到,很多問題會被遺留到運行時。
C# 2.0別出心裁,對泛型類型參數(shù)提出了“約束”的新概念,并以優(yōu)雅的語法體現(xiàn)在語言之中。
有了約束,結(jié)合編譯器強大的類型推斷能力,可以在編譯時發(fā)現(xiàn)幾乎所有“危險”的泛型應(yīng)用。
C# 2.0的另一個突出的特性就是匿名方法,用來取代一些短小的并且僅出現(xiàn)一次的委托,使得語言結(jié)構(gòu)更加緊湊。
匿名方法除了可以使得事件處理器的編寫更加精簡以外,還將開發(fā)者帶入了程序設(shè)計的一個新的領(lǐng)域——函數(shù)式編程,曾經(jīng)有高人就用匿名方法結(jié)合泛型編程實現(xiàn)了函數(shù)式編程中的重要結(jié)構(gòu)—— Lambda 表達(dá)式。
盡管這種實現(xiàn)顯得很繁瑣而且不易理解,但畢竟是實現(xiàn)了。
最終,函數(shù)式編程還是被引入到了C#語言中,這將在下一節(jié)中為大家講述。
此外,C# 2.0還進一步增強了語言的表達(dá)能力。
在C# 2.0中,屬性語法中的get和set訪問器可以擁有不同的權(quán)限,這就使得定義一個在庫的內(nèi)部可讀寫,而在庫的外部只讀的屬性成為可能。
同時,C# 2.0還提供了迭代器的概念,這使得一個類無需實現(xiàn)IEnumerator 和IEnumerable接口即可實現(xiàn)一個可以進行遍歷的類型,并且無需在類型中維護迭代狀態(tài)。
此時的已經(jīng)得到了很廣泛的認(rèn)可,并且因為元數(shù)據(jù)為組件帶來了強大的自我描述能力,許多程序庫廠商被吸引到平臺上來。
隨著程序庫數(shù)量的增長,逐漸暴露了命名的問題。
在面向?qū)ο蠹夹g(shù)廣泛發(fā)展后,人們就意識到名字的管理問題,因此幾乎所有的面向?qū)ο笳Z言都提出了“命名空間”的概念;而在C# 1.x時代,這個問題再一次出現(xiàn)。
如果一個庫廠商XX 希望以來命名他們自己的系統(tǒng)基礎(chǔ)庫,那么當(dāng)開發(fā)者使用using System語句時就會產(chǎn)生歧義。
為此。
C# 2.0中提供了global關(guān)鍵字,這為庫中所有的命名空間提供了一個“根”,通過指定global::System和就可以區(qū)別兩個庫了。
這一時期的C#編譯器變得非常復(fù)雜,泛型的引入使得編譯器不得不具備超強的類型推斷能力。
同時,迭代器的思想并非是在CLI層面上實現(xiàn)的,而是由編譯器自動生成了實現(xiàn)I E n u m e r a t o r 和IEnumerable接口類型。
C# 3.0,魔鬼在經(jīng)歷了一系列的改進和完善后,微軟決定于2005年11月發(fā)布Visual Studio2005,該開發(fā)環(huán)境將正式支持C#2.0。
由于此前推出了數(shù)個預(yù)覽版和測試版,大家的期待之情似乎已經(jīng)不是那么強烈了。
而2005年9 月份的PDC大會則為開發(fā)者們帶來了另外的驚喜——C#3.0(研發(fā)代號“Orcas”——魔鬼)的技術(shù)預(yù)覽版。
說到C# 3.0,就不得不提一下微軟的LINQ 項目,LINQ(語言集成查詢,Language Integrated Query)提出了一種通過面向?qū)ο笳Z法來實現(xiàn)對非面向?qū)ο髷?shù)據(jù)源的查詢技術(shù),可查詢的數(shù)據(jù)源從關(guān)系型數(shù)據(jù)庫延伸到一般意義上的集合(如數(shù)組和列表)以及XML。
而C# 3.0則是率先實現(xiàn)了LINQ的語言。
在C# 3.0中,我們可以用類似于SQL語句的語法從一個數(shù)據(jù)源中輕松地得到滿足一定條件的對象集合。
例如要查找一個字符串?dāng)?shù)組names中所有長度大于5的字符串,就可以寫:var longname = from n in names > 5 select n;這樣我們就得到一個新的字符數(shù)組longname,其中包含了我們所需要的結(jié)果。
這種語句稱作查詢語句,與SQL語句唯一的區(qū)別是C#中的查詢語句往往把select子句放到最后(這反而倒有些類似于中文的閱讀順序了)。
初次看到這樣一個語句,我們可能會有很大疑問:這還是C#語言嗎?這的確是合乎語法規(guī)則的C#代碼,而且編譯器可以識別這種語法。
然而實際上,C#編譯器并不會對這種語法進行實際的的編譯,而是將其翻譯為正常的方法調(diào)用:var longname = (n => > 5)(n);然后再進行進一步的編譯。
在上面的例子中已經(jīng)說明,names是一個存放有字符串的數(shù)組,而數(shù)組類型并沒有Where的方法。
的確,Where并非names的成員方法,微軟也沒有對數(shù)組類型進行任何改動。
這是C# 3.0中另外一個重要的新特性:擴展方法。
擴展方法是定義在其他靜態(tài)類中的靜態(tài)方法,其第一個參數(shù)的類型就是希望擴展的類型,并且這個參數(shù)被冠以this修飾符。
擴展方法是靜態(tài)的,但可以像調(diào)用被擴展類型的實例方法那樣進行調(diào)用,看起來好像是被擴展類型自己的方法一樣。
這就為語言帶來了很大的靈活性,我們可以將一組近似的功能如上面的Where 和Select等(這在LINQ中被稱作“標(biāo)準(zhǔn)查詢表達(dá)式”)定義在一個外部類中,這樣既無須修改現(xiàn)有類型,又可以將新功能組織在一起。
當(dāng)然,為了做到面向?qū)ο蟮姆庋b性,擴展方法只能在被擴展類型的公共成員上進行操作,如果需要從內(nèi)部對類型進行改進,就必須改變現(xiàn)有類型的代碼。
在Where方法的參數(shù)列表里,我們又發(fā)現(xiàn)了一種奇怪的語法:n => > 5。
這就是我們上文提到過的Lambda 表達(dá)式。
微軟的官方規(guī)范中稱,Lambda 表達(dá)式是匿名方法的一種自然進化。
因此Lambda 表達(dá)式其實也是一種特殊的委托,由編譯器負(fù)責(zé)生成一個匿名的委托類型,它接受一個字符串類型的參數(shù)n;返回值為布爾類型,表示n的長度是否大于5;其中的參數(shù)類型和返回值類型都是由編譯器推斷而來的。
說到類型推斷,還要解釋的一點就是上面的語句中出現(xiàn)的新關(guān)鍵字var。
從出現(xiàn)的位置來看,var應(yīng)該是一個類型。
然而這又不是一個C#內(nèi)建類型,也不是CLI提出的新類型;它只是一個“占位符”,它的確表示一個類型,但具體是什么類型需要編譯器在編譯期間進行推斷。
Lamda表達(dá)式的真正意義不僅僅在于簡化了委托的編寫方式,更重要的是它把代碼表達(dá)式體現(xiàn)為了數(shù)據(jù)。
換句話說,Lambda表達(dá)式不僅可以被編譯為一段可以執(zhí)行的代碼(類似于匿名方法),也可以將其翻譯為一個數(shù)據(jù)結(jié)構(gòu)——表達(dá)式樹。
而如何處理Lambda 表達(dá)式,是由編譯器根據(jù)Lambda表達(dá)式的使用方式來自動確定的。
當(dāng)把一個Lambda表達(dá)式賦給一個具有委托類型的域、屬性或變量時,編譯器像編譯匿名方法一樣將表達(dá)式體翻譯成一段可執(zhí)行代碼;而當(dāng)把一個L a m b d a 表達(dá)式賦給一個具有Expression
內(nèi)容聲明:
1、本站收錄的內(nèi)容來源于大數(shù)據(jù)收集,版權(quán)歸原網(wǎng)站所有!
2、本站收錄的內(nèi)容若侵害到您的利益,請聯(lián)系我們進行刪除處理!
3、本站不接受違法信息,如您發(fā)現(xiàn)違法內(nèi)容,請聯(lián)系我們進行舉報處理!
4、本文地址:http://www.hudongshop.com/article/060ee3518fce3b1698f2.html,復(fù)制請保留版權(quán)鏈接!
解決0x000018藍(lán)修復(fù)損壞的系統(tǒng)映像,在命令提示符中輸入DISM,Online,Cleanup,Image,RestoreHealth以運行DISM,恢復(fù)系統(tǒng),如果其他故障排除步驟不起作用,則可以嘗試將系統(tǒng)恢復(fù)到以前的工作狀態(tài),在開始菜單中搜索系統(tǒng)還原以啟動此過程,預(yù)防措施保持系統(tǒng)更新,定期更新Windows和所有軟件可以修復(fù)錯誤...。
最新資訊 2024-10-01 01:08:49
簡介導(dǎo)航條是網(wǎng)站的重要組成部分,因為它允許用戶輕松瀏覽網(wǎng)站,它也可能是網(wǎng)站中最慢的部分,原因有很多,包括加載大量的圖像、使用復(fù)雜的樣式和動畫,為了解決這個問題,有必要優(yōu)化導(dǎo)航條的性能,這可以通過使用以下一些技術(shù)來實現(xiàn),減少圖像大小使用CSS精靈圖減少動畫和效果緩存導(dǎo)航條使用CDN減少圖像大小圖像通常是導(dǎo)航條中最大的性能瓶頸,為了減少圖...。
最新資訊 2024-09-29 22:59:24
CSSGrid是一種強大的布局系統(tǒng),它允許開發(fā)人員創(chuàng)建靈活且響應(yīng)式的布局,通過利用其強大的功能,您可以突破傳統(tǒng)網(wǎng)格布局的限制,創(chuàng)建令人驚嘆的視覺效果,突破常規(guī)布局示例項目1項目2項目3項目4項目5項目6項目7項目8突破常規(guī)布局的CSS規(guī)則要創(chuàng)建突破常規(guī)布局,可以使用以下自定義CSS規(guī)則,grid,column,spann,跨越指定的...。
本站公告 2024-09-29 02:32:18
簡介磁盤配額是一種重要的IT管理工具,用于限制用戶對存儲空間的使用,在企業(yè)IT環(huán)境中,實施磁盤配額至關(guān)重要,因為它有助于確保數(shù)據(jù)安全和可用性,本文將探討磁盤配額的優(yōu)勢、注意事項以及最佳實踐,磁盤配額的優(yōu)勢實施磁盤配額可以帶來以下優(yōu)勢,提高存儲效率,磁盤配額通過限制用戶存儲空間的使用,可以防止單個用戶占用過多的存儲,從而提高整體存儲效率...。
本站公告 2024-09-25 12:12:28
本教程系列將帶你從頭開始學(xué)習(xí)Java編程語言,無論你是一個沒有編程經(jīng)驗的完全新手,還是希望鞏固基礎(chǔ)的初學(xué)者,這個系列都非常適合你,課程大綱第1課,Java基礎(chǔ)什么是Java,為什么學(xué)習(xí)Java,Java的特點安裝和配置Java開發(fā)環(huán)境第2課,數(shù)據(jù)類型和變量原語數(shù)據(jù)類型引用數(shù)據(jù)類型變量聲明和初始化轉(zhuǎn)換和強制類型轉(zhuǎn)換第3課,運算符和表達(dá)式...。
技術(shù)教程 2024-09-25 05:05:56
MVC模型的基本工作原理Model,View,Controller,MVC,是一種設(shè)計模式,它將應(yīng)用程序的邏輯和表現(xiàn)層分離成三個不同的組件,模型,表示應(yīng)用程序的數(shù)據(jù)和邏輯,視圖,負(fù)責(zé)顯示數(shù)據(jù),控制器,處理用戶交互并與模型和視圖通信,在MVC模型中,DropdownListForHTML助手用于創(chuàng)建用戶友好的下拉列表控件,它允許用戶從預(yù)...。
最新資訊 2024-09-16 08:45:07
在設(shè)計網(wǎng)站或應(yīng)用程序時,我們通常會忽視滾動條,但是,滾動條對于為用戶提供便利和提升用戶體驗至關(guān)重要,通過使用CSS,我們可以輕松自定義滾動條的外觀和行為,使其更易于使用和美觀,滾動條的可用性問題未經(jīng)優(yōu)化的滾動條可能會導(dǎo)致以下可用性問題,難以找到或看到太細(xì)或太短,難以抓取與網(wǎng)站或應(yīng)用程序的整體設(shè)計不一致使用CSS提升滾動條可用性我們可以...。
最新資訊 2024-09-15 09:11:23
引言搜索引擎優(yōu)化,SEO,是一門復(fù)雜的學(xué)科,涉及多種因素,以提高網(wǎng)站在搜索引擎結(jié)果頁面,SERP,中的排名,其中最關(guān)鍵的因素之一就是蜘蛛程序,也被稱為網(wǎng)絡(luò)爬蟲或搜索引擎機器人,什么是蜘蛛程序,蜘蛛程序是由搜索引擎,如谷歌、百度和必應(yīng),發(fā)送的自動化程序,它們探索互聯(lián)網(wǎng),抓取和索引網(wǎng)頁,它們的作用是收集有關(guān)網(wǎng)站及其內(nèi)容的信息,以便搜索引擎...。
本站公告 2024-09-11 17:51:48
簡介在當(dāng)今數(shù)字時代,提供卓越的客戶服務(wù)至關(guān)重要,為了滿足客戶不斷變化的需求,企業(yè)需要采用多渠道在線客服系統(tǒng),使他們能夠通過多種平臺與客戶互動,從而創(chuàng)造無縫、集成的客戶體驗,本文將提供一個多渠道在線客服系統(tǒng)源碼,供您下載和定制,以滿足您的特定需求,該系統(tǒng)旨在幫助您,通過WhatsApp、FacebookMessenger、電子郵件和實時...。
本站公告 2024-09-11 06:33:18
在競爭激烈的淘寶市場中,找到一個有效的方法來吸引和保留客戶對于任何企業(yè)來說都是至關(guān)重要的,一個精心設(shè)計的淘寶導(dǎo)航代碼可以為您的店鋪提供一個無與倫比的入口,幫助您在人群中脫穎而出,什么是淘寶導(dǎo)航代碼,淘寶導(dǎo)航代碼是一段HTML代碼,您可以將其添加到您的淘寶店鋪頁面中,該代碼創(chuàng)建一個自定義導(dǎo)航欄,為您的客戶提供快速輕松地瀏覽您的產(chǎn)品、服務(wù)...。
技術(shù)教程 2024-09-10 21:56:36
在網(wǎng)頁設(shè)計的世界中,黑色背景長期以來一直被認(rèn)為是不受歡迎的,甚至是禁止的,隨著時間的推移,這種傳統(tǒng)正在發(fā)生轉(zhuǎn)變,黑色背景重新煥發(fā)了生機,成為網(wǎng)站設(shè)計中引人注目的選擇,黑色背景的優(yōu)勢使用黑色背景具有許多優(yōu)勢,其中包括,突出元素,黑色背景可以有效地突出網(wǎng)站上的元素,例如圖像、文字和按鈕,使其更加醒目,增強對比度,黑色和白色之間的鮮明對比度...。
技術(shù)教程 2024-09-09 17:25:31
織夢CMS是一款功能強大的開源內(nèi)容管理系統(tǒng),專為建立和管理網(wǎng)站而設(shè)計,它擁有豐富的功能,能夠讓網(wǎng)站所有者輕松地創(chuàng)建和管理內(nèi)容、自定義設(shè)計、添加功能并提高網(wǎng)站的參與度和影響力,織夢CMS如何提升音樂網(wǎng)站的參與度創(chuàng)建和管理互動社區(qū),織夢CMS允許網(wǎng)站所有者創(chuàng)建一個論壇或留言板,讓用戶可以在網(wǎng)站上進行互動和討論,這可以幫助建立一個音樂愛好者...。
最新資訊 2024-09-07 22:42:16