總結.Net基礎知識——獻給即將入坑的同行們(一期)
什麼是面向物件
面向物件OO = 面向物件的分析OOA + 面向物件的設計OOD + 面向物件的程式設計OOP;
通俗的解釋就是萬物皆物件,把所有的事物都看作一個個可以獨立的物件(單元),它們可以自己完成自己的功能,而不是像C那樣分成一個個函式;
現在純正的OO語言主要是java和C#,C++也支援OO,C是面向過程的。
闡述面向介面、面向物件、面向方面程式設計的區別
面向物件不好解釋,可以理解為以一切元素都是物件,在設計時以物件為單位,考慮它的屬性及方法。設計中採用了封裝、繼承、抽象的手法
面向介面本身就是面向物件的,無所謂區別,只不過面向介面的好處是耦合性低
面向方面Aspect-Oriented Programming (AOP)就是大名鼎鼎的AOP。其實有點象struts裡的攔截。
舉例:假設有在一個應用系統中,有一個共享的資料必須被併發同時訪問,首先,將這個資料封裝在資料物件中,稱為Data Class,同時,將有多個訪問類,專門用於在同一時刻訪問這同一個資料物件。
為了完成上述併發訪問同一資源的功能,需要引入鎖Lock的概念,也就是說,某個時刻,當有一個訪問類訪問這個資料物件時,這個資料物件必須上鎖Locked,用完後就立即解鎖unLocked,再供其它訪問類訪問。
面向物件的思想主要包括什麼?
繼承:子類擁有父類的所有資料和操作。
封裝:用抽象的資料型別將資料和基於資料的操作封裝在一起,資料被保護在抽象資料型別內。
多型:一個程式中同名的不同方法共存的情況。有兩種形式的多型–過載與重寫。
抽象類是否可以繼承實體類?
抽象類可以繼承實體類,但是有個條件,條件是,實體類必須要有明確的建構函式。
當類T只聲明瞭私有例項建構函式時,則在T的程式文字外部,是否可以從T派生出新的類,是否可以直接建立T的任何例項。
不可以,不可以
C#中有沒有靜態建構函式,如果有是做什麼用的?
有. 靜態建構函式用於初始化類。在建立第一個例項或引用任何靜態成員之前,將自動呼叫靜態建構函式來初始化類。靜態建構函式既沒有訪問修飾符,也沒有引數。在建立第一個例項或引用任何靜態成員之前,將自動呼叫靜態建構函式來初始化類。無法直接呼叫靜態建構函式。在程式中,使用者無法控制何時執行靜態建構函式。靜態建構函式的典型用途是:當類使用日誌檔案時,將使用這種建構函式向日志文件中寫入項。
什麼是.net?
.net是一種平臺和框架, .net 不是單純的語言也不是單純的工具,它是從底層平臺開始構建起來的一個整體框架
請以圖示方式解釋.net framework?

程式集與名稱空間有什麼不同?
名稱空間是用於避免命名衝突,專用於組織程式碼,當代碼要在其他某個應用程式中重用時,可以降低複雜性。
程式集是重用程式碼的一種方式驗證控制元件
不同: 可以將相同名稱空間中的類部署到不同的程式集中,也可以名稱空間中的類部署到一個程式集中

什麼是WEB控制元件?使用WEB控制元件有那些優勢?
WEB控制元件是能拖放在WEB頁面上的控制元件
WEB控制元件分為:內部控制元件, 列表控制元件, 複雜控制元件,
•WEB控制元件優勢:
l Web 控制元件是物件,與物件一樣,Web 控制元件擁有方法和屬性,並且響應事件
l 一旦將 Web 控制元件包括在 Web 頁中,就可以設定其屬性並呼叫其方法
l 可以為 Web 控制元件編寫伺服器端程式碼以響應在客戶端上發生的事件
ASP.NET中共有幾種型別的控制元件?各有什麼區別?
WEB控制元件分為:內部控制元件, 列表控制元件, 複雜控制元件, 驗證控制元件
內部控制元件:內部控制元件的使用方法與 HTML 控制元件相同,它們對映到 HTML 元素並通過使用 runat = "server" 屬性在伺服器上執行
列表控制元件:用於在 Web 頁中建立資料列表
複雜控制元件:當希望控制元件擁有複雜的功能或使用 HTML 元素無法建立的功能豐富的使用者介面時,可以使用複雜控制元件
驗證控制元件:輸入控制元件的資料需要進行準確性和取值範圍方面的檢查
WEB控制元件可以激發服務端事件,請談談服務端事件是怎麼發生並解釋其原理?自動傳回是什麼?為什麼要使用自動傳回。
由於ASP。NET是Web頁面和服務端分離的,因此要產生了服務端事件.
使用_doPostBack函式能夠自動地把客戶端的javascript事件轉變為一個伺服器端的事件,Asp.net框架自動為我們處理有關的細節簡化工作。
使用自動傳回的特性:在檢測到一個特定使用者動作時,自動傳回能夠將這個頁面傳回伺服器以處理事件.
在web控制元件發生事件時,客戶端採用提交的形式將資料交回服務端,服務端先呼叫Page_Load事件,然後根據傳回的狀態資訊自動呼叫服務端事件自動傳回是當我們在點選客戶端控制元件時,採用提交表單的形式將資料直接傳回到務端。只有通過自動傳回才能實現服務端事件的機制,如果沒有自動回傳機制就只能呼叫客戶端事件,而不能呼叫服務端事件
請解釋ASP.NET中以什麼方式進行資料驗證。
Aps.net 中有非空驗證,比較驗證,取值範圍驗證,正則表示式驗證及客戶自定義驗證五大控制元件,另還有一個集中驗證資訊處理控制元件
什麼是ASP.Net中的使用者控制元件
使用者控制元件是能夠在其中放置標記和 Web 伺服器控制元件的容器。然後,可以將使用者控制元件作為一個單元對待,為其定義屬性和方法。
使用者控制元件以。ascx為副檔名,可以拖到不同的頁面中呼叫,以節省程式碼。比如登陸可能在多個頁面上有,就可以做成使用者控制元件,但是有一個問題就是使用者控制元件拖到不同級別的目錄下后里面的圖片等的相對路徑會變得不準確,需要自已寫方法調整。
問這樣的問題,一般是迷惑你。因為新手還是分不清楚使用者控制元件和伺服器控制元件(也稱自定義控制元件),使用者控制元件一般用在內容多為靜態,或者少許會改變的情況下,用的比較大,類似ASP中的include。。但是功能要強大的多。
WEB控制元件及HTML服務端控制元件能否呼叫客戶端方法?如果能,請解釋如何呼叫?
可以呼叫
例如:<asp:TextBox id="TextBox1" onclick="clientfunction();" runat="server"></asp:TextBox>
<INPUT id="Button2" value="Button" name="Button2"runat="server" onclick="clientfunction();">
C#, Java 和 c++的特點,有什麼相同的地方,不同的地方, C#分別從c++和java中吸取了他們那些優點?
C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,介面,與Java幾乎同樣的語法,和編譯成中間程式碼再執行的過程.但是C#與Java有著明顯的不同,它借鑑了Delphi的一個特點,與COM(元件物件模型)是直接整合。
微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要廣泛一些(比如說 structs),它還增加了自己新的特點(比方說原始碼版本定義).
C#從Java繼承而來的特點
類:在C#中類的宣告與Java很相似。特點看起來與Java相比沒有變化.
布林運算:條件表示式的結果是布林資料型別,布林資料型別是這種語言中獨立的一種資料型別.從布林型別到其他型別沒有直接的轉換過程.布林常量true和false是C#中的關鍵字.
錯誤處理:如Java中那樣,通過丟擲和捕捉異常物件來管理錯誤處理過程.
記憶體管理:由底層.NET框架進行自動記憶體垃圾回收.
C#從C和C++繼承的特點
編譯:程式直接編譯成標準的二進位制可執行形式.
結構體:一個C#的結構體與C++的結構體是相似的,因為它能夠包含資料宣告和方法.但是,不象C++,C#結構體與類是不同的而且不支援繼承.但是,與Java相同的是,一個結構體可以實現介面.
預編譯:C#中存在預編譯指令支援條件編譯,警告,錯誤報告和編譯行控制. #error
C#獨有的特點
中間程式碼:微軟在使用者選擇何時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語言子類化.
索引下標:一個索引與屬性除了不使用屬性名來引用類成員而是用一個方括號中的數字來匿名引用(就象用陣列下標一樣)以外是相似的.
代理和反饋:一個代理物件包括了訪問一個特定物件的特定方法所需的資訊.只要把它當成一個聰明的方法指標就行了.代理物件可以被移動到另一個地方,然後可以通過訪問它來對已存在的方法進行型別安全的呼叫.一個反饋方法是代理的特例.event關鍵字用在將在事件發生的時候被當成代理呼叫的方法宣告中.
在C#中,string str = null與string str = “”的區別。
string str = null是不給他分配記憶體空間,而string str = ""給它分配長度為空字串的記憶體空
怎樣理解靜態變數?靜態成員和非靜態成員的區別?
靜態變數屬於類,而不屬於物件;並對所有物件所享;靜態成員在加類的時候就被載入。
靜態成員和非靜態成員的區別?
靜態變數使用 static 修飾符進行宣告,靜態成員在加類的時候就被載入(在類被例項化時建立,哪個對),通過類進行訪問
不帶有static 修飾符宣告的變數稱做非靜態變數,在物件被例項化時建立,通過物件進行訪問
一個類的所有例項的同一靜態變數都是同一個值,同一個類的不同例項的同一非靜態變數可以是不同的值
靜態函式的實現裡不能使用非靜態成員,如非靜態變數、非靜態函式等
DataReader和DataSet的異同
DataReader和DataSet最大的區別在於,DataReader使用時始終佔用SqlConnection,線上操作資料庫,任何對SqlConnection的操作都會引發DataReader的異常,因為DataReader每次只在記憶體中載入一條資料,所以佔用的記憶體是很小的,因為DataReader的特殊性和高效能。所以DataReader是隻進的,你讀了第一條後就不能再去讀取第一條了。
DataSet則是將資料一次性載入在記憶體中。拋棄資料庫連線,讀取完畢即放棄資料庫連線,因為DataSet將資料全部載入在記憶體中。所以比較消耗記憶體,但是確比DataReader要靈活,可以動態的新增行,列,資料。對資料庫進行回傳更新操作。
簡述靜態類和靜態成員
靜態類中的成員都必須是靜態的。靜態類無構造方法,並且是密封類無法被繼承。
靜態成員訪問時只能通過類名來訪問,不能通過物件訪問(和JAVA有區別),this也無法訪問靜態成員。
描述介面的作用
充當類的功能介面,接口裡的成員屬於抽象描述,必須通過類的實現才能使用。如:某個專案有多個模組組成,每個模組由一個開發者完成,開發者只需編寫完模組功能實現後,留下的介面供其他人使用。其他人在程式中,使用介面時,只需知道介面的功能,不瞭解如何實現。
當功能模組無法滿足需要或功能模組的需求變更時,程式設計師只需將該功能模組的實現程式碼進行修改和擴充,而其他呼叫介面的程式無須改動。介面的這種應用模式成為brige模式(即意圖和實現分離)
介面反映了面向物件的多型特徵,即通過相同方法得到不同實現。介面也反映了面向物件的封裝特徵,使用者可以不清楚介面成員的實現細節。
注意:因為介面成員預設的訪問許可權是public,所以在實現介面時,類的成員必須為public,且方法名和引數必須一致。
描述抽象類
用abstract修飾的類。抽象類可以包含實現的成員。未實現的成員隱含的是virtual屬性,子類實現時必須用override關鍵字。
請解釋介面的顯式實現有什麼意義?
介面是其他型別為確保它們支援某些操作而實現的引用型別。介面從不直接建立而且沒有實際的表示形式,其他型別必須轉換為介面型別。一個介面定義一個協定。實現介面的類或結構必須遵守其協定。介面可以包含方法、屬性、索引器和事件作為成員。
在專案中為什麼使用介面?介面的好處是什麼?什麼是面向介面開發?
介面只是一種約束。使用 interface 去定義某些特定的功能,為的是不要將程式碼寫死在自定義類裡,以便在系統開發、事後維護、功能擴充 上更有擴充套件性。
介面用於描述一組類的公共方法/公共屬性. 它不實現任何的方法或屬性,只是告訴繼承它的類至少要實現哪些功能,繼承它的類可以增加自己的方法. 使用介面可以使繼承它的類: 命名統一/規範,易於維護。提供永遠的介面。 當類增加時,現有介面方法能夠滿足繼承類中的大多數方法,沒必要重新給新類設計一組方法,也節省了程式碼,提高了開發效率。
面向介面開發的好處有結構清晰,類間通訊簡單易懂,擴充套件性好,提高複用性等等。
面向介面開發就是指面向抽象協議程式設計,實現者在實現時要嚴格按協議來辦。
介面和類有什麼異同。
不同點:
1、不能直接例項化介面。
2、介面只包含方法或屬性的宣告,不包含方法的實現。
3、介面可以多繼承,類只能單繼承。
4、類有分部類的概念,定義可在不同的原始檔之間進行拆分。
5、表達的含義不同,介面主要定義一種規範,統一呼叫方法,也就是規範類,約束類,類是方法功能的實現和集合
相同點:
1、介面、類和結構都可以從多個介面繼承。
2、介面類似於抽象基類:繼承介面的任何非抽象型別都必須實現介面的所有成員。
3、介面和類都可以包含事件、索引器、方法和屬性。
您在什麼情況下會用到虛方法或抽象類,介面?
如果某個方法可能性在派生類中會被重寫。這時就將該方法寫為虛方法。
抽象類:是一個型別,與派生類之間的關係是一個“ISA”的關係。用來做基類,抽象類不能建立物件,類中包括抽象方法和例項方法。
介面:是設計一個規範,描述了Can do ;與實現類之間是中”LINE A 的關係,C#中介面不能包含欄位訪問修飾符。
對比抽象基類和介面的使用
抽象類能有具體實現,而介面只定義行為規範,不能有具體實現。一個類只能繼承一個父類,但能實現多個介面。
C#中的介面和抽象類有什麼異同。你選擇使用介面和抽象類的依據是什麼?
1、繼承:介面支援多繼承;抽象類不能實現多繼承。
2、表達的概念:介面用於規範,抽象類用於共性。抽象類是一類事物的高度聚合,那麼對於繼承抽象類的子類來說,對於抽象類來說,屬於"是"的關係;而介面是定義行為規範,因此對於實現介面的子類來說,相對於介面來說,是"行為需要按照介面來完成"。
3、方法實現:對抽象類中的方法,即可以給出實現部分,也可以不給出;而介面的方法(抽象規則)都不能給出實現部分,介面中方法不能加修飾符。
4、子類重寫:繼承類對於兩者所涉及方法的實現是不同的。繼承類對於抽象類所定義的抽象方法,可以不用重寫,也就是說,可以延用抽象類的方法;而對於介面類所定義的方法或者屬性來說,在繼承類中必須重寫,給出相應的方法和屬性實現。
5、新增方法的影響:在抽象類中,新增一個方法的話,繼承類中可以不用作任何處理;而對於介面來說,則需要修改繼承類,提供新定義的方法。
6、介面可以作用於值型別(列舉可以實現介面)和引用型別;抽象類只能作用於引用型別。
7、介面不能包含欄位和已實現的方法,介面只包含方法、屬性、索引器、事件的簽名;抽象類可以定義欄位、屬性、包含有實現的方法。
8、介面可以用於支援回撥(CallBack);抽象類不能實現回撥,因為繼承不支援。
如下給出兩者的簡單對比表格。

如何選擇:
1、看是否需要多繼承,如果需要就只能使用介面
2、看你在累裡定義的方法是否需要有實現的程式碼,如果要,就使用抽象類
3、使不同的型別有共同的特性的時候使用介面,因為它支援多繼承,只想從一個型別繼承出不同的行為的子類的時候使用抽象類,可以在基類裡有程式碼實現。
從實現介面和現實抽象類的方法來看,介面是死的,抽象類是活的,當然實現介面的類是活的。
結構和類的區別
簡單的說成class可以被例項化,屬於引用型別struct屬於值型別,
1)型別,空間分配。結構是值型別,是分配在記憶體的棧上的.類時引用型別,,是分配在記憶體的堆上的。結構例項化可以不用new,即使用new操作也不會在堆裡分配記憶體。作引數是按值傳遞,類時引用傳遞,變數用完自動解除記憶體分配,類需要垃圾回收期
2)基類。結構繼承自System.ValueType類,因此不具多型性。但是注意,System.ValueType是個引用型別。類繼承自System.Object類;
3)職能。struct常用於儲存資料;而class表現為行為
4) 結構沒有類的特性,不支援繼承。但可以實現介面。
5)結構無法宣告無參的建構函式,但可以宣告有參的建構函式
6)結構的例項成員不能直接賦初值,必須通過建構函式來賦值,但靜態成員可以直接賦初值
7)無抽象結構,但有抽象類(abstract)
8)class 可以宣告protected成員、virtual成員、sealed成員和override成員;而struct不可以,但是值得注意的是,struct 可以過載System.Object的3個虛方法,Equals()、ToString()和GetHashTable()。
介面與繼承的區別?什麼時候使用介面,什麼時候使用繼承?
(1) 介面定義一個型別需要實現的方法,屬性,索引和事件,包括可能的引數型別和返回值型別,而把具體的實現交由相應的類或結構來做,從而為元件提供多型能力。
(2) 繼承常用於在一個現有父類的基礎上的功能擴充套件,往往是我們將幾個類中相同的成員提取出來放在父類中實現,然後在各自的子類中加以繼承。
(3) 介面可以實現多介面繼承,而繼承只能實現單繼承。
(4) 實現繼承可繼承父型別的實現,由於介面中沒有定義方法的實現,因此必須實現繼承後該介面的所有方法。
(5) 為父型別新增方法可能不影響使用繼承自該型別實現的使用者,而為介面新增方法導致使用者必須為新方法新增實現。
(6) 當派生類和基類是is-a的關係是使用"繼承",典型案例"蘋果 is-a 水果",存在can-do的關係時使用"介面"
過載(Overload )和覆寫(Override)的區別
簡單的說,一個是同一個函式的幾種形式,一個是重寫父類函式,
過載:當類包含兩個名稱相同但簽名不同(方法名相同,引數列表不相同)的方法時發生方法過載。用方法過載來提供在語義上完成相同而功能不同的方法。
覆寫:在類的繼承中使用,通過覆寫子類方法可以改變父類虛方法的實現。
區別:
1、方法的覆蓋是子類和父類之間的關係,是垂直關係;方法的過載是同一個類中方法之間的關係,是水平關係。
2、覆蓋只能由一個方法,或只能由一對方法產生關係;方法的過載是多個方法之間的關係。
3、覆蓋要求引數列表相同;過載要求引數列表不同。
4、覆蓋關係中,呼叫那個方法體,是根據物件的型別(物件對應儲存空間型別)來決定;過載關係,是根據呼叫時的實參表與形參表來選擇方法體的。
<%# %> 和 <% %> 有什麼區別?
<%# %>表示繫結的資料來源
<% %>是伺服器端程式碼塊
值型別和引用型別的區別?寫出C#的樣例程式碼。
值型別包括簡單型別、結構體型別和列舉型別,引用型別包括自定義類、陣列、介面、委託等
1、賦值方式:將一個值型別變數賦給另一個值型別變數時,將複製包含的值。這與引用型別變數的賦值不同,引用型別變數的賦值只複製物件的引用,而不復制物件本身。
2、派生:值型別不可能派生出新的型別,所有的值型別均隱式派生自 System.ValueType。但與引用型別相同的是,結構也可以實現介面。
3、null:與引用型別不同,值型別不可能包含 null 值。然而,可空型別功能允許將 null 賦給值型別。
4、每種值型別均有一個隱式的預設建構函式來初始化該型別的預設值。
值型別主要由兩類組成:結構、列舉
結構分為以下幾類:Numeric(數值)型別、整型、浮點型、decimal、bool、使用者定義的結構。
引用型別的變數又稱為物件,可儲存對實際資料的引用。宣告引用型別的關鍵字:class、interface、delegate、內建引用型別: object、string
5、值型別存貯在棧中,而引用型別存貯在動態的堆中,棧是先進先出的有系統管理的空間,而堆是由應用程式控制的可隨時申請和釋放該空間,在Donnet中一般情況下有垃圾收集器處理,他們的不同導致在程式設計上的不同。
例:
"a=null"的意思是:a的引用置為空但此時StringBuilder的堆空間並沒有被釋放,因此在此之後,輸出b時,仍然可以輸出mxh

輸出結果:
mxh
mxh
請按任意鍵繼續. . .
C#中的委託是什麼?如何理解委託?
簡單的說:委託是一種方法容器,裡面可以裝載若干個具有相同簽名的方法引用地址,那麼呼叫委託,就相當於同時呼叫了該容器內的所有方法。
委託可以看做一種新的物件型別,具有面向物件的特點,定義時可簽名接收引數,委託例項化時,可以把方法名作為一個引數傳遞給委託物件,委託可以理解為指向函式的引用。生成的委託物件可以代理所傳遞的方法,可以接收方法的引數。也就是定義了委託,可以在不用呼叫原方法的情況下,呼叫那個方法
例:

委託類似於 C或 C++中的函式指標。但不同的是委託是面向物件、型別安全的。
委託允許將方法作為引數進行傳遞。
委託可用於定義回撥方法。
委託可以連結在一起;建立多個物件,使用“+=”累加到同一個委託物件上的引用上,例如,可以對一個事件呼叫多個方法。

方法不需要與委託簽名精確匹配。有關更多資訊,請參見協變和逆變。
C# 2。0 版引入了匿名方法的概念,此類方法允許將程式碼塊作為引數傳遞,以代替單獨定義的方法。如:


結果:
事件資訊:Text屬性被更改了
事件釋出者:Name類的物件
你輸入的名字是:張三
請按任意鍵繼續. . .
使用匿名方法,直接將方法體的程式碼和委託物件關聯而不需要單獨定義此方法

也可以用Lambda表示式把delegate隱藏
