1. 程式人生 > >.NET面試題總結---獻給即將找工作的同行們

.NET面試題總結---獻給即將找工作的同行們

        http://blog.csdn.net/aspnet2002web/article/details/6084149 轉自 

面向物件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?

VB

C++

C#

Jscript

Common Language Specification

XML Web

services

Web Forms

Windows Forms

Data and XML

Base Class Library

CLR

CLI

Visual Studio .NET

         名稱空間是用於避免命名衝突,專用於組織程式碼,當代碼要在其他某個應用程式中重用時,可以降低複雜性。

         程式集是重用程式碼的一種方式驗證控制元件

不同: 可以將相同名稱空間中的類部署到不同的程式集中,也可以名稱空間中的類部署到一個程式集中

名稱空間

程式集

邏輯編譯時機制

物理編譯時機制

不是執行時實體

是執行時實體

為原始碼元素的名稱提供邏輯結構

為可執行檔案的執行時提供物理結構

什麼是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使用時始終佔用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、覆蓋關係中,呼叫那個方法體,是根據物件的型別(物件對應儲存空間型別)來決定;過載關係,是根據呼叫時的實參表與形參表來選擇方法體的。

<%# %> 和 <% %> 有什麼區別?

<%# %>表示繫結的資料來源

<% %>是伺服器端程式碼塊

值型別包括簡單型別、結構體型別和列舉型別,引用型別包括自定義類、陣列、介面、委託等

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

using System;

using System.Text;

class EventDel

{

    static void Main(string[] args)

    {

        StringBuilder a=new StringBuilder();//將StringBuilder的一個首地址傳給a

        StringBuilder b=a;                  //將StringBuilder的一個首地址傳給b

        b.Append("mxh");

        Console.WriteLine(a);

        a=null;

        Console.WriteLine(b);

    }

}

輸出結果:

mxh

mxh

請按任意鍵繼續. . .

C#中的委託是什麼?如何理解委託?

簡單的說:委託是一種方法容器,裡面可以裝載若干個具有相同簽名的方法引用地址,那麼呼叫委託,就相當於同時呼叫了該容器內的所有方法。

委託可以看做一種新的物件型別,具有面向物件的特點,定義時可簽名接收引數,委託例項化時,可以把方法名作為一個引數傳遞給委託物件,委託可以理解為指向函式的引用。生成的委託物件可以代理所傳遞的方法,可以接收方法的引數。也就是定義了委託,可以在不用呼叫原方法的情況下,呼叫那個方法

例:

例:

    public delegate string MyDel(string nm,string pwd); //定義委託簽名接收兩個引數

    static void Main(string[] args)

    {

      MyDel md=new MyDel(方法名)        //定義委託物件,其引用變數指向引數中的方法

      string result=md("張三""1234"); //呼叫委託物件,傳遞所指方法的引數

    }

委託類似於 C或 C++中的函式指標。但不同的是委託是面向物件、型別安全的。

委託允許將方法作為引數進行傳遞。

委託可用於定義回撥方法。

委託可以連結在一起;建立多個物件,使用“+=”累加到同一個委託物件上的引用上,例如,可以對一個事件呼叫多個方法。

public delegate string MyDel(string nm,string pwd); //定義委託簽名接收兩個引數

static void Main(string[] args)

{

    MyDel md=new MyDel(方法1);          //委託物件,其引用變數指向引數中的方法

    md+=new MyDel(方法2);

    md+=new MyDel(方法3);

    string result=md("張三""1234");   //呼叫委託物件,傳遞所指方法的引數

}

方法不需要與委託簽名精確匹配。有關更多資訊,請參見協變和逆變。

C# 2。0 版引入了匿名方法的概念,此類方法允許將程式碼塊作為引數傳遞,以代替單獨定義的方法。如:

using System;

class Name

{

    private string pName;

    //定義委託型別

    public delegate void myEventHandler(object sender, NameEventArgs e);

    //定義Get事件

    public event myEventHandler Get;

    internal string Text

    {

        get { return this.pName; }

        set{

            //-----------------------------------------------------------2

            this.pName=value;

            this.OnGet(new NameEventArgs("Text屬性被更改了"));

        }

    }

    void OnGet(NameEventArgs e)//----------------------------------------3

    {

        this.Get(this, e);  //觸發事件

    }

    public override string ToString()

    {

        return "Name類的物件";

    }

    public class NameEventArgs : EventArgs  //自定義事件資訊類

    {

        string pArgs;

        public NameEventArgs(string s)

        {

            pArgs = s;

        }

        public override string ToString()

        { return pArgs; }

    }

}

class EventDel

{

    static void Main(string[] args)

    {

        Name myname = new Name();

        myname.Get += new Name.myEventHandler(myname_get); //--------------4

        myname.Text = "張三";//--------------------------------------------1

    }

    //用於訂閱事件的myname_get()方法

    static void myname_get(object sender, Name.NameEventArgs e) //---------5

    {

        //輸出事件資訊,和事件釋出者的屬性

        Console.WriteLine("事件資訊:{0}", e.ToString());

        Console.WriteLine("事件釋出者:{0}", sender.ToString());

        Console.WriteLine("你輸入的名字是:{0}",((Name)sender).Text);

    }

}

結果:

事件資訊:Text屬性被更改了

事件釋出者:Name類的物件

你輸入的名字是:張三

請按任意鍵繼續. . .

使用匿名方法,直接將方法體的程式碼和委託物件關聯而不需要單獨定義此方法

class EventDel

{

     static void Main(string[] args)

    {

         Name myname=new Name();

        myname.Get += delegate(object sender, Name.NameEventArgs e)

        {

        };

    }

}

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

class EventDel

{

     static void Main(string[] args)

    {

         Name myname=new Name();

        myname.Get += (object sender, Name.NameEventArgs e) =>

        {

        };

    }

}

委託是一種安全的函式指標,事件是一種訊息機制

         委託提供了封裝方法的方式,事件是某動作已發生的說明,事件是建立於委託之上

         程式執行時同一個委託能夠用來呼叫不同的方法,只要改變它的引用方法即可,因此委託調節器用的方法不是在編譯時決定的,而是在執行時確定的.

請解釋這種語法現象Session[“name”]=20;

    給類的索引器賦值.

ASP.Net的身份驗證方式有哪些?分別是什麼原理?

Asp.net的身份驗證有有三種,分別是"Windows | Forms | Passport",

window驗證: ASP.NET 會結合資訊服務 (IIS),為每個使用者開啟window帳號,驗證其身份,安全性較高。

forms驗證:為每個登陸使用者寫入一個身份驗證票據,在web使用最廣的驗證方式,靈活方便。

passport驗證:由 Microsoft 提供的集中身份驗證服務,該服務為成員站點提供單一登入和核心配置

什麼是code-Behind技術。

就是程式碼隱藏,在ASP.NET中通過ASPX頁面指向CS檔案的方法實現顯示邏輯和處理邏輯的分離,這樣有助於web應用程式的建立。比如分工,美工和程式設計的可以個幹各的,不用再像以前asp那樣都程式碼和html程式碼混在一起,難以維護。

新建一個VS.Net下的專案。。看到ASPX,RESX和CS三個字尾的檔案,這個就是程式碼分離。實現了HTML程式碼和伺服器程式碼分離,方便程式碼編寫和整理。

活動目錄。

活動目錄是window2000的最重要的功能。可以將使用者資訊全部整合起來,登陸以後可以訪問多個不同的網路服務。。

活動目錄包括兩個方面:目錄和與目錄相關的服務。安裝了活動目錄的計算機稱為“域控制器”,對於使用者而言,只要加入並接受域控制器的管理就可以在一次登入之後全網使用,方便地訪問活動目錄提供的網路資源。對於管理員,則可以通過對活動目錄的集中管理就能夠管理全網的資源。

.Net中讀寫XML的類都歸屬於哪些名稱空間?

System.XML名稱空間,任何型別的專案都可以通過System.XML名稱空間進行XML處理。使用System.Xml名稱空間中的XmlDocument類來操作xml的資料

C#中 Socket所在的名稱空間是?

System.Net.Sockets。 Socket 類為網路通訊提供了一套豐富的方法和屬性。Socket 類允許您使用 ProtocolType 列舉中所列出的任何一種協議執行非同步和同步資料傳輸。

什麼是SOAP,有哪些應用。

SOAP(Simple Object Access Protocol )簡單物件訪問協議是在分散或分散式的環境中交換資訊並執行遠端過程呼叫的協議,是一個基於XML的協議。使用SOAP,不用考慮任何特定的傳輸協議(最常用的還是HTTP協議),可以允許任何型別的物件或程式碼,在任何平臺上,以任何一直語言相互通訊。這種相互通訊採用的是XML格式的訊息。

SOAP 是一種輕量級協議,用於在分散型、分散式環境中交換結構化資訊。 SOAP 利用 XML 技術定義一種可擴充套件的訊息處理框架,它提供了一種可通過多種底層協議進行交換的訊息結構。 這種框架的設計思想是要獨立於任何一種特定的程式設計模型和其他特定實現的語義。

如何理解.Net中的垃圾回收機制。

垃圾回收器每次進行垃圾回收時,對堆上的物件進行檢查,把沒有被任何變數引用的物件銷燬。但並不是檢查堆上的每個物件,而是將物件進行分類,將所有物件分類三代(generation)。生命週期越短(新建立的物件)代數越小,反之越大。

在堆空間不夠用時,垃圾回收器回收垃圾,檢查第0代物件,如果發現沒有被引用的物件,則標記這些為“垃圾”,並銷燬。而倖存的部分的第0代物件將升級為第1代物件,某些標記為“垃圾”的物件也會倖存而升級。這時如果堆空間仍然不夠用(如建立比較大的新物件),垃圾收集器將會檢查第1代物件,將沒有引用的物件進行銷燬。倖存部分升級為第2代物件,當記憶體堆空間仍然不夠用時,檢查第2代物件,不過第2代物件檢查後仍然是第2代物件,不會繼續升級。

如果發現記憶體不夠,則垃圾回收器,將全部物件作為無效物件(被回收物件),然後先將全域性變數,static,處於活動中的區域性變數,以及當前CG指標指向的物件放入一個表中。然後會搜尋新列表中的物件所引用的物件,加入列表中,其他沒有被加入列表的物件都會被回收。

垃圾回收器優化引擎根據正在進行的分配情況確定執行回收的最佳時間。當垃圾回收器執行回收時,它檢查託管堆中不再被應用程式使用的物件並執行必要的操作來回收它們佔用的記憶體。

    三個generation,當每個generation記憶體滿了的時候檢查引用,無引用就回收記憶體

常用的呼叫webservice方法有哪些?

1.使用WSDL.exe命令列工具。

2.使用VS.NET中的Add Web Reference選單選項

什麼是XML?列舉一下你所瞭解的XML技術及其應用

    XML即可擴充套件標記語言。eXtensible Markup Language.標記是指計算機所能理解的資訊符號,通過此種標記,計算機之間可以處理包含各種資訊的文章等。如何定義這些標記,即可以選擇國際通用的標記語言,比如HTML,也可以使用象XML這樣由相關人士自由決定的標記語言,這就是語言的可擴充套件性。XML是從SGML中簡化修改出來的。它主要用到的有XML、XSL和XPath等。

    xml可以用來做網頁(xslt);xml可以當作資料庫;xml可以用來儲存物件的系列化;xml用於配置;用於儲存靜態資料型別。接觸XML最多的是web Services和config

XML 與 HTML 的主要區別

1. XML是區分大小寫字母的,HTML不區分。

2. XML中,絕對不能省略掉結束標記。在HTML中,如果上下文清楚地顯示出段落或者列表鍵在何處結尾,那麼你可以省略</p>或者</li>之類的結束 標記。

3. 在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個 / 字元作為結尾。這樣分析器就知道不用 查詢結束標記了。

4. 在XML中,屬性值必須在引號中。在HTML中,引號是可用可不用的。

5. 在XML中,所有的屬性都必須帶有相應的值。在HTML中,可以擁有不帶值的屬性名。

C#中property與attribute的區別,他們各有什麼用處,這種機制的好處在哪裡?

    property和attribute漢語都稱之為屬性。

    property一個是屬性,用於存取類的欄位,類向外提供的資料區域,

         attribute一個是特性,用來標識類,方法等的附加性質, 描述物件在編譯時或執行時屬性的.

C#可否對記憶體進行直接的操作?

         這個問題比較難回答,也是個很大的問題。但是可以這樣問答。C#是可以對記憶體進行直接操作的,雖然很少用到指標,但是C#是可以使用指標的,在用的時候需要在前邊加unsafe,,在.net中使用了垃圾回收機制(GC)功能,它替代了程式設計師,不過在C#中不可以直接使用finalize方法,而是在解構函式中呼叫基類的finalize()方法。

2<<3.

觸發器,效能好,事務性

ADO.NET相對於ADO等主要有什麼改進?

    簡單的說,ADO.NET新增dataset等,不需要隨時保持連線,效能提高.

1:ADO.Net不依賴於ole db提供程式,而是使用.net託管提供的程式,

2:不使用com

3:不在支援動態遊標和伺服器端遊

4:,可以斷開connection而保留當前資料集可用

5:強型別轉換

6:xml支援

         您可以通過將 ADO.NET 的各項功能與 ActiveX 資料物件 (ADO) 的特定功能進行比較來理解 ADO.NET 的功能。

         1、資料的記憶體中表示形式