c訪問器
① C#:虛屬性重寫時需要全部實現訪問器嗎
顯然不是嘛,虛擬或抽象方法才能重寫
仔細看看:
-------------------------------------
virtual 用在基類中,指定一個虛方法(屬性),表示這個方法(屬性)可以重寫。
override 用在派生類中,表示對基類虛方法(屬性)的重寫。
以上的基類和派生類都是相對的。B 是 C 的基類,也可以是 A 的派生類,B 中既可以對 A 中的 virtual 虛方法用 override 重寫,也可以指定 virtual 虛方法供 C 重寫。
不能重寫非虛方法或靜態方法。重寫的基方法必須是 virtual、abstract 或 override 的。為什麼 override 也可以重寫呢?因為基類中的 override 實際上是對基類的基類進行的重寫,由於繼承可傳遞,所以也可以對基類中 override 的方法進行重寫。
override 聲明不能更改 virtual 方法的可訪問性。override 方法和 virtual 方法必須具有相同的訪問級別修飾符。
不能使用修飾符 new、static、virtual 或 abstract 來修改 override 方法。
重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,並且被重寫的屬性必須是 virtual、abstract 或 override 的。
② 8. 對象的特徵在類中表示為變數,稱為類的[ ]. A.對象 B.屬性 C.方法 D.數據類型
選b:變數是類的屬性。
1、實例變數在類中聲明,但在方法,構造函數或任何塊之外。類變數(也稱為靜態變數)在類中使用static關鍵字聲明,但在方法,構造函數或塊之外。
2、使用關鍵字「new」創建對象時會創建實例變數,並在銷毀對象時銷毀。程序啟動時會創建靜態變數,程序停止時會生成靜態變數。
類屬性的概念
在java中,類的屬性並非指的是類中的成員變數,屬性是一個或兩個代碼塊,表示一個get訪問器和/或一個set訪問器。當讀取屬性時,執行 get 訪問器的代碼塊;當向屬性分配一個新值時,執行 set 訪問器的代碼塊。不具有 set 訪問器的屬性被視為只讀屬性。不具有 get 訪問器的屬性被視為只寫屬性。同時具有這兩個訪問器的屬性是讀寫屬性。
以上內容參考:網路-類屬性
③ 在C#中get/set訪問器快捷鍵是什麼
建議裝個AsEclipse插件吧,可以批量生成 get/set 訪問器
AsEclipseisanadd-inforMSVisualStudio,.,.
下載鏈接:https://visualstudiogallery.msdn.microsoft.com/99ede732-544c-4f3b-8e38-49e4b8395075/
④ 求高手出現,為什麼c:forEach內容下的東西顯示不出來,關於畢業設計的,代碼如下:
有這幾種可能性:
1 在任何作用域中都無法找到目標對象,或者迭代的集合大小為0
2 數據對象的key引用不正確
3 集合中的對象(從你的代碼看是JavaBean)提供的屬性訪問器可能有問題(set 和get方法)
4 C標簽引入有問題,如果需要支持EL表達式應該引入http://java.sun.com/jstl/core_rt 這個uri
5 .....
你可以使用java硬編碼在jsp頁面試一下看看這個對象是否存在,然後再按照以上所說排除問題,應該不難解決
⑤ C#什麼意思
C#(讀作C sharp,一定不要讀作夏普哦,哈哈)是微軟為.net量身定做的語言,是目前最完善的面向對象託管代碼語言之一。
C#和C以及C++沒有關系,因為C#是託管語言(即必須運行在.net的CLR之上),與其他兩者有本質區別。
⑥ 誰給簡單介紹一下C#
特點有很多,簡單易上手是比較明顯的
編程方式。。。你指什麼?
主要應用:網路,WEB開發
簡單,但是依然有它需要長時間研究的地方
IDE:VS系列,2003,2005,2008等
可以游戲開發,理論上是都能做的
⑦ C#問題求助
從本質上講沒啥區別。在C#中,屬性、索引器、運算符重載、類型轉換、方法、構造函數(包括實例構造函數和靜態構造函數)、析構函數,都是函數成員。也就是執行到它們時,都會執行一段代碼。屬性的set訪問器與Java中的set方法的區別是:set訪問器有且只有一個參數,叫做value(名字已經約定,不能改變),因此同一個屬性是不能重載的,而Java中的set方法可以有多個參數,因此可以重載。但在某些時候,使用屬性比使用方法更加靈活、簡潔、自然、直觀。
比如(C#的語法):
class Cat
{
//屬性Name不能重載
public string Name
{
set
{m_name=value;}
get
{return m_name;}
}
private string m_name;
}
Cat c=new Cat();
c.Name="mimi";
c.Name+="mie";
對於c.Name+="mie";如果用set方法通常會像這樣:
c.setName(c.getName()+"mie");
你自己邊學邊體會吧!
⑧ Objective-c 簡單問題
NSLog(str);
最好寫成 NSLog(@"%@", str); 就不出警告了。
二)這兩種方式 不一樣的啊。
(1)的name 指向了新的內存。
(2)里的name和參數指向了相同的內存。就是說,那個參數的值變化了,這里的name也會跟著變。
⑨ VisualC# 和Visual C功能一樣嗎
有些不同,但是要使懂得VC++的人學C#就很好上手了。他包含了vc++的一些語法風格,有新增加了新的內容。擴展了開發平台,兼容很多語言在裡面。
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)的開發。一個成功的開發人員在面對新鮮事物和新的困難時,興奮是遠大於恐懼的。
讓魔鬼來得更猛烈些吧!
⑩ c#掛了,這是補考試卷,幫忙做一下,不勝感激。謝謝。
你應該自已回答。如有不對,你可以發問於老師,也可以和同學討論。因為,你現在會做,考到來分數卻是不理想,你認為老師會相信你嗎,老師和同學會把你當成騙子,和你好的同學會離你而去的。