Asp.net面試題


Asp.net核心技術思想 

1、概述反射和序列化

反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然后,可以調用類型的方法或訪問其字段和屬性

序列化:序列化是將對象轉換為容易傳輸的格式的過程。例如,可以序列化一個對象,然后使用 HTTP 通過 Internet 在客戶端和服務器之間

傳輸該對象。在另一端,反序列化將從該流重新構造對象。

2.如何把一個array復制到arrayList

  方法一、使用foreach循環,將array數組中的數據逐步放入ArrayList的對象中;

  方法二、使用Copy方法,進行數據的復制;

  方法三、使用ArrayList的adpater的方法 ,將整個Array對象封裝到ArrayList對象中。

// author:renfuming

public static void Main(string[] renargs)

{

int[] arrayInt=new int[]{1,2,3,4};

ArrayList arrlistInt=new ArrayList(); 

//方法一

foreach(int a in arrayInt)

{

arrlistInt.Add(a);

}

Console.WriteLine(arrlistInt[2].ToString());//輸出3

//方法二:

ArrayList arrlistInt2=new ArrayList();

arrlistInt2=ArrayList.Adapter(arrayInt);

Console.WriteLine(arrlistInt2[2].ToString());//輸出3

           //逆向轉換

Array resultArr=(int[])arrlistInt2.ToArray(typeof(int));

Console.WriteLine(resultArr.GetValue(2));//輸出3

}

3.datagrid.datasouse可以連接什么數據源

 [dataset,datatable,dataviewIList]等接口類型的對象

4. new有幾種用法

 第一種:new Class(),新建一個類的對象,但是此類必須的又可訪問的構造函數

 第二種:顯式覆蓋基類的方法:public new Menthod(){}

5.概述o/r mapping 的原理

利用反射,配置 將類於數據庫表映射

O/RMapping(有學習曲線,沒有工具支持會相當大):存在的時間已經很長,我認為它的最主要的作用是關系型數據庫的反設計——關系型數據庫的設計就是要把現實中的對象和對象間關系設計成實體和實體間的關系映射。而O/RMapping恰好相反,它是把實體和實體間的關系映射還原回對象和對象間的關系。

6.類成員有( )種可訪問形式

可訪問性:public ,protected ,private,internal

可能還有其他的訪問形式,具體的情況視編碼需要而定

7.sealed修飾的類有什么特點

sealed 修飾符用於防止從所修飾的類派生出其它類。如果一個密封類被指定為其他類的基類,則會發生編譯時錯誤。

密封類不能同時為抽象類。

sealed 修飾符主要用於防止非有意的派生,但是它還能促使某些運行時優化。具體說來,由於密封類永遠不會有任何派生類,所以對密封類的

實例的虛擬函數成員的調用可以轉換為非虛擬調用來處理。

8.列舉ADO.NET中的五個主要對象,並簡單描述

connection,command,dataReader,transaction,dataset ...

其上對於各種對象,連接不同的數據庫將會有不同的對象變體

Connection:  數據庫的連接需要此對象

Command:執行數據表變化的命令

dataReaderdataset主要是對數據庫的表信息進行兩種不同方式的讀取,具體的讀取得區別,后面將會有講解

9.執行下面代碼后:

String strTemp ="yyaccpx 某某某"

Int i System.Text.Encoding.Default.GetBytes(strTemp).Length;

Int j = strTemp.Length;

結果:i=(14 ) j=(11 )

i=(14 ) j=(11 ) 中文在內存中占兩個字節

但是只算是一個字符

10.C#中,string str = null 與 string str ="",請盡量用文字說明區別。(要點:說明詳細的內存空間分配)

string str ="" 在棧中存取地址,在堆中存放對象的值

String str=null;僅僅在內存棧中分配了空間

11.詳述.NETclassstruct的異同!

class:放在屬於引用類型,故其存放於內存的堆中 

Struct屬於值類型,其存放於棧中,作為參數傳遞的時候屬於值傳遞

類與結構有很多相似之處:結構可以實現接口,並且可以具有與類相同的成員類型。然而,結構在幾個重要方面不同於類:結構為值類型而不

是引用類型,並且結構不支持繼承。結構的值存儲在“在堆棧上”或“內聯”。細心的程序員有時可以通過聰明地使用結構來增強性能。

12.概述.NET里對 remoting 和 webservice 兩項技術的理解和實際中的應用。

其實現的原理並沒有本質的區別,在應用開發層面上有以下區別:

1Remoting可以靈活的定義其所基於的協議,如果定義為HTTP,則與Web Service就沒有什么區別了,一般都喜歡定義為TCP,這樣

Web Service稍為高效一些

2Remoting不是標准,而Web Service是標准;

3Remoting一般需要通過一個WinForm或是Windows服務進行啟動,而Web Service則需要IIS進行啟動。

4、在VS.net開發環境中,專門對Web Service的調用進行了封裝,用起來比Remoting方便

我建議還是采用Web Service好些,對於開發來說更容易控制

Remoting一般用在C/S的系統中,Web Service是用在B/S系統中

后者還是各語言的通用接口

相同之處就是都基於XML

為了能清楚地描述Web Service Remoting之間得區別,我打算從他們的體系結構上來說起

Web Service大體上分為5個層次

1. Http傳輸信道 

2. XML的數據格式 

3. SOAP封裝格式 

4. WSDL的描述方式 

5. UDDI 

總體上來講,.NET 下的 Web Service結構比較簡單,也比較容易理解和應用: 

一般來講在.NET結構下的WebService應用都是基於.net framework以及IIS的架構之下,所以部署(Dispose)起來相對比較容易點

從實現的角度來講, 

首先WebService必須把暴露給客戶端的方法所在的類繼承於:System.Web.Services.WebService這個基類 

其次所暴露的方法前面必須有[WebMethod]或者[WebMethodAttribute] 

WebService的運行機理 

首先客戶端從服務器的到WebServiceWSDL,同時在客戶端聲稱一個代理類(Proxy Class) 

這個代理類負責與WebService服務器進行Request Response 

當一個數據(XML格式的)被封裝成SOAP格式的數據流發送到服務器端的時候,就會生成一個進程對象並且把接收到這個Request

SOAP包進行解析,然后對事物進行處理,處理結束以后再對這個計算結果進行SOAP包裝,然后把這個包作為一個Response發送給客戶

端的代理類(Proxy Class),同樣地,這個代理類也對這個SOAP包進行解析處理,繼而進行后續操作。 

這就是WebService的一個運行過程。 

下面對.net Remoting進行概括的闡述: 

.net Remoting 是在DCOM等基礎上發展起來的一種技術,它的主要目的是實現跨平台、跨語言、穿透企業防火牆,這也是他的基本特

點,與WebService有所不同的是,它支持HTTP以及TCP信道,而且它不僅能傳輸XML格式的SOAP包,也可以傳輸傳統意義上的二進制流

,這使得它變得效率更高也更加靈活。而且它不依賴於IIS,用戶可以自己開發(Development)並部署(Dispose)自己喜歡的宿主服務

器,所以從這些方面上來講WebService其實上是.net Remoting的一種特例。

ASP.NET Web 服務基礎結構通過將 SOAP 消息映射到方法調用,為 Web 服務提供了簡單的 API。通過提供一種非常簡單的編程模型(基於將 SOAP 消息交換映射到方法調用),它實現了此機制。ASP.NET Web 服務的客戶端不需要了解用於創建它們的平台、對象模型或編程語言。而服務也不需要了解向它們發送消息的客戶端。唯一的要求是:雙方都要認可正在創建和使用的 SOAP 消息的格式,該格式是由使用 WSDL 和 XML 架構 (XSD) 表示的 Web 服務合約定義來定義的。

. NET Remoting 為分布式對象提供了一個基礎結構。它使用既靈活又可擴展的管線向遠程進程提供 .NET 的完全對象語義。ASP.NET Web 服務基於消息傳遞提供非常簡單的編程模型,而 .NET Remoting 提供較為復雜的功能,包括支持通過值或引用傳遞對象、回調,以及多對象激活和生命周期管理策略等。要使用 .NET Remoting,客戶端需要了解所有這些詳細信息,簡而言之,需要使用 .NET 建立客戶端。.NET Remoting 管線還支持 SOAP 消息,但必須注意這並沒有改變其對客戶端的要求。如果 Remoting 端點提供 .NET 專用的對象語義,不管是否通過 SOAP,客戶端必須理解它們。

13.什么是code-behind技術

對於每一個Aspx文件可以相對應一個CS文件類,aspx繼承自對應的CodeBehind類,在編譯時,CodeBhind類編譯到webui工程對應的dll中,而aspx頁面中的內含代碼和aspx一起編譯到temporary.dll中,被客戶端瀏覽器訪問。

14.概述三層結構體系

webUI層:封裝基本的頁面布局形式,即表示層

DataAccess(DAO)層:數據訪問層,利用各種相關的技術,與底層數據庫進行交互

Business層:業務邏輯層,封裝整個程序的業務邏輯代碼,主要與DAO層相關聯

Model 層: 封裝程序領域對象,該層可以在上面的三層之間進行很好的交互

這只是基本的三層架構設計,如果利用設計模式,則可以在此基礎上進行靈活的變化

15.asp.net如何實現MVC模式,舉例說明!

  在Asp.net 中實現MVC模式,相對於 JAVA沒有那么快捷,但是仍是可以實現的

且由於代碼隱藏和事件驅動得引入,意義不時很大,具體的實現,可以利用HttpHandler,如此,則應在Web.config文件中配置相關的節點

//Author:renfuming

<httpHandlers>

      <add verb="*" path="SendTopic.aspx" type="wyzBBS.Servers.SendRootHandler"/>

      <add verb="*" path="SelectTopic.aspx" type="wyzBBS.Servers.SelectTopicHandler"/>

<add verb="*" path="Question.aspx" type="wyzBBS.Servers.QuestionHandler"/>

<add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro"/>

</httpHandlers>

16.值類型和引用類型的區別?

C# 支持兩種類型:“值類型”和“引用類型”。 

值類型(如 charint 和 float)、枚舉類型和結構類型。 

引用類型包括類 (Class) 類型、接口類型、委托類型和數組類型。 

值類型與引用類型的區別在於值類型的變量直接包含其數據,而引用類型的變量則存儲對象引用。對於引用類型,兩個變量可能引用同一個對

象,因此對一個變量的操作可能影響另一個變量所引用的對象。對於值類型,每個變量都有自己的數據副本,對一個變量的操作不可能影響另一個變量

17.了解程序集強簽名嗎?

用強名稱來給程序集簽名即謂之程序集強簽名! 

通過簽發具有強簽名的程序集合,可以確保名稱的全局唯一性!因為強名稱是依賴於唯一的密鑰對來確保名稱的唯一性,其他人不會生成與你

相同的程序集名稱(不同的私鑰產生的名稱不同) 

強名稱保護程序集的版本沿襲,因為強名稱的唯一性能夠確保沒有其他人能夠生成你的程序集的后續版本 

強名稱提供可靠的完整性檢查,通過.NET Framework安全檢查后,可以確保程序集內容在生成后未被更改過! 

要注意的是,具有強名稱的程序集引用其他程序集,如果這個程序集沒有強名稱,那么具有強名稱的程序集所帶來的好處,並依舊會產生DLL

突!因此具有強名稱的程序集只能引用其他具有強名稱的程序集。 

18. C#中接口和類有什么區別?

接口是負責功能的定義,項目中通過接口來規范類,操作類以及抽象類的概念!

而類是負責功能的具體實現!

在類中也有抽象類的定義,抽象類與接口的區別在於:

抽象類是一個不完全的類,類里面有抽象的方法,屬性,也可以有具體的方法和屬性,需要進一步的專業化。

但接口是一個行為的規范,里面的所有東西都是抽象的!

一個類只可以繼承一個基類也就是父類,但可以實現多個接口

19.View State 的作用和實現方式?

設置是否要保存控件的狀態,其功能的實質是利用隱藏表單域實現 

如果設為false且在Page_Load中沒有重新綁定數據的話,只要頁面一刷新,控件的內容就沒了 如果設為true,則頁面會保存控件的內容 

在一些不需要保存狀態的頁面中最好把它設為false,為什設為true會增加服務器的負擔  隱藏域

20.ASP.net中可以利用哪些對象存儲狀態?幾種維持狀態的對象應用場合以及優缺點?

主要用Applicationsession,viewstate,cookie,cache。 

Application:應用程序級別的共享變量,優點是應用程序一開啟該站點都能訪問此變量。缺點:所有對此進行寫入操作要加鎖,由此共享變

量鎖帶來的內存開銷只有此應用程序關閉才能結束。 

Session:維護用戶個人的狀態信息,優點:個人所從事活動,如登錄信息,購物車信息等較安全而且又服務器維護較穩定。缺點:維持http

連接的sessionID仍然有缺陷,同時為每個用戶維護狀態信息,服務器內存開銷很大。 

Viewsate:如4所說,在一些場合能體現它的特點,但同時帶來的缺點:影響整個頁面的速度以及隱藏字段未加密。 

Cookie:優點是將狀態信息維護在客戶端的一個文本文件,不需要耗用服務器的內存,是目前各大網站主要采用的方式。 缺點:由於其將狀態

信息存貯在客戶端,很可能由別人破解此文件而獲得此人的個人隱私和機密信息。其受限大小為4K. 

Cache:優點是提供的此功能很強大,如文件緩存依賴、API依賴、數據庫依賴以用於存貯數據變化而更換緩存狀態數據。提供存儲周期

httpcontexthttpruntime。缺點:耗用服務器內存。

Request

21.簡單說說 ASP.NET 中基於表單的身份驗證方式的用法?

配置文件提供對站點那些目錄的保護以及登錄頁面,當訪問該目錄的文件時,如果用戶未認證通過,將轉入登錄頁面, 用戶輸入用戶名和密碼

,將此參數傳入認證模塊authentication,該模塊負責認證,如果通過將isauthentication設置為true,並返回用戶的identity對象,此

時頁面將轉入初始請求頁,如果未通過,將不允許訪問此目錄。

22.是否了解 URL Rewrite?請簡要說明其原理和在 ASP.NET 中的實現方式?

一般放在httpmoduleapplicatioin_request事情中,當每次http請求,將此URL定位到重寫的url函數中並返回重寫后的URL地址。主要用

於當我們站點板塊移動時由於鏈接仍然指向舊地址,故可以重定向到新的地址,當然查詢參數也可以重寫。url-mapping配置

23. 在超過10萬條記錄的頁面顯示時,你如何處理分頁,有多少種替代方案?

一般根據頁面選擇的第幾頁PageIndex,以及服務端配置文件配置的每頁行數PageSize,通過傳入參數傳入存貯過程,由其返回相應行

pagesize的記錄。即每一頁數據都由服務端返回。

可以利用緩存Cache,將數據一次加載,在結合asp.net2.0中數據庫緩存方式,跟蹤數據庫表的信息的變化,自動更新緩存信息 

對於數據分野頁,也可以利用gridview的數據邦定控件的自動分頁的方式

24. DataReaderDataSet的異同?

Daatareaderdatatset都是通過從數據源取數據。不同點:datareader提供只進行流的方式讀取數據。Dataset提供一種容器里面主要由表

以及表關系,由適配器來提供從數據源取得數據填充到此容器的表中。

DataReaderDataSet最大的區別在於,DataReader使用時始終占用SqlConnection,在線操作數據庫..任何對SqlConnection的操作都會引

DataReader的異常..因為DataReader每次只在內存中加載一條數據,所以占用的內存是很小的..因為DataReader的特殊性和高性能.所以DataReader是只進的..你讀了第一條后就不能再去讀取第一條了..

DataSet則是將數據一次性加載在內存中.拋棄數據庫連接..讀取完畢即放棄數據庫連接..因為DataSet將數據全部加載在內存中.所以比較消

耗內存...但是確比DataReader要靈活..可以動態的添加行,,數據.對數據庫進行回傳更新操作

25. 你會利用那些工具進行數據庫的性能分析及其優化?說說你覺得優化數據庫需要注意的方面。比如:如何設計優化查詢為主、插入更新為

主的表。

我主要通過執行計划以及索引優化以及客戶統計和服務器跟蹤工具來檢測從SQL到索引、硬盤IO和時間等信息。 對於查詢為主的表,首先對數

據量的大小有一定的估計,當達到一定程度應采用水平分區,有的根據主鍵有的根據時間段來區分。由於此表往往插入更新不是太快,可對適

當字段采用索引並且填充因子可以盡量大。SQL優化等。 對於插入更新為主的表,我覺得健壯性更重要,只要根據標准外部采用存貯過程就可

以了。

26. 數據庫某表主鍵自增,是很常見的情形。在ASP. NetC#程序中,要求向該表插入一條記錄,並馬上從該表查出這條記錄。不能使用時間戳,請問你如何實現?

插入一條記錄會返回◎◎identity,通過它就是該記錄的主鍵,再select一下就可以了

27.Xhtml的三種DOCTYPE分別有什么含義?請說明。簡單說明各個情況下,那些標簽可以使用,那些不可以使用?

XHTML 1.0 提供了三種DTD聲明可供選擇:W3C規范

過渡的(Transitional):要求非常寬松的DTD,它允許你繼續使用HTML4.01的標識(但是要符合xhtml的寫法)。完整代碼如下:<!DOCTYPE 

html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

嚴格的(Strict):要求嚴格的DTD,你不能使用任何表現層的標識和屬性,例如<br>。完整代碼如下:<!DOCTYPE html PUBLIC 

"-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

框架的(Frameset):專門針對框架頁面設計使用的DTD,如果你的頁面中包含有框架,需要采用這種DTD。完整代碼如下:<!DOCTYPE html 

PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

28.請舉例說明XHtml代碼規范,越多越好。

1.所有的標記都必須要有一個相應的結束標記

以前在HTML中,你可以打開許多標簽,例如<p><li>而不一定寫對應的</p></li>來關閉它們。但在XHTML中這是不合法的。XHTML要求有

嚴謹的結構,所有標簽必須關閉。如果是單獨不成對的標簽,在標簽最后加一個"/"來關閉它。例如:

<br /><img height="80" alt="網頁設計師" src="../images/logo_w3cn_200x80.gif" width="200" /> 

2.所有標簽的元素和屬性的名字都必須使用小寫

HTML不一樣,XHTML對大小寫是敏感的,<title><TITLE>是不同的標簽。XHTML要求所有的標簽和屬性的名字都必須使用小寫。例

如:<BODY>必須寫成<body> 。大小寫夾雜也是不被認可的,通常dreamweaver自動生成的屬性名字"onMouseOver"也必須修改

"onmouseover"

3.所有的XML標記都必須合理嵌套

同樣因為XHTML要求有嚴謹的結構,因此所有的嵌套都必須按順序,以前我們這樣寫的代碼:

<p><b></p></b> 

必須修改為:

<p><b></b></p> 

就是說,一層一層的嵌套必須是嚴格對稱。

4.所有的屬性必須用引號""括起來

HTML中,你可以不需要給屬性值加引號,但是在XHTML中,它們必須被加引號。例如:

<height=80> 

必須修改為:

<height="80"> 

特殊情況,你需要在屬性值里使用雙引號,你可以用",單引號可以使用',例如:

<alt="say'hello'"> 

5.把所有<&特殊符號用編碼表示

任何小於號(<),不是標簽的一部分,都必須被編碼為& l t ; 

任何大於號(>),不是標簽的一部分,都必須被編碼為& g t ; 

任何與號(&),不是實體的一部分的,都必須被編碼為& a m p; 

注:以上字符之間無空格。

6.給所有屬性賦一個值

XHTML規定所有屬性都必須有一個值,沒有值的就重復本身。例如:

<td nowrap> <input type="checkbox" name="shirt" value="medium" checked> 

必須修改為:

<td nowrap="nowrap"> <input type="checkbox" name="shirt" value="medium" checked="checked"> 

7.不要在注釋內容中使“--

--”只能發生在XHTML注釋的開頭和結束,也就是說,在內容中它們不再有效。例如下面的代碼是無效的:

<!--這里是注釋-----------這里是注釋--> 

用等號或者空格替換內部的虛線。

<!--這里是注釋============這里是注釋--> 

以上這些規范有的看上去比較奇怪,但這一切都是為了使我們的代碼有一個統一、唯一的標准,便於以后的數據再利用。

29. 客戶端與瀏覽器:如果讓你做一個TreeView控件,你的思路

我會采用javascript來做,主要采用htc。 數據通過XML. 

通過htc操作XML並定義一些方法如:loadaddnodedeletenodeupdatenodeselectednode等方法一些屬性如對圖標、節點位置、節

點前復選框等屬性,也會提供一些默認事件如修改節點前后刷新等。

30.談談論壇聊天室IM和各種網站程序的交互與刷新思路的差異與共同點。

IM交互式信息通信 ajax刷新思路,對於集中刷新方式,應該有部分和全部刷新的區別

這個希望大家上網去找詳細的資料

31.談談對WSE的認識。

目前Web Service廣泛采用Https來保障安全,但是該方法也有很多的缺點,尤其是應用於現在越來越復雜的Web Service安全需求。

1.Https提供的是點對點安全保護,而Web Service的特點就是消息往往就要經過多個中介才能到達最終的服務提供方,每個中介還有可能對消息做出些處理,也就是說它需要的是端到端的保護。這顯然是Https所不能提供的。

2.Https是在傳輸層提供的安全,而不是在消息層面,也就是只有在傳輸的過程中才有消息才是安全的(加密的),而一旦到達了終點就是明文的了。比如可以從消息隊列中將重要的信息竊取出來。

3.Https的建立完共享密鑰后,傳遞消息的時候並沒有使用數字簽名技術,所以也就無法得到抗否認性的能力。而這又是在電子商務中不可豁缺的。

4.由於Https提供的是傳輸層的安全,當然也就不可能達到消息安全所需要的靈活性的要求。比如加密消息中的部分元素;用不同的密鑰加密消息的不同部分,從而讓不同的消息接受者查看與之對應的信息。

因此,為了適應Web Service對安全的特殊要求,IBMMS等公司共同制定了WS-Security規范。重新回顧安全問題的三個概念:Confidentiality(機密性), Integrity(完整性), Authentication(身份鑒別),在Web Service使用SOAPXML 格式)作為消息傳輸協議的背景下,分別產生了XML Digital SignatureXML EncryptionSAML(XML格式的Security Token), WS-Security則是如何將他們組合起來以滿足Web Service安全需求的一套規范

Web Services Enhancements 2.0 for Microsoft .NET (WSE)是一個用來建設Web服務的.NET類庫,它支持最新的Web服務協議,包

WS-SecurityWS-SecureConversationWS-TrustWS-PolicyWS-SecurityPolicyWS-Addressing和 WS-Attachments。 

WSE可使開發人員跨安全平台建設可升級的、安全的Web服務。它支持用傳輸的方式發送SOAP消息,而不是HTTP。另一個特點是具有建立SOAP

由器的功能,SOAP消息被發送給SOAP路由器,路由器再將工作交付給托管該服務的Web服務器。

32. 你用過哪些版本控制工具

--------------各位同學兄弟可以根據自己的實際情況,談論一些自己在使用這些工具時所遇到的問題以及體會

TFSASP.Net)、cvssvn

33. 在開發中你利用那些工具進行單元測試和模塊測試

NUNITPDM.頁面測試 httpunuit

34.如何進行Bug管理

由一個BUG跟蹤平台,提供該程序的各個模塊的BUG,以及級別,以及解決時間等信息

35. 如何生成和管理開發文檔

一般用NDOC來生成文檔,大部分文檔主要還是Word為主。主要是各個模塊以及版本的控制等

36.請用代碼簡單描述一下Singleton、抽象工廠、策略模式、Composite(任選三個)的設計模式的概念

Singleton 單一模式所有類共享一個實例

下面這種實現方式對多線程來說是安全的,同時線程不是每次都加鎖,只有判斷對象實例沒有被創建時它才加鎖,有了我們上面第一部分的里面的分析,我們知道,加鎖后還得再進行對象是否已被創建的判斷。它解決了線程並發問題,同時避免在每個 Instance 屬性方法的調用中都出現獨占鎖定。它還允許您將實例化延遲到第一次訪問對象時發生。實際上,應用程序很少需要這種類型的實現。大多數情況下我們會用靜態初始化。這種方式仍然有很多缺點:無法實現延遲初始化。

//author:renfuming 

public sealed class Singleton

 2{

 3    static Singleton instance=null;

 4    static readonly object padlock = new object();

 6    Singleton(){}

10    public static Singleton Instance{

12        get{

14            if (instance==null){

16                lock (padlock){

18                    if (instance==null){

20                        instance = new Singleton();

21                    }

22                }

23            }

24            return instance;

25        }

26    }

27}

抽象工廠(工廠方法)

using System;

//author:renfuming

namespace TestStrategy

{

public interface IFactory

{

void Method();

}

public class MyProductA:IFactory

{

public MyProductA()

{

Console.WriteLine("已經生產產品A");

}

public void Method()

{

Console.WriteLine("實現產品A的具體功能!");

 

}

}

public class MyProductB:IFactory

{

public MyProductB()

{

Console.WriteLine("已經生產產品B");

}

public void Method()

{

Console.WriteLine("實現產品B的具體功能!");

 

}

}

public class CreateProductAFractory

{

public static  MyProductA CreateProductA()

{

return new MyProductA();

}

}

public class CreateProductBFractory

{

public static MyProductB CreateProductB()

{

return new MyProductB();

}

}

public class TestFactory

{

public static void Main(string[] args)

{

IFactory ifact=CreateProductAFractory.CreateProductA();

ifact.Method();

Console.WriteLine("--------------------------------------");

ifact=CreateProductBFractory.CreateProductB();

ifact.Method();

 

}

}

}

策略模式:屬於對象行為型模式,主要針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得他們可以相互替換。策略模式適合用於當一個應用程序需要實現一種特定的服務或者功能,而且該程序有多種不同的實現方式可以使用時使用。

策略模式中有三個對象:

1、 環境對象:該類中實現了對抽象策略中定義的接口或者抽象類的引用。

2、 抽象策略對象:他可以又接口或者抽象類進行實現

3、 具體策略對象:他封裝了實現對同一動作不同功能的不同算法;

利用策略模式構建的應用程序,可以根據用戶配置等內容,選擇不同算法來實現應用程序的功能,具體的選擇由環境對象來完成。采用這種方式可以避免由於使用條件語句而帶來的代碼混亂,提高應用程序的靈活性和條理性。

using System;

//author:renfuming

namespace TestStrategy

{

public interface Strategy

{

void PrintCount(string fruitName,int count);

}

public class MyChoilceA:Strategy

{

public void PrintCount(string fruitName,int count)

{

Console.WriteLine("{0}實現5折后的價格是:{1}",fruitName,count*0.5);

}

}

public class MyChoiceB:Strategy

{

public void PrintCount(string fruitName, int count)

{

Console.WriteLine("{0}實現6折后的價格是:{1}",fruitName,count*0.6);

}

}

public class MyChoiceC:Strategy

{

public void PrintCount(string fruitName, int count)

{

Console.WriteLine("{0}實現7折后的價格是:{1}",fruitName,count*0.7);

}

}

public class ChoiceContext

{

Strategy objStrategy;

public ChoiceContext(Strategy obj)

{

this.objStrategy=obj;

}

public void Execute(string name,int count)

{

this.objStrategy.PrintCount(name,count);

}

}

class MyTestClass

{

[STAThread]

static void Main(string[] args)

{

ChoiceContext objA=new ChoiceContext(new MyChoilceA());

objA.Execute("蘋果",1000);

ChoiceContext objB=new ChoiceContext(new MyChoiceB());

objB.Execute("香蕉",1000);

ChoiceContext objC=new ChoiceContext(new MyChoiceC());

objC.Execute("橘子",1000);

}

}

}

上面的例子是我自己寫的,有不足之處,請自己網上更正!

37.如果你是一位軟件架構師,您將如何去搭建一個符合n-tie的架構?並請描述一下您搭建的每一層的作用。(注意:請您考慮項目中

WebService的情況)

主要根據實際情況來決定搭建的層數以及各層的規格。 一般情況下,可如下搭: 

數據層:主要提供數據服務,該層繼承實體的接口並定制自己的數據提取和存儲。並根據數據庫類型如sqlserveroracle等來建立此層服務。執行邏輯我個人偏好采用存貯過程。 

業務層:由於定制的實體的屬性和操作實體的方法已由數據層獲得和執行,故業務邏輯組件對此實體進行組合以滿足上層對業務邏輯組件的調用,webservice也是建在此層,以用於提供數據服務和邏輯執行。

表示層:一般定制不同的容器控件,以用於加載從業務層不同類型的數據便於呈現。當然也要此層的風格以及各種顯示設置,webservice顯示頁面建在層,通過加載對指定目錄的webservice提供的方法用於呈現。

38.可否簡要的介紹asp.net 2.0 Membership,WebPartC#的匿名函數和泛型等你認為.net 2.0自己感興趣的內容,希望可以簡要地闡述其中的特點(本題非常的重要)

1 Membership:成員管理主要提供了一套對用戶信息、用戶角色、用戶配置信息的用戶系統。通過MembershipConfigHandler加載配置文件

中公有的基礎信息,對配置文件中的信息進行了嚴格的邊界檢查和類型檢查。通過MembershipProvider提供了實現membership的抽象方法以

及配置信息。由SqlMembershipProvider繼承MembershipProvider來實現sqlclient的數據提供服務。業務和實現相剝離,以利於擴展。當

然里面有很多特點也有很多細節等。 

2 WebPart:主要提供頁面布局和自定義以及換皮膚的功能。通過定義主題Theme來決定整體的布局風格,以及版面通過設定不同的區域Zone

決定版面各塊的區域設置。通過不同的skincss來確定風格。讓用戶能夠保存自己的個人設置以及回復默認設置的功能。 

匿名函數:使用匿名方法可以減少因實例化委托所需要的開銷,1.0中使用委托必須實例化委托並且必須將所調用的類和方法作為參數傳入也

即命名方法,當然如果所調用的委托具有多變性應該還采用命名方法。 

泛型:一般用於集合類。由於以前集合類數據都由framework隱式轉化為object類型,這種開銷很大。而用泛型,你就可以指定傳入對象類

型,而用於生成強類型的數據集,這樣各種操作就可以使用指定類型的特性和優勢了,自然速度也快了很多。當然接口、方法、類等都同樣使用這種方式

編譯模型除了asp.net1.0支持的批編譯,也提供新的編譯模式。 

httpmodulehttphander的處理速度要比以前1.0要快。 

在請求響應輸出中,將緩沖區由asp.net宿主進程移到本機內存,可以消除資源瓶頸。 

其緩存模型提供了數據庫依賴和緩存后替功能。 

IIS6.0集中能提供更好的性能,主要體現在緩存和緩沖操作上。

39.Asp.net中的內建對象

Page對象:Web Form 網頁在執行的時候會被編譯成Page 對象,Page對象通知來設置與網頁有關的屬性、方法和事件; 

Response對象:用來決定服務器端在什么時候或如何輸出數據到客戶端; 

Request對象:用來捕獲由客戶端返回服務器的數據; 

Server對象:提供服務器端最基本的屬性和方法; 

Application對象:用來記錄不擊客戶端共享的變量; 

Session對象:用來記錄各客戶端的專用變量; 

Cookies對象:為Web應用程序保存訪問者相關信息.

40..NET具有跨平台的性質嗎?現在是否可以在UNIX平台上廣泛的應用?

非常了不起的工具INET,實現.NET跨平台!

執行摘要

微軟的.NET是一套連接信息、人、系統、設備的軟件技術。此新一代的技術是基於Web服務和小模塊創建的應用,可以使任何應用彼此互連並且

能連接到Internet上的其他大型應用。.NET的基礎核心是集成開發設備(IDE), Visual Studio.NET和一種新的應用執行環境-Microsoft 

.net開發框架。這些系統使開發人員能夠像靈活使用 Visual Basic C#一樣開發強大的應用程序和Web服務。 

但是有局限的一點是:用.net開發的應用程序必須運行於.net服務器或者客戶端。如果所有的用戶都按照.NET運行環境技術標准化這也許可行

,但是實際上當然不是這樣。成千上百萬台電腦運行的是LinuxUnix, OS X 和其他操作系統,而這種環境不是.NET應用程序的標准化運行

環境。因此軟件開發組織需要考慮: 如何有效利用它們的 Microsoft開發人員和Visual Studio.NET的技術特征和優勢但是仍然可以訪問非

微軟服務器, PC機,手提電腦和移動設備?怎樣才能使他們用.NET編寫的程序運行時不受運行環境的局限? 

Stryon公司開發的iNET解決了這一難題。iNET可以使應用程序和Web服務在Visual Basic C#下開發,但發布於任何支持Java的運行環境,

網絡主機也從IBM網絡服務器擴展到LinuxUnix的服務器。有了iNET技術,開發人員既可以利用Visual Studio .net開發環境的優勢,但是又不局限於Microsoft的運行環境。 

41.寫出global.asax文件的主要用途?

作用和aspglobal.asa一樣,它可以使我們執行asp.net應用程序一層事件的代碼,如:application_start等等,使你可以在這些事件中作一些自定義的處理;也可以定義應用程序一層的變量,如:Session等,這在整個asp.net應用程序中起作用。 

42.列出web.config的常用的配置段,並對每個配置段進行簡要的說明。

Web.config文件是一個XML文本文件,它用來儲存 ASP.NET Web 應用程序的配置信息(如最常用的設置ASP.NET Web 應用程序的身份驗證方

式),它可以出現在應用程序的每一個目錄中。當你通過VB.NET新建一個Web應用程序后,默認情況下會在根目錄自動創建一個默認的 

Web.config文件,包括默認的配置設置,所有的子目錄都繼承它的配置設置。如果你想修改子目錄的配置設置,你可以在該子目錄下新建一個

Web.config文件。它可以提供除從父目錄繼承的配置信息以外的配置信息,也可以重寫或修改父目錄中定義的設置。 

在運行時對Web.config文件的修改不需要重啟服務就可以生效(注:<processModel> 節例外)。當然Web.config文件是可以擴展的。appSettings包含自定義應用程序設置。

system.web 系統配置

compilation動態調試編譯設置

customErrors自定義錯誤信息設置

authentication身份驗證,此節設置應用程序的身份驗證策略。

authorization授權此節設置應用程序的授權策略.

43.ASP.NET中的組件相對於ASP的組件部署方面有什么優點?

asp.netasp的最大區別在於編程思維的轉換,而不僅僅在於功能的增強。asp使用vbs/js這樣的腳本語言混合html來編程,而那些腳本語言

屬於弱類型、面向結構的編程語言,而非面向對象,這就明顯產生以下幾個問題:     

    1、代碼邏輯混亂,難於管理:由於asp是腳本語言混合html編程,所以你很難看清代碼的邏輯關系,並且隨着程序的復雜性增加,使得代

碼的管理十分困難,甚至超出一個程序員所能達到的管理能力,從而造成出錯或這樣那樣的問題。     

    2、代碼的可重用性差:由於是面向結構的編程方式,並且混合html,所以可能頁面原型修改一點,整個程序都需要修改,更別提代碼重

用了。     

    3、弱類型造成潛在的出錯可能:盡管弱數據類型的編程語言使用起來回方便一些,但相對於它所造成的出錯幾率是遠遠得不償失的。    

    以上是語言本身的弱點,在功能方面asp同樣存在問題,第一是功能太弱,一些底層操作只能通過組件來完成,在這點上是遠遠比不

php/jsp,其次就是缺乏完善的糾錯/調試功能,這點上asp/php/jsp差不多。那么,asp.net有哪些改進呢?     

  asp.net擺脫了以前asp使用腳本語言來編程的缺點,理論上可以使用任何編程語言包括c++   ,   vb   ,   js等等,當然,最合適的編程語言還是ms.net   frmaework專門推出的c#(csharp),它可以看作是vcjava的混合體吧,盡管ms自己講c#內核中更多的象vc,但

實際上我還是認為它和java更象一些吧。首先它是面向對象的編程語言,而不是一種腳本,所以它具有面向對象編程語言的一切特性,比如封裝性、繼承性、多態性等等,這就解決了剛才談到的asp的那些弱點。封裝性使得代碼邏輯清晰,易於管理,並且應用到asp.net上就可以使業務邏輯和html頁面分離,這樣無論頁面原型如何改變,業務邏輯代碼都不必做任何改動;繼承性和多態性使得代碼的可重用性大大提高,你可以通過繼承已有的對象最大限度保護你以前的投資。並且c#c++java一樣提供了完善的調試/糾錯體系  

1、 經過解釋的語言有兩個缺點,一是缺乏強類型,二是缺乏一個編譯環境,這將導致性能和伸縮性的問題   

  2asp並沒有為應用程序提供一個固有的結構,將代碼和頁面混合在一起使代碼變得很復雜,源文件變的很大,結構和代碼復用很難,維護也很難。   

  3ASP中無論工作多簡單都必須在ASP中編寫代碼完成絕大多數工作,如驗證表單字段等,其他還包括告訴緩存頁面內容,保持表單狀態等,甚至添加新HTML控件也需要寫原始HTML。   

  4、瀏覽器兼容性。移動設備訪問站點,必須編寫代碼檢測這些設備,同時為其提供合適內容。   

  5、標准兼容性,XHTML被越來越多人接受,XMLXSL/T也得到廣泛應用,並且與移動設備進行通信還應該支持WML,這意味着ASP應用不僅

要利用現有標准工作,還要易於升級以支持將來的標准   

  ASP.NET四個主要目標   

  使代碼更清晰   

  提高可部署性,可伸縮性,安全性以及可靠性   

  為不同瀏覽器和設備提供更好的支持   

  支持一種全新的web應用程序。

44.簡述一下webservice技術,在何種場合下適合使用這項技術?   

 Web Service 是一種新的web應用程序分支,他們是自包含、自描述、模塊化的應用,可以發布、定位、通過web調用。Web Service可以執行從簡單的請求到復雜商務處理的任何功能。一旦部署以后,其他Web Service應用程序可以發現並調用它部署的服務。

Web Service是一種應用程序,它可以使用標准的互聯網協議,像超文本傳輸協議(HTTP)XML,將功能綱領性地體現在互聯網和企業內部網上。可將Web服務視作Web上的組件編程。P2P 跨平台技術性應用 Web Services扮演什么角色?

Web services角度所預示的四個趨勢:

◆內容更加動態:一個web service必須能合並從多個不同源來的內容,可以包括股票,天氣,新聞等,在傳統環境中的內容,如存貨水平,

購物訂單或者目錄信息等,都從后端系統而來

◆帶寬更加便宜:web services可以分發各種類型的內容(音頻,視頻流等)

◆存儲更便宜: web services必須能聰明地處理大量數據,意味着要使用數據庫,LDAP目錄,緩沖,和負載平衡軟件等技術保持可擴展能力

◆普遍式計算更重要:web services不能要求客戶使用某一版本的windows的傳統瀏覽器,必須支持各種設備,平台,瀏覽器類型,各種內容類型。

兩種重要技術

要達到這樣的目標,Web services要使用兩種技術:

XML XML是在web上傳送結構化數據的偉大方式,Web services要以一種可靠的自動的方式操作數據,HTML不會滿足要求,而XML可以使web services十分方便的處理數據,它的內容與表示的分離十分理想

SOAP SOAP使用XML消息調用遠程方法,這樣web services可以通過HTTP協議的postget方法與遠程機器交互,而且,SOAP更加健壯和靈活易用。

45.C#說明一下虛函數和接口的區別?

虛函數是動態聯編的基礎,它是引入派生概念之后用來表現基類和派生類成員函數之間的一種關系的。虛函數在基類中定義,它也是一種成員函數,而且是非靜態成員函數。   

   若一個實例方法的聲明中含有   virtual   修飾符,則稱該方法為虛擬方法;一個虛擬方法的實現可以由派生類取代。取代所繼承的虛擬方法的實現的過程稱為重寫該方法;在一個虛擬方法調用中,該調用所涉及的那個實例的運行時類型確定了要被調用的究竟是該方法的哪一個實現。   

虛函數的限制:   

1.虛函數僅適用於有繼承關系的類對象,   所以只有類的成員函數才能說明為虛函數.     

2.靜態成員函數不能是虛函數.     

3.內聯函數不能是虛函數.     

4構造函數不能是虛函數.     

5.析構函數可以是虛函數.   

    接口可以有靜態成員、嵌套類型、抽象、虛擬成員、屬性和事件。實現接口的任何類都必須提供接口中所聲明的抽象成員的定義。接口可以要求任何實現類必須實現一個或多個其他接口。   

    對接口有以下限制:     

    接口可以用任何可訪問性來聲明,但接口成員必須全都具有公共可訪問性。     

  不能向成員或接口自身附加安全性權限。     

  接口可以定義類構造函數,但不能定義實例構造函數。     

  每種語言都必須為需要成員的接口映射一個實現提供規則,因為不只一個接口可以用相同的簽名聲明成員,且這些成員可以有單獨的實現。  

    接口可以由類和結構來實現。為了指示類或結構實現了某接口,在該類或結構的基類列表中應該包含該接口的標識符。如果一個類或結構

實現某接口,則它還隱式實現該接口的所有基接口。即使在類或結構的基類列表中沒有顯式列出所有基接口,也是這樣。  

46.什么是ASP.net中的用戶控件

:用戶控件就是.ascx擴展名的東西嘍,可以拖到不同的頁面中調用,以節省代碼.比如登陸可能在多個頁面上有,就可以做成用戶控件,但是有

一個問題就是用戶控件拖到不同級別的目錄下后里面的圖片等的相對路徑會變得不准確,需要自已寫方法調整.

47.什么叫應用程序域?什么是受管制的代碼?什么是強類型系統?什么是裝箱和拆箱?什么是重載?CTSCLSCLR分別作何解釋?

:裝箱就是把值類型轉成引用類型,MS IL角度看好像是boxing,沒記錯的話是把值從堆棧轉到堆中.拆箱相反,重載就是指一個方法名同,參數個數不同,返回值可以相同的方法.CLR是通用語言運行時,其它的不清楚.

48.列舉一下你所了解的XML技術及其應用

:XML應用非常廣泛,站與站之間的交流,WEB SERVICE都要用它.

如:序列化數據信息等

49.如何理解委托?

:據說相當於函數指針,定義了委托就可以在不調用原方法名稱的情況下調用那個方法.

msdn2005中是這樣解釋的:

委托具有以下特點:

委托類似於 C++ 函數指針,但它是類型安全的。

委托允許將方法作為參數進行傳遞。

委托可用於定義回調方法。

委托可以鏈接在一起;例如,可以對一個事件調用多個方法。

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

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

50.什么是SOAP,有哪些應用。

:SOAPSimple Object Access Protocol )簡單對象訪問協議是在分散或分布式的環境中交換信息並執行遠程過程調用的協議,是一個

基於XML的協議。使用SOAP,不用考慮任何特定的傳輸協議(最常用的還是HTTP協議),可以允許任何類型的對象或代碼,在任何平台上,以任何一直語言相互通信。這種相互通信采用的是XML格式的消息,具體請看:http://playist.blogchina.com/2521621.html

51.Params是什么含義? 

    ParamsC#中的關鍵字,采用此關鍵字可以指定參數數目為可變; 在方法聲明中的 params 關鍵字之后不允許任何其他參數,並且在方

法聲明中只允許一個 params 關鍵字。 

如:

public int fConvert(params int[] iParas)

{

}

52.  C#中有沒有運算符重載?能否使用指針?

有,C#中也有運算符重載,如對運算符“+”進行重載;

C#中也可以使用指針,但要聲明為unsafe

53Internal修飾符有什么含義?

internal數據訪問修飾符,表示對所修飾的成員在當前程序集內可以進行沒有任何限制的訪問;但在當前程序集外部則不能進行訪問,其可訪

問性級別低於public ,高於protected

54.  JAVA的代碼是半編譯半解釋的,C#的代碼是否也是這樣

C#中對於程序代碼的處理很類似於Java中的程序代碼處理機制;也可以稱作半編譯半解釋,具體為:所有.NET源代碼(不管用哪種語言編寫)

在進行編譯時都被編譯成IL。在應用程序運行時被即時(Just-In-TimeJIT)編譯器處理成為機器碼,被解釋及執行。

55.  私有程序集與共享程序集有什么區別?

一個私有程序集通常為單個應用程序所使用,並且存儲於這個應用程序所在的目錄之中,或此目錄下面的一個子目錄中。共享程序集通常存儲

在全局程序集緩存(Global Assembly Cache)之中,這是一個由.NET運行時所維護的程序集倉庫。共享程序集通常是對許多應用程序都有用

的代碼庫,比如.NET Framework類。 

56.  請解釋進程與線程的區別?進程與程序的區別?

一般,一個應用程序對應於一個或多個進程,可以把進程看作是該應用程序在操作系統中的標識;而一個進程通常由多個線程組成,而線程是操作系統為該應用程序分配處理時間的最小單元。 

57.  CLRIL分別是什么含義?

CLR:公共語言運行時,類似於Java中的JVMJava虛擬機;在.Net環境下,各種編程語言使用一種共同的基礎資源環境,這就是CLRCLR將直

接與操作系統進行通信,而編程語言如C#.NET將盡量避免直接與操作系統直接通信,加強了程序代碼的執行安全性,可以這樣看:CLR就是具體的編程語言如:C#.NET與操作系統之間的翻譯,同時它為具體的編程語言提供了許多資源:

•   面向對象的編程模型(繼承、多態、異常處理和垃圾收集等) 

•   安全模型

•   類型系統

•   所有.NET基類

•   許多.NET Framework

•  開發、調試和評測(profiling)工具

•   執行和代碼管理

•   IL到本地代碼(IL-to-native)轉換器和優化器 

IL,中間語言,也稱MSIL,微軟中間語言,或CIL,通用中間語言;所有.NET源代碼(不管用哪種語言編寫)在進行編譯時都被編譯成IL。在應用程序運行時被即時(Just-In-TimeJIT)編譯器處理成為機器碼,被解釋及執行。

58 .請解釋ASPNET中以什么方式進行數據驗證

       Aps.net 中有非空驗證,比較驗證,取值范圍驗證,正則表達式驗證及客戶自定義驗證五大控件,另還有一個集中驗證信息處理控件

591).WEB控件可以激發服務端事件,請談談服務端事件是怎么發生並解釋其原理?自動傳回是什么?為什么要使用自動傳回。

web控件發生事件時,客戶端采用提交的形式將數據交回服務端,服務端先調用Page_Load事件,然后根據傳回的狀態信息自動調用服務端事件

自動傳回是當我們在點擊客戶端控件時,采用提交表單的形式將數據直接傳回到

務端

只有通過自動傳回才能實現服務端事件的機制,如果沒有自動回傳機制就只能調用客戶端事件,而不能調用服務端事件

592).WEB控件及HTML服務端控件能否調用客戶端方法?如果能,請解釋如何調用?

可以調用

例如:<asp:TextBox id="TextBox1" onclick="clientfunction();" runat="server">

</asp:TextBox>

<INPUT id="Button2" value="Button" name="Button2" 

runat="server" onclick="clientfunction();">

593).請解釋ASPNET中的web頁面與其隱藏類之間的關系?

一個ASP.NET頁面一般都對應一個隱藏類,一般都在ASP.NET頁面的聲明中指定了隱藏類例如一個頁面Tst1.aspx的頁面聲明如下

<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>

Codebehind="Tst1.aspx.cs" 表明經編譯此頁面時使用哪一個代碼文件

Inherits="T1.Tst1" 表用運行時使用哪一個隱藏類

60.下面的代碼中有什么錯誤嗎?_ abstract override 是不可以一起修飾______

using System;

class A

{

public virtual void F(){

Console.WriteLine("A.F");

}

}

abstract class B:A

{

public abstract override void F();

}

61.請問: String類與StringBuilder類有什么區別?為什么在.Net類庫中要同時存在這2個類?(簡答)

 如果要操作一個不斷增長的字符串,盡量不用String,改用StringBuilder類。兩個類的工作原理不同:String類是一種傳統的修改字符串的方式,它確實可以完成把一個字符串添加到另一個字符串上的工作沒錯,但是在.NET框架下,這個操作實在是划不來。因為系統先是把兩個字符串寫入內存,接着刪除原來的String對象,然后創建一個String對象,並讀取內存中的數據賦給該對象。這一來二去的,耗了不少時間。而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,能夠在已有對象的原地進行字符串的修改,簡單而且直接。當然,一般情況下覺察不到這二者效率的差異,但如果你要對某個字符串進行大量的添加操作,那么StringBuilder類所耗費的時間和String類簡直不是一個數量級的。 

62.class Class1

{

    private static int count = 0;

    static Class1()

    {

        count++;

    }

    public Class1()

    {

        count++;

    }

}

Class1 o1 = new Class1();

Class1 o2 = new Class1();

請問,o1.Count的值是多少?(  C  )

A.1         B.2             C.3             D.4

63.abstract class BaseClass

{

    public virtual void MethodA()

    {

    }

    public virtual void MethodB()

    {

    }

}

class Class1: BaseClass

{

    public void MethodA(string arg)

    {

    }

    public override void MethodB()

    {

    }

}

class Class2: Class1

{

    new public void MethodB()

    {

    }

}

class MainClass

{

    public static void Main(string[] args)

    {

        Class2 o = new Class2();

        Console.WriteLine(o.MethodA());

    }

}

請問,o.MethodA調用的是: (  A  )

A.BaseClass.MethodAB.Class2.MethodA

C.Class1.MethodAD.都不是

64.請敘述屬性與索引器的區別。 

屬性 索引器     

  通過名稱標識。 通過簽名標識。     

  通過簡單名稱或成員訪問來訪問。 通過元素訪問來訪問。     

  可以為靜態成員或實例成員。 必須為實例成員。     

  屬性的   get   訪問器沒有參數。 索引器的   get   訪問器具有與索引器相同的形參表。     

  屬性的   set   訪問器包含隱式   value   參數。 除了   value   參數外,索引器的   set   訪問器還具有與索引器相同的形參表

65.請敘述constreadonly的區別。

每一個class至多只可以定義一個static構造函數,並且不允許增加訪問級別關鍵字,參數列必須為空。

        為了不違背編碼規則,通常把static數據成員聲明為private,然后通過statci property提供讀寫訪問。

        const 關鍵字用於修改字段或局部變量的聲明。它指定字段或局部變量的值不能被修改。常數聲明引入給定類型的一個或多個常數。

        const數據成員的聲明式必須包含初值,且初值必須是一個常量表達式。因為它是在編譯時就需要完全評估。

        const成員可以使用另一個const成員來初始化,前提是兩者之間沒有循環依賴。

        readonly在運行期評估賦值,使我們得以在確保“只讀訪問”的前提下,把object的初始化動作推遲到運行期進行。

        readonly 關鍵字與 const 關鍵字不同: const 字段只能在該字段的聲明中初始化。readonly 字段可以在聲明或構造函數中初始化。因此,根據所使用的構造函數,readonly 字段可能具有不同的值。另外,const 字段是編譯時常數,而 readonly 字段可用於運行時常數。 

  readonly 只能在聲明時或者構造函數里面初始化,並且不能在 static 修飾的構造函數里面。 

66.您需要創建一個ASP.NET應用程序,公司考慮使用Windows身份認證。所有的用戶都存在於AllWin這個域中。您想要使用下列認證規則來配置這個應用程序:

    a、 匿名用戶不允許訪問這個應用程序。

    b、 所有雇員除了TessKing都允許訪問這個應用程序。

  請問您應該使用以下哪一個代碼段來配置這個應用程序?(  A  )

A. <authorization>

   <deny users=allwin\tess, allwin\king>

   <allow users=*>

   <deny users=?>

 </authorization

67.您要創建一個ASP.NET應用程序在DataGrid控件中顯示一個經過排序的列表。產品數據被存放於一個名為PubBaseMicrosoft SQL 

Server 數據庫。每個產品的主鍵是ProductIDNumeric型並且每個產品有一個字母描述字段,名為ProductName。您使用一個SqlDataAdapter對象和一個SqlCommand對象通過調用一個存儲過程從數據庫中獲取產品數據。您將SqlCommand對象的CommandType屬性設

置為CommandType.StoredProcedure,並將它的CommandText屬性設置為procProductList。您成功的獲取了一個DataTable對象 

68. 寫出一條Sql語句: 取出表A中第31到第40記錄(SQLServer, 以自動增長的ID作為主鍵,  注意:ID可能不是連續的。)

select top 10 * from A where id not in (select top 30 id from A) 

2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A) 

69 .列舉ASP.NET 頁面之間傳遞值的幾種方式。 

1. 使用QueryString, ....?id=1; response. Redirect().... 

2.使用Session變量 

3.使用Server.Transfer 

70。請說明在.net中常用的幾種頁面間傳遞參數的方法,並說出他們的優缺點。 

session(viewstate) 簡單,但易丟失 

application 全局 

cookie 簡單,但可能不支持,可能被偽造 

input ttype="hidden" 簡單,可能被偽造 

url參數簡單,顯示於地址欄,長度有限 

數據庫穩定,安全,但性能相對弱

Using 引入一個名子空間,或在使用了一個對像后自動調用其IDesposeNew 實例化一個對像,或修飾一個方法,表此方法完全重寫此方法

71.請簡述一下用Socket進行同步通訊編程的詳細步驟 

1、在應用程序和遠程設備中使用協議和網絡地址初始化套接字 

2、在應用程序中通過指定端口和地址建立監聽 

3、遠程設備發出連接請求 

4、應用程序接受連接產生通信scoket 

5、應用程序和遠程設備開始通訊(在通訊中應用程序將掛起直到通訊結束) 

6、通訊結束,關閉應用程序和遠程設備的Socket回收資源

72.什么叫做SQL注入,如何防止?請舉例說明。

利用sql關鍵字對網站進行攻擊。過濾關鍵字'等 

所謂SQL注入(SQL Injection),就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特點,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想得到的資料。

http://localhost/lawjia/show.asp?ID=444 and user>0,這時,服務器運行Select * from 表名 where 字段=444 and user>0這樣的查詢,當然,這個語句是運行不下去的,肯定出錯,錯誤信息如下:

•錯誤類型:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)

[Microsoft][ODBC SQL Server Driver][SQL Server]將 nvarchar 值 'sonybb' 轉換為數據類型為 int 的列時發生語法錯誤。

73、一列數的規則如下: 112358132134......  求第30位數是多少, 用遞歸算法實現。

答:public class MainClass 

    { 

        public static void Main()   

        { 

            Console.WriteLine(Foo(30)); 

        } 

        public static int Foo(int i) 

        { 

            if (i <= 0) 

                return 0; 

            else if(i > 0 && i <= 2) 

                return 1; 

            else return Foo(i -1) + Foo(i - 2); 

        } 

    }      

74.請編程實現一個冒泡排序算法?

答: int [] array = new int [*] ;

int temp = 0 ;

for (int i = 0 ; i < array.Length - 1 ; i++)

{

for (int j = i + 1 ; j < array.Length ; j++)

{

if (array[j] < array[i])

{

temp = array[i] ;

array[i] = array[j] ;

array[j] = temp ;

}

}

}

75.求以下表達式的值,寫出您想到的一種或幾種實現方法: 1-2+3-4+……+m

答:

    int Num = this.TextBox1.Text.ToString() ;

int Sum = 0 ;

for (int i = 0 ; i < Num + 1 ; i++)

{

if((i%2) == 1)

{

Sum += i ;

}

else

{

Sum = Sum  - I ;

}

}

System.Console.WriteLine(Sum.ToString());

System.Console.ReadLine() ;

76.在下面的例子里

     using System;

     class A

     {

          public A()

           {

                PrintFields();

           }

          public virtual void PrintFields(){}

      }

      class B:A

      {

           int x=1;

           int y;

           public B()

   {

               y=-1;

           }

           public override void PrintFields()

           {

               Console.WriteLine("x={0},y={1}",x,y);

           }

當使用new B()創建B的實例時,產生什么輸出?

答:X=1,Y=0;x= 1 y = -1

78.根據委托(delegate)的知識,請完成以下用戶控件中代碼片段的填寫: 

namespace test 

public delegate void OnDBOperate(); 

public class UserControlBase : System.Windows.Forms.UserControl 

public event OnDBOperate OnNew; 

privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)

if(e.Button.Equals(BtnNew)) 

//請在以下補齊代碼用來調用OnDBOperate委托簽名的OnNew事件。

}

答:if( OnNew != null )  

    OnNew( this, e ); 

79.根據線程安全的相關知識,分析以下代碼,當調用test方法時i>10時是否會引起死鎖?並簡要說明理由。

public void test(int i) 

   lock(this) 

 { 

   if (i>10) 

   { 

     i--; 

     test(i); 

   } 

 } 

}

答:不會發生死鎖,(但有一點int是按值傳遞的,所以每次改變的都只是一個副本,因此不會出現死鎖。但如果把int換做一個object,那么死鎖會發生)

80.給定以下XML文件,完成算法流程圖。

<FileSystem> 

< DriverC > 

<Dir DirName=”MSDOS622”> 

<File FileName =” Command.com” ></File> 

</Dir> 

<File FileName =”MSDOS.SYS” ></File> 

<File FileName =” IO.SYS” ></File> 

</DriverC> 

</FileSystem> 

請畫出遍歷所有文件名(FileName)的流程圖(請使用遞歸算法)

答:

void FindFile( Directory d )

   FileOrFolders = d.GetFileOrFolders(); 

   foreach( FileOrFolder fof in FileOrFolders )  

   { 

     if( fof is File )  

     You Found a file; 

     else if ( fof is Directory )  

     FindFile( fof ); 

    } 

}

81.abstract classinterface有什么區別?

答:

聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。

不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由於有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。

82.啟動一個線程是用run()還是start()?

答:啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味着它可以由JVM調度並執行。這並不意味着線程就

會立即運行。run()方法可以產生必須退出的標志來停止一個線程。

83.構造器Constructor是否可被override?

答:構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading

84.是否可以繼承String?

答:String類是final類故不可以繼承。

85.try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?

答:會執行,在return前執行。

86.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String?

答:switchexpr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 bytelong,string 都不能作用於swtich

87.當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?

不能,一個對象的一個synchronized方法只能由一個線程訪問。

88.abstractmethod是否可同時是static,是否可同時是native,是否可同時是synchronized?

答:都不能。

89.List, Set, Map是否繼承自Collection接口?

答:ListSetMap不是

161.Set里的元素是不能重復的,那么用什么方法來區分重復與否呢是用==還是equals()? 它們有何區別?

答:Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。

equals()==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。

90.數組有沒有length()這個方法? String有沒有length()這個方法?

答:數組沒有length()這個方法,有length的屬性。String有有length()這個方法。

91.sleep() 和 wait() 有什么區別?

答:sleep()方法是使線程停止一段時間的方法。在sleep 時間間隔期滿后,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)“醒來”的線程具有更高的優先級

(b)正在運行的線程因為其它原因而阻塞。

wait()是線程交互時,如果線程對一個同步對象發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。

92.short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?

答:short s1 = 1; s1 = s1 + 1;有錯,s1short型,s1+1int,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) short s1 = 1; s1 += 1正確。

93.談談final, finally, finalize的區別。

答:

final—修飾符(關鍵字)如果一個類被聲明為final,意味着它不能再派生出新的子類,不能作為父類被繼承。因此     一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在

聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為     final的方法也同樣只能使用,不能重載finally—再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會     執行,然后控制就會進入 finally 塊(如果有的話)。

finalize—方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理     工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的     ,因此所有的類都繼承了它。子類覆蓋 

finalize() 方法以整理系統資源或者執行其他清理工作。finalize()      方法是在垃圾收集器刪除對象之前對這個對象調用的。

93.如何處理幾十萬條並發數據?

答:用存儲過程或事務。取得最大標識的時候同時更新..注意主鍵不是自增量方式這種方法並發的時候是不會有重復主鍵的..取得最大標識要有一個存儲過程來獲取.

94.Session有什么重大BUG,微軟提出了什么方法加以解決?

答:是iis中由於有進程回收機制,系統繁忙的話Session會丟失,可以用Sate   serverSQL   Server數據庫的方式存儲Session不過這種方式比較慢,而且無法捕獲SessionEND事件。

95.產生一個int數組,長度為100,並向其中隨機插入1-100,並且不能重復。

int[] intArr=new int[100];

ArrayList myList=new ArrayList();

Random rnd=new Random();

while(myList.Count<100)

{

 int num=rnd.Next(1,101);

 if(!myList.Contains(num))

 myList.Add(num);

}

  for(int i=0;i<100;i++)

   intArr[i]=(int)myList[i]; 

94,給我一個你最常見到的runtime exception。 

ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, 

CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, 

EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, 

IllegalStateException, 

ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, 

NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, 

SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, 

UnsupportedOperationException 

95errorexception有什么區別

  error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。 

  exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。 

96、另外一道題目的要求是查詢表A中存在ID重復三次以上的記錄,完整的查詢語句如下:

select * from(select count(ID) as count from table group by ID)T where T.count>3

97、比較truncatedelete 命令 

解答:兩者都可以用來刪除表中所有的記錄。區別在於:truncateDDL操作,它移動HWK,不需要 rollback segment .DeleteDML操作需要rollback segment 且花費較長時間

98、將單引號用兩個單引號替換: 

SqlConnection coreDB=new SqlConnection(); 

coreDB.ConnectionString= "workstation id=\"GQA-ERIC-LV\";packet size=4096;integrated security=SSPI;" + 

"data source=\"gqa-eric-lv\";persist security info=False;initial catalog=CoreDB"; 

//單引號用"''"替換,以插入'SQL Server中; 

string Title=TextBox1.Text.Replace("'","''"); 

string Content=TextBox2.Text.Replace("'","''"); 

if(Title.Trim()==""||Content.Trim()=="")return; 

string insertCMD =@"insert into myBBS (Title,Content) Values('"+ Title + "','" +Content+"')"; 

SqlCommand myCommand = new SqlCommand(insertCMD,coreDB); 

coreDB.Open(); 

SqlDataReader myReader = myCommand.ExecuteReader(); 

myReader.Close(); 

coreDB.Close(); 

99、使用存儲過程來插入 

1) 創建存儲過程: 

Create proc InsertMyBBSProc(@Title char(160), @Author char(20), @Content ntext) 

AS 

Insert into myBBS(Title,Author,Content) Values(@Title, @Author, @Content) 

2) 查詢分析器中測試存儲過程: 

declare @title char(160) 

declare @author char(20) 

declare @content char(600) 

set @title='test title 3' 

set @author='david euler 3' 

set @content='it is the content 3' 

exec InsertMyBBSProc @title, @author, @content 

3) C#中通過SqlCommand執行存儲過程: 

SqlConnection coreDB=new SqlConnection(); 

coreDB.ConnectionString= "workstation id=\"GQA-ERIC-LV\";packet size=4096;integrated security=SSPI;" + 

"data source=\"gqa-eric-lv\";persist security info=False;initial catalog=CoreDB"; 

string Title=TextBox1.Text; 

string Content=TextBox2.Text; 

if(Title.Trim()==""||Content.Trim()=="")return; 

 

//InsertMyBBSProc是向MyBBS中插入數據的Procedure: 

SqlCommand insertCMD = new SqlCommand("InsertMyBBSProc",coreDB); 

insertCMD.CommandType=CommandType.StoredProcedure;//命令類型為存儲過程;下面定義參數對象: 

SqlParameter prm1=new SqlParameter("@Title", SqlDbType.Char,160); 

SqlParameter prm2=new SqlParameter("@Author", SqlDbType.Char,20); 

SqlParameter prm3=new SqlParameter("@Content",SqlDbType.NText,1073741823); 

prm1.Direction=ParameterDirection.Input; 

prm2.Direction=ParameterDirection.Input; 

prm3.Direction=ParameterDirection.Input; 

//insertCMD添加SQL參數: 

insertCMD.Parameters.Add(prm1); 

insertCMD.Parameters.Add(prm2); 

insertCMD.Parameters.Add(prm3); 

//SQL參數賦值: 

prm1.Value=Title; 

prm2.Value="David Euler"; 

prm3.Value=Content; 

coreDB.Open(); 

int recordsAffected=insertCMD.ExecuteNonQuery(); 

if(recordsAffected==1)Response.Write("<script>alert('"+ "插入成功" +"');</script>"); 

coreDB.Close();

100、請簡單介紹SOA

什么是服務?如前所述,在一個典型的業務環境里,服務意味着業務函數、業務事務和系統服務。業務函數可能是 getStockQuotegetCustomerAddress 或 checkCreditRating。業務事務可能是 commitInventorysellCoveredOption 或 scheduleDelivery。系統服務可能是 logMessageIngetTimeStamp 或 openFile。請注意各種類型服務之間的區別。從應用程序的角度來看,業務函數實際上是原子的非系統函數。業務事務很像是調用應用程序的簡單函數,但是它們可能是作為自己的事務的上下文所包含的復合函數來實現的。它們可能包括多個底層函數,這些底層函數對調用者來說是透明的。系統函數是能夠從諸如 Windows 或者 Linux 這樣的特定平台中抽象出來的廣義函數。應用程序框架可能提供像 openFile 這樣的廣義函數來有效地虛擬化數據源,從而可以在不考慮真實數據源的類型和位置的情況下使用這類函數。 

Web 服務的出現產生了根本的改變,因為很多 Web 服務項目的成功顯示這種技術事實上確實存在,借此您可以實現真正的面向服務的體系結構。它使您又往回走了一步,不僅分析您的應用程序的體系結構,而且還要分析您正設法解決的基本業務問題。從業務的角度來看,它不再是一個技術問題,而是要開發一種應用程序體系結構和框架,可以在其中定義業務問題,還可以以一致的可重復的方式來實現解決方案。 

不過,首先必須理解 Web 服務並不等同於 面向服務的體系結構Web 服務是包括 XMLSOAPWSDL 和 UDDI 在內的技術的集合,它使您能夠針對特定的消息傳遞和應用程序集成問題構建編程解決方案。隨着時間的推移,您有理由相信這些技術將逐漸成熟並最終為更好、更有效、更健壯的技術所取代,但是,就目前的情況而言,它們可以發揮作用。至少,它們是 SOAs 能夠最終實現這種觀念的證明。那么,面向服務的體系結構實際上是由什么組成的呢? 

SOA 只不過是一種體系結構。它不是任何諸如 Web 服務這樣的特定技術的集合;而是超越它們的,在理想的情況下,是完全獨立於它們的。在業務環境中,SOA 的純粹的體系結構定義可能會是這樣的一種應用程序體系結構,在這種體系結構中,所有功能都定義為獨立的服務,這些服務帶有定義明確的可調用接口,可以以定義好的順序調用這些服務來形成業務流程。請注意這里的表述: 

1. 所有功能都定義為服務。這僅僅包括業務功能、由底層功能組成的業務事務和系統服務功能。這將會產生粒度問題,后面我們將對此進行討論。 

2. 所有的服務都是獨立的。它們就像黑匣子一樣運行:外部組件既不知道也不關心它們如何執行它們的功能,而僅僅關心它們是否返回期望的結果。 

3. 在其最一般的意義上來說,接口是可調用的;也就是說,在體系結構的層面上,它們究竟是本地的(在本系統內)還是遠程的(在直接系統外)、是用什么互連 Scheme 或協議來調用或需要什么樣的基礎架構組件來連接,都是無關緊要的。服務可能是在相同的應用程序中,也可能是在公司內部網內完全不同的系統上的不對稱多處理器的不同地址空間中,還有可能是在用於 B2B 配置的合作伙伴的系統上的應用程序中。 

在所有這些表述中,接口是最關鍵的,同時也是調用應用程序關注的焦點。它定義了必需的參數和結果的類型;因而,它定義了服務的類型,而不是實現服務的技術。系統的責任是實現和管理服務的調用,而不是調用應用程序。這使得可以認識到兩個關鍵的特征:其一,服務是真正獨立的;其二,它們是可以管理的。管理包括許多功能,其中有: 

1. 安全性——請求的授權、加密和解密(在需要時)、確認等等 

2. 部署——出於性能、可用性冗余或其他方面的原因,允許服務在網絡內重新部署(移動) 

3. 日志——用於審核、測量等等 

4. 動態重新路由——用於故障排除(fail over)或負載平衡 

5. 維護——管理服務的新版本 

101、什么是ajax技術,請簡單介紹

自從開始 Web 編程以來,在 Web 應用程序和桌面應用程序之間一直存在着許多取舍。例如,人們通常認為 Web 應用程序提供的用戶界面類型沒有桌面應用程序提供的用戶界面類型那樣豐富。另一方面,Web 應用程序是獨立的平台,其開發機制比較簡單。提供響應更及時的應用程序看似是一項簡單的任務,但對於 Web 開發人員來說卻是一直以來需要攻克的領域。 

傳統意義上,只能通過向 Web 服務器提交新的請求來檢索對用戶輸入所做的響應。在某些情況下,開發人員可以使用 JavaScript 在客戶端上加載所有響應,從而提供更好的用戶體驗。此技術的常見示例是基於所選國家/地區來動態加載一系列州或省。遺憾的是,在很多情況下,不將所有響應都返回或加載到 JavaScript 要更好。返回操作會使過多的 UI 斷開連接,或在客戶端上需要過量的數據,這經常導致生成不易讀的 JavaScriptAJAX 提供了一種新的中間選擇,能夠在維持及時響應和靈活性的同時利用基於服務器的應用程序。

AJAX 是 Asynchronous JavaScript And XML(異步 JavaScript 和 XML)的縮寫,它不是一項技術,而是很多技術的集合。AJAX 使用通信技術(通常為 SOAP 和 XML)發送和接收對服務器的異步請求/響應,然后利用顯示技術(JavaScript、DOM、HTML 和 CSS)處理響應。如今,使用 AJAX 的應用程序是合法的,因為多數瀏覽器都支持這項必需的技術。有關 AJAX 更詳細的定義。

102、請簡單介紹微軟工作流技術:

一、什么是工作流,工作流做什么用呢?
    一個工作流本質是一種方法-用來歸檔包含在完成一個單元的工作中的活動。典型地,在處理過程中,工作""流過一項或更多活動。這些活動可以通過機器或人工來實現,並且有可能象在一個互聯網應用程序定義頁面順序一樣得簡單,也有可能象管理必須為任何數目的人都要看到、更改並同意的文件或產品一樣得復雜。
    二、WWF是什么呢?它的整體框架?
    WWF說到底也是一個程序,只不過它是一個專門控制工作流的程序,它為開發工作流提供了框架、模型、以及工作流的工作引擎(即WorkflowRuntime),讓開發人員快速的建立工作流。
    1Activities(活動)
        工作流的組成部分,一個工作流由若干個activity組成,每個activity都包含特定的功能,去完成一件工作。
    2Serivices(服務)
        當一個工作流實例運行時,可以伴隨運行許多個Serivices,這些Services都是采用可插式調用的,即這些Serivices是為了滿足不同的工作流的運行實例的需求,伴隨實例而運行的。如:在一個工作流的運行實例中,我們可以同時加載與宿主程序通信的Service,監聽和跟蹤工作流實例運行的Service等等。
    3WWF與宿主程序的通信和關系。
    宿主程序能夠與工作流通訊交換數據通過通信Service服務,同時,宿主程序也可以與WWF中一些特殊的Activiy活動通過定義一些接口,采用事件傳遞參數的形式進行通信,交換數據。
    4WWF持久化(“鈍化”)
    WWF工作流程序可以長時間的運行,而且當WWF運行時所在的計算機重新啟動后,這些實例仍然可以正常准確的運行,是由WWF的“鈍化”機制來實現的。在WWF內部包含了一個非常有用的Service服務,用來把這些運行的數據保存到SQlServer中。
    5WWF跟蹤
    WWF中在工作流運行的同時,能夠監視工作流的操作,而其這些操作可記錄在數據庫中或文件里。
    6WWF序列化
    WWFactivity活動是可以被序列化的,通過序列化可將自定義的Activity的自定義樣式進行保存。
    7WWF動態更新
    WWF工作流允許工作流在運行的狀態中,動態的更新工作的狀態,或動態的控制工作流的流向,更改預期的流程。

通過使用WWF,你可以創建基於處理器流的工作流並且把它們部署在任何類型的.NET應用程序中。此外,本文還討論了ASP.NET開發者面對的一些特有的問題-這些問題可能通過使用工作流得到解決,如維持狀態和頁面導航等。
  在20059月,微軟在它的一年兩次的專業開發者會議上公開了Windows Workflow Foundation(WWFWindows工作流基礎)。作為WinFX API的支柱之一,WWF提供給開發者一個普通框架-在其上開發過程驅動的和以工作流為中心的應用程序。
  當前,有些組織力圖把整個商業過程自動化;他們的標准答案就是集合一隊開發者來開發相應的代碼。盡管這種方式對於這些組織帶來良好的作用,然而也有一些固有的問題。為了深入理解這一問題,你需要理解一個工作流的基本特征。
  一個工作流本質是一種方法-用來歸檔包含在完成一個單元的工作中的活動。典型地,在處理過程中,工作""流過一項或更多活動。這些活動可以通過機器或人工來實現,並且有可能象在一個互聯網應用程序定義頁面順序一樣得簡單,也有可能象管理必須為任何數目的人都要看到、更改並同意的文件或產品一樣得復雜。
  因為如此多的工作流必須考慮到人工參預,所以可能需要花費很長工期才能完成,時間可能為幾小時到數月或更長。例如,參預在該過程中的人可能無法找到,不在本地或忙於另外的任務;因此,工作流必須在所有非活動期間能夠把自身持續性存儲。而且,通過編碼獨立實現的過程可能對非技術人員難於理解而對開發者卻難於更改。這一點和其它一些因素正是例如WindowsWF等通用工作流框架的目標-其目的就在於使創建、改變和管理工作流更容易-這是通過向它們提供一個可視化接口或通過定義一組普通API來實現的。
  你可以把WWF工作流放置在任何類型的.NET應用程序中-包括Windows表單程序,控制台應用程序,Windows服務和ASP.NET Web應用程序。每種類型都需要專門的考慮。盡管一些現有示例已經足夠說明如何把工作流宿主到Windows表單程序和控制台應用程序中,但是本文將集中於討論ASP.NET開發者的問題-他們希望把工作流集成到自己的應用程序中。

Windows WFMVC模式
  在開發一個ASP.NET應用程序時,你可能使用WWF的一個普通的方法是實現一種模型-視圖-控制器(MVC)方法。實質上,MVC的目標是把描述層、應用程序邏輯和應用程序流邏輯分離開來。
  搞清楚這個將十分有益於一個ASP.NET應用程序的開發,請考慮一個幫助桌面票工作流的場所。假定有一個商業用戶通過填寫一個ASP.NET Web表單並點擊一個提交按鈕來啟動該工作流。接下來,服務器就會通知一個使用Windows表單應用程序和幫助桌面的雇員--"有新票可用了"。該幫助桌面雇員然后將在這一問題上工作,並在最后關閉該票。如果使用Windows WF來開發這個工作流情形,那么所有的處理邏輯和流程可以被包含在工作流本身,而該ASP.NET應用程序將完全不需要了解這一邏輯。
  這種場所提供了一些穩固的證據-把描述與邏輯相分離是一件好事情。因為這個處理幫助桌面請求的過程是非常普通的,如果使用C#VB.NET代碼在若干不同的.NET應用程序中實現這一邏輯,那么你將會冒着重復編碼的危險甚至更壞的情形--用完全不同的代碼導致同樣的商業處理過程的不同實現。但是如果你使用WWF來實現這一過程,那么需要這一過程的應用程序開發者將僅需在一處修改這些步驟-工作流本身-而不必擔心這樣會改變應用程序邏輯。代碼復制和在哪里實現該過程可以通過Windows WF的使用來加以緩和。
  當使用Windows WFASP.NET中實現MVC架構時,開發者應該嘗試構建獨立於應用程序的工作流-而該工作流仍然宿主於該應用程序中。這將有助於保持邏輯獨立於描述並且保持在該Web應用程序中的工作步驟順序和頁面流之間的高度獨立性。
  一個WWF開發新手可能試圖用一固定數目的活動以某種順序去開發一個工作流,然后開發一組ASP.NET Web表單--這些表單以與之相同的順序從一個表單流向另一個表單。很遺憾,盡管這看上去挺符合邏輯,但是實際上這是非常不具有生產效率的,因為你將會再次實現這個工作流邏輯。Web頁面X不需要知道是否它需要轉到頁面Y或頁面Z來正確地實現該工作流步驟。代之的是,該工作流(模型)應該告訴ASP.NET(控制器)下一步該干什么;然后ASP.NET應該決定要顯示哪個頁面。這樣,每個頁面幾乎不需要了解整個過程;它僅需要知道怎樣完成一個不同的活動並且讓該工作流來關心頁面是如何從一處流向另一處的。這種分離在開發者處理頁面流時帶來了一種極大的靈活性。例如,如果你決定改變該頁面顯示順序,那么你可以從工作流中容易地實現這一點,而不需要改變該ASP.NET應用程序中的一行代碼。

103、請簡單介紹Asp.net2.0 泛型技術

1、類型安全;2、減少裝箱拆箱,運行速度加快;3、增強代碼重用用

1、泛型實現

表面上,C# 泛型的語法看起來與 C++ 模板類似,但是編譯器實現和支持它們的方式存在重要差異。正如您將在后文中看到的那樣,這對於泛

型的使用方式具有重大意義。 

注 在本文中,當提到 C++ 時,指的是傳統 C++,而不是帶有托管擴展的 Microsoft C++。

與 C++ 模板相比,C# 泛型可以提供增強的安全性,但是在功能方面也受到某種程度的限制。 

在一些 C++ 編譯器中,在您通過特定類型使用模板類之前,編譯器甚至不會編譯模板代碼。當您確實指定了類型時,編譯器會以內聯方式插入

代碼,並且將每個出現一般類型參數的地方替換為指定的類型。此外,每當您使用特定類型時,編譯器都會插入特定於該類型的代碼,而不管

您是否已經在應用程序中的其他某個位置為模板類指定了該類型。C++ 鏈接器負責解決該問題,並且並不總是有效。這可能會導致代碼膨脹,

從而增加加載時間和內存足跡。 

在 .NET 2.0 中,泛型在 IL(中間語言)和 CLR 本身中具有本機支持。在編譯一般 C# 服務器端代碼時,編譯器會將其編譯為 IL,就像其

他任何類型一樣。但是,IL 只包含實際特定類型的參數或占位符。此外,一般服務器的元數據包含一般信息。 

客戶端編譯器使用該一般元數據來支持類型安全。當客戶端提供特定類型而不是一般類型參數時,客戶端的編譯器將用指定的類型實參來替換

服務器元數據中的一般類型參數。這會向客戶端的編譯器提供類型特定的服務器定義,就好像從未涉及到泛型一樣。這樣,客戶端編譯器就可

以確保方法參數的正確性,實施類型安全檢查,甚至執行類型特定的 IntelliSense。 

有趣的問題是,.NET 如何將服務器的一般 IL 編譯為機器碼。原來,所產生的實際機器碼取決於指定的類型是值類型還是引用類型。如果客

戶端指定值類型,則 JIT 編譯器將 IL 中的一般類型參數替換為特定的值類型,並且將其編譯為本機代碼。但是,JIT 編譯器會跟蹤它已經

生成的類型特定的服務器代碼。如果請求 JIT 編譯器用它已經編譯為機器碼的值類型編譯一般服務器,則它只是返回對該服務器代碼的引用。

因為 JIT 編譯器在以后的所有場合中都將使用相同的值類型特定的服務器代碼,所以不存在代碼膨脹問題。 

如果客戶端指定引用類型,則 JIT 編譯器將服務器 IL 中的一般參數替換為 Object,並將其編譯為本機代碼。在以后的任何針對引用類型而

不是一般類型參數的請求中,都將使用該代碼。請注意,采用這種方式,JIT 編譯器只會重新使用實際代碼。實例仍然按照它們離開托管堆的

大小分配空間,並且沒有強制類型轉換。 

泛型的好處

.NET 中的泛型使您可以重用代碼以及在實現它時付出的努力。類型和內部數據可以在不導致代碼膨脹的情況下更改,而不管您使用的是值類型

還是引用類型。您可以一次性地開發、測試和部署代碼,通過任何類型(包括將來的類型)來重用它,並且全部具有編譯器支持和類型安全。

因為一般代碼不會強行對值類型進行裝箱和取消裝箱,或者對引用類型進行向下強制類型轉換,所以性能得到顯著提高。對於值類型,性能通

常會提高 200%;對於引用類型,在訪問該類型時,可以預期性能最多提高 100%(當然,整個應用程序的性能可能會提高,也可能不會提高)

。本文隨附的源代碼包含一個微型基准應用程序,它在緊密循環中執行堆棧。該應用程序使您可以在基於 Object 的堆棧和一般堆棧上試驗值

類型和引用類型,以及更改循環迭代的次數以查看泛型對性能產生的影響。

104、詳細講解Webservices技術

Web Service是基於網絡的、分布式的模塊化組件,它執行特定的任務,遵守具體的技術規范,這些規范使得Web Service能與其他兼容的組件進行互操作[21]。它可以使用標准的互聯網協議,像超文本傳輸協議HTTP和XML,將功能體現在互聯網和企業內部網上。Web Service平台

是一套標准,它定義了應用程序如何在Web上實現互操作性。可以使用任何語言,在任何平台上寫WebService。

Web Service平台需要一套協議來實現分布式應用程序的創建。任何平台都有它的數據表示方法和類型系統。要實現互操作性,Web Service

平台必須提供一套標准的類型系統,用於溝通不同平台、編程語言和組件模型中的不同類型系統。目前這些協議有:

1.XML和XSD

可擴展的標記語言XML是Web Service平台中表示數據的基本格式。除了易於建立和易於分析外,XML主要的優點在於它既與平台無關,又與

廠商無關。XML是由萬維網協會(W3C)創建,W3C制定的XML SchemaXSD定義了一套標准的數據類型,並給出了一種語言來擴展這套數據類型

Web Service平台是用XSD來作為數據類型系統的。當你用某種語言如VB.NET或C#來構造一個Web Service時,為了符合Web Service標准,

所有你使用的數據類型都必須被轉換為XSD類型。如想讓它使用在不同平台和不同軟件的不同組織間傳遞,還需要用某種東西將它包裝起來。這

種東西就是一種協議,如 SOAP。

2.SOAP

SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用於交換XML編碼信息的輕量級協議。它有三個主要方

面:XML-envelope為描述信息內容和如何處理內容定義了框架,將程序對象編碼成為XML對象的規則,執行遠程過程調用(RPC)的約定。SOAP

可以運行在任何其他傳輸協議上。例如,你可以使用 SMTP,即因特網電子郵件協議來傳遞SOAP消息,這可是很有誘惑力的。在傳輸層之間的

頭是不同的,但XML有效負載保持相同。

Web Service 希望實現不同的系統之間能夠用“軟件-軟件對話”的方式相互調用,打破了軟件應用、網站和各種設備之間的格格不入的狀態

,實現“基於Web無縫集成”的目標。

3.WSDL

Web Service描述語言WSDL就是用機器能閱讀的方式提供的一個正式描述文檔而基於XML的語言,用於描述Web Service及其函數、參數和

返回值。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的。

4.UDDI

UDDI 的目的是為電子商務建立標准;UDDI是一套基於Web的、分布式的、為Web Service提供的、信息注冊中心的實現標准規范,同時也包含

一組使企業能將自身提供的Web Service注冊,以使別的企業能夠發現的訪問協議的實現標准。

5.遠程過程調用RPC與消息傳遞

Web Service本身其實是在實現應用程序間的通信。我們現在有兩種應用程序通信的方法:RPC遠程過程調用和消息傳遞。使用RPC的時候,

客戶端的概念是調用服務器上的遠程過程,通常方式為實例化一個遠程對象並調用其方法和屬性。RPC系統試圖達到一種位置上的透明性:服務

器暴露出遠程對象的接口,而客戶端就好像在本地使用的這些對象的接口一樣,這樣就隱藏了底層的信息,客戶端也就根本不需要知道對象是

在哪台機器上。

微軟的.NET技術應該算是時下最好的Web Service 開發技術。.NET平台不僅延續了微軟一貫的編程風格,而且還增加了許多支持Web 服務的

關鍵性技術,使得.NET在操作的簡單性和執行的穩定性,高效性上達到了一個非常好的結合。微軟的Visual Studio.NET便是一個便於 Web 

服務的開發工具。微軟的目標是,將其新編程語言——C#作為Web Service的首選語言。

.Net Remoting

.Net Remoting是.Net環境下的另外一種分布式處理方式。從某種意義上來說,Remoting就是DCOM的一種升級,它改善了很多功能,並極好

的融合到.Net平台下。Microsoft® .NET Remoting 提供了一種允許對象通過應用程序域與另一對象進行交互的框架[22]。

在Remoting中是通過通道(channel)來實現兩個應用程序域之間對象的通信的。

105、簡單介紹消息隊列(Message Queue)簡介及其使用

利用 MSMQ(Microsoft Message Queue),應用程序開發人員可以通過發送和接收消息方便地與應用程序進行快速可靠的通信。消息處理為您提供了有保障的消息傳遞和執行許多業務處理的可靠的防故障方法。

MSMQ與XML Web Services和.Net Remoting一樣,是一種分布式開發技術。但是在使用XML Web Services或.Net Remoting組件時,Client端需要和Server端實時交換信息,Server需要保持聯機。MSMQ則可以在Server離線的情況下工作,將Message臨時保存在Client端的消息隊列中,以后聯機時再發送到Server端處理。

顯然,MSMQ不適合於Client需要Server端及時響應的這種情況,MSMQ以異步的方式和Server端交互,不用擔心等待Server端的長時間處理過程。

雖然XML Web Services和.Net Remoting都提供了[OneWay]屬性來處理異步調用,用來解決Server端長方法調用長時間阻礙Client端。但是不能解決大量Client負載的問題,此時Server接受的請求快於處理請求。

一般情況下,[OneWay]屬性不用於專門的消息服務中。

1. 基本術語和概念(Basic terms and concepts)

“消息”是在兩台計算機間傳送的數據單位。消息可以非常簡單,例如只包含文本字符串;也可以更復雜,可能包含嵌入對象。

消息被發送到隊列中。“消息隊列”是在消息的傳輸過程中保存消息的容器。消息隊列管理器在將消息從它的源中繼到它的目標時充當中間人。隊列的主要目的是提供路由並保證消息的傳遞;如果發送消息時接收者不可用,消息隊列會保留消息,直到可以成功地傳遞它。

“消息隊列”是 Microsoft 的消息處理技術,它在任何安裝了 Microsoft Windows 的計算機組合中,為任何應用程序提供消息處理和消息隊列功能,無論這些計算機是否在同一個網絡上或者是否同時聯機。

“消息隊列網絡”是能夠相互間來回發送消息的任何一組計算機。網絡中的不同計算機在確保消息順利處理的過程中扮演不同的角色。它們中有些提供路由信息以確定如何發送消息,有些保存整個網絡的重要信息,而有些只是發送和接收消息。

“消息隊列”安裝期間,管理員確定哪些服務器可以互相通信,並設置特定服務器的特殊角色。構成此“消息隊列”網絡的計算機稱為“站點”,它們之間通過“站點鏈接”相互連接。每個站點鏈接都有一個關聯的“開銷”,它由管理員確定,指示了經過此站點鏈接傳遞消息的頻率。

“消息隊列”管理員還在網絡中設置一台或多台作為“路由服務器”的計算機。路由服務器查看各站點鏈接的開銷,確定經過多個站點傳遞消息的最快和最有效的方法,以此決定如何傳遞消息。

2. 隊列類型(Queue Type)

有兩種主要的隊列類型:由您或網絡中的其他用戶創建的隊列和系統隊列。

用戶創建的隊列可能是以下任何一種隊列: 

“公共隊列”在整個“消息隊列”網絡中復制,並且有可能由網絡連接的所有站點訪問。 

“專用隊列”不在整個網絡中發布。相反,它們僅在所駐留的本地計算機上可用。專用隊列只能由知道隊列的完整路徑名或標簽的應用程序訪問。 

“管理隊列”包含確認在給定“消息隊列”網絡中發送的消息回執的消息。指定希望 MessageQueue 組件使用的管理隊列(如果有的話)。 

“響應隊列”包含目標應用程序接收到消息時返回給發送應用程序的響應消息。指定希望 MessageQueue 組件使用的響應隊列(如果有的話)。 

系統生成的隊列一般分為以下幾類: 

“日記隊列”可選地存儲發送消息的副本和從隊列中移除的消息副本。每個“消息隊列”客戶端上的單個日記隊列存儲從該計算機發送的消息副本。在服務器上為每個隊列創建了一個單獨的日記隊列。此日記跟蹤從該隊列中移除的消息。 

“死信隊列”存儲無法傳遞或已過期的消息的副本。如果過期或無法傳遞的消息是事務性消息,則被存儲在一種特殊的死信隊列中,稱為“事務性死信隊列”。死信存儲在過期消息所在的計算機上。有關超時期限和過期消息的更多信息,請參見默認消息屬性。 

“報告隊列”包含指示消息到達目標所經過的路由的消息,還可以包含測試消息。每台計算機上只能有一個報告隊列。 

“專用系統隊列”是一系列存儲系統執行消息處理操作所需的管理和通知消息的專用隊列。 

在應用程序中進行的大多數工作都涉及訪問公共隊列及其消息。但是,根據應用程序的日記記錄、確認和其他特殊處理需要,在日常操作中很可能要使用幾種不同的系統隊列。

3. 同步和異步通信(Synchronous VS. Asynchronous Communication)

隊列通信天生就是異步的,因為將消息發送到隊列和從隊列中接收消息是在不同的進程中完成的。另外,可以異步執行接收操作,因為要接收消息的人可以對任何給定的隊列調用 BeginReceive 方法,然后立即繼續其他任務而不用等待答復。這與人們所了解的“同步通信”截然不同。

在同步通信中,請求的發送方在執行其他任務前,必須等待來自預定接收方的響應。發送方等待的時間完全取決於接收方處理請求和發送響應所用的時間。

4. 同消息隊列交互(Interacting with Message Queues)

消息處理和消息為基於服務器的應用程序組件之間的進程間通信提供了強大靈活的機制。同組件間的直接調用相比,它們具有若干優點,其中包括: 

穩定性 — 組件失敗對消息的影響程度遠遠小於組件間的直接調用,因為消息存儲在隊列中並一直留在那里,直到被適當地處理。消息處理同事務處理相似,因為消息處理是有保證的。 

消息優先級 — 更緊急或更重要的消息可在相對不重要的消息之前接收,因此可以為關鍵的應用程序保證足夠的響應時間。 

脫機能力 — 發送消息時,它們可被發送到臨時隊列中並一直留在那里,直到被成功地傳遞。當因任何原因對所需隊列的訪問不可用時,用戶可以繼續執行操作。同時,其他操作可以繼續進行,如同消息已經得到了處理一樣,這是因為網絡連接恢復時消息傳遞是有保證的。 

事務性消息處理 — 將多個相關消息耦合為單個事務,確保消息按順序傳遞、只傳遞一次並且可以從它們的目標隊列中被成功地檢索。如果出現任何錯誤,將取消整個事務。 

安全性 — MessageQueue 組件基於的消息隊列技術使用 Windows 安全來保護訪問控制,提供審核,並對組件發送和接收的消息進行加密和驗證。

5. 在.Net環境下編寫簡單的Message Queue程序

(1)先安裝Message Queuing Services

通過Control Panel,“Add/Remove Programs” – “Add/Remove Windows Components”步驟安裝MSMQ。

MSMQ可以安裝為工作組模式或域模式。如果安裝程序沒有找到一台運行提供目錄服務的消息隊列的服務器,則只可以安裝為工作組模式,此計算機上的“消息隊列”只支持創建專用隊列和創建與其他運行“消息隊列”的計算機的直接連接。

(2)配置MSMQ

打開Computer Management – Message Queuing,在Private Queues下創建MSMQDemo隊列

(3)編寫代碼-簡單演示MSMQ對象

MessageQueue 類是“消息隊列”周圍的包裝。MessageQueue 類提供對“消息隊列”隊列的引用。可以在 MessageQueue 構造函數中指定一個連接到現有資源的路徑,或者可在服務器上創建新隊列。在調用 Send、Peek 或 Receive 之前,必須將 MessageQueue 類的新實例與某個現有隊列關聯。

MessageQueue 支持兩種類型的消息檢索:同步和異步。同步的 Peek 和 Receive 方法使進程線程用指定的間隔時間等待新消息到達隊列。異步的 BeginPeek 和 BeginReceive 方法允許主應用程序任務在消息到達隊列之前,在單獨的線程中繼續執行。這些方法通過使用回調對象和狀態對象進行工作,以便在線程之間進行信息通訊。

106面向對象軟件設計的“開-----閉”原則

   1.什么是開閉原則
        “原則是指軟件實體應當對擴展性開放,對修改關閉。即軟件實體應該在不修改的前提下擴展,這個原則實際上為軟件設計指明了目標。我們知道軟件設計應當充分考慮軟件的可維護性,即需求發生變化的時候軟件結構能夠靈活地適應這種變化。就評價軟件的可維護性而言,原則提供了一個依據。實際上,設計模式的應用就是使軟件的結構在某種程度上滿足原則。
2原則的實現
      “原則為設計提供了目標,但卻沒有明確給出實現的手段,下面說明在面向對象的設計中實現原則的方法。
   1)面向接口的編程
   面向接口的編程的優勢如下:
   a.降低程序各部分之間的耦合性,使程序模塊互換成為可能。這樣客戶無需知道自己使用的對象的類型,只要對象有客戶所期望的接口即可。並且客戶也不需要知道對象是如何實現的,只要知道定義接口的抽象類。
   b.使軟件各部分便於單元測試,通過編制與接口一致的模擬類(Mock),可以很容易地實現軟件各部分的單元測試。從而提高軟件的可靠性,降低錯誤率。
   c.已於實現軟件的模塊的呼喚,軟件升級時可以只部署發生變化的部分,而不會影響其它部分。
對於設計模式來說,創建型模式的產生是面向接口編程的必然結果,面向接口編程要求使用對象的客戶不了解對象的具體類型,客戶只能通過一個負責實例化對象的對象——我們稱之為工廠”——來實例化對象,而工廠對象在應用初始化時集中進行實例化或者在集中的模塊中進行。
3.封裝變化
        程序中任何可能發生變化的部分都可以封裝為對象,包括命令、事件、屬性、算法和狀態等。封裝變化是實現原則的重要手段,也是在設計中發現對象的重要途徑。因此在分析需求時,一定要注意什么是不變的,什么是可能發生變化的,以及這些可能的變化會對封裝帶來的影響。
例如,如果對象的行為基本不變,那么這些行為可以作為對象的方法;否則就要考慮是否抽象和封裝這些行為。再如,狀態可以用狀態參數來表示,例如溫度和壓力等。可以將狀態參數作為獨立的屬性,但如果狀態參數之間相互關聯,則有必要進行抽象。
總之,封裝可能發生變化的部分,將可能的變化作為對象。在面向對象設計中,對象不僅是指現實中存在的事物或者可視的事物,任何可能變化的部分都是侯選對象。
4.采用組合替代繼承
         繼承是面向對象系統的特點之一,沒有繼承,很多面向對象的設計就無從談起。在設計模式中,沒有哪個模式不涉及到繼承。采用組合替代繼承並不適合任何情況,實際上,如果沒有繼承,很多組合根本無法實現,涉及到基礎結構的繼承無法替換。
組合和繼承針對模塊中的復用而言,當功能需要擴展時,采用繼承實現復用比較簡單直觀。只要派生一個類,在這個類中增加新的特性,即可實現對現有類復用。然而類繼承在編譯時定義,無法在運行時改變 。並且繼承對子類暴露了父類的實現細節,從而破壞了封裝性,使子類與父類耦合性非常強。一旦父類發生變化,必然導致子類也發生變化。如果繼承下來的實現不能解決新問題,則需要修改父類,這種依賴性限制了靈活性。
通過與行為對象的組合,可以擴展的行為。通過增加新的行為類來實現擴展,類層次並沒有增加。
          對象組合在運行時通過獲得對其他對象的引用來實現,組合要求對象遵守彼此的接口約定。只要符合這個約定,一個對象可以在運行時動態地瑋不同的對象組合,從而實現復用。在設計時,每一部分只要關注接口約定即可,不必考慮具體的實現。因此對象組合有最小的耦合性並且更靈活,在設計模式中大量地采用了對象組合。
        再次強調,繼承是面向對象的基石之一。采用組合代替繼承者是在需要復用的前提下,並不是所有的繼承都可以用組合替代。不僅如此,沒有繼承,組合也無從談起。在上面的例子中,行為的擴展仍然需要增加行為子類。

107、請詳細介紹你所了解的AOP技術:

    什么是AOP 

最初聽到AOP這個名詞,我總是錯覺其與OOP是否具有孿生性?那么,所謂AOP,即面向方面編程(Aspect Oriented Programming),是否是面向對象編程的一種進化呢?關鍵就在於我們對“方面(Aspect)”的理解。確實,“方面”這個詞語是夠抽象的,簡單地說,它就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任,例如事務處理、日志管理、權限控制等,封裝起來,便於減少系統的重復代碼,降低模塊間的耦合度,並有利於未來的可操作性和可維護性。

對於OOPBruce Eckel有一句名言,“Everything is Object.”確實,在程序的世界里,我們可以將萬事萬物定義為一種對象,並將這些對象的行為和屬性封裝起來,同時定義好對象與對象之間的關系。很顯然,對於AOP而言,我們無法套用這句名言,妄言“Everything is Aspect.”實質上,AOP只是OOP的一種補充或某種改進,它轉換了編程的范式和視角,關注了一直以來被OOP忽略或者說未能解決好的角落,使開發人員可以更好地將本不該彼此糾纏在一起的責任(如銀行業務和事務處理)分離開來。通過面向方面的編程,可以將程序的責任分開,對象與方面互不干擾。面向方面的模塊並非顯式地為對象所調用,而是通過或注入或截取的方式,去獲得被封裝的對象內部方法間的消息,然后做出相應地處理。也許面向方面的模式破壞了對象的封裝,卻正其如此,方才能降低模塊與模塊之間的耦合度。同樣地,通過對“方面”的封裝,將這些通用的功能從不同的類中分離出來,使不同的模塊都能共享同樣的“方面”,這也極大地減少了重復代碼。

如果說“對象”是一個空心的圓柱體,其中封裝的是對象的屬性和行為;那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開,以獲得其內部的消息。而剖開的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡。

AOP,並不具有革命的驅動力 

個人認為,AOP還談不上是一種編程的思想,只能說是一種方法而已。溯其根源,一般認為,面向方面編程(AOP)是施樂公司帕洛阿爾托研究中心(Xerox PARC)在上世紀90年代發明的一種編程范式。它在OOP的縫隙之中,抽象出“方面”的概念,目的就是為了打破對象的封裝性,以“方面”的方式對原有的模塊進行重組,抽取那些與業務無關卻為整個系統所通用的功能,最終封裝在一起。

那么,最終封裝好的這些所謂“方面”,如何被業務對象所調用呢?這就需要“方面”擁有截取封裝對象消息的能力。在JAVA世界里,AOP的應用已經走向比較成熟的應用。AspectJSpring,在體現AOP能力上來說,已經漸趨成熟。甚至在JBOSS4.0中,已經引入了AOP框架進行開發,並在權限管理(Authentication)、錯誤處理(Error Handling)、事務處理(Transactions)、持久化(Persistence)等方面取得了很好的應用。在.Net平台下,對於AOP的應用似乎卻走到了后面。在Microsoft 推出的.Net Framework 1.1中,並沒有應用AOP,也未曾提供AOP的框架。不過.Net Framework仍然提供了實現AOP的技術可能,即通過.Net Framework的反射機制或.Net Remoting的代理機制獲取元數據信息或對象內部間傳遞的消息。同時,我也看到開源社區中的AOP.Net項目,采用了非托管的.Net Profilling API,它采用了非托管的C++ COM組件,可以在相關事件發生時,通過.Net系統捕獲其消息並發送通知。

AOP在企業應用中正逐漸體現其自身的價值。但正如其名,它的作用更多地是關注於系統的某一方面。AOP還缺乏革命的驅動力,並不足以顛覆OOP世界。我們不可能預見AOP之於OOP,象當初面向對象編程取代面向過程編程那樣,具有強大至可以顛覆程序員思想的力量。而事實上,AOP從一誕生以來,就從未貼上“革命”的標簽。相反,它更多地起到了推波助瀾的作用,彌補着OOP的缺失,進而在OO程序設計中,擴展了一種更寬廣的模式。

AOP,“設計模式”的延續 

不錯,AOP的目的,恰恰就是做了“設計模式”想做卻一直未曾做到的功能。GOF的“設計模式”給了我們設計的典范與准則,通過最大程度的利用面向對象的特性,諸如利用繼承、多態,對責任進行分離、對依賴進行倒置,面向抽象,面向接口,最終設計出靈活、可擴展、可重用的類庫、組件,乃至於整個系統的架構。在設計的過程中,通過各種模式體現了對象的行為,暴露的接口,對象間關系,以及對象分別在不同層次中表現出來的形態。然而鑒於對象封裝的特殊性,“設計模式”的觸角始終在接口與抽象中大做文章,而對於對象內部則無能為力。

舉例來說,我們需要為系統提供日志的能力。雖然我們可以通過裝飾模式(Decorate Pattern),提供各種日志的組合,但不可避免的是,大量的日志對象實例代碼的存在,導致了重復代碼的壞味道,同時也導致了強依賴性,這並不利於模塊間的解耦。如果我們通過AOP,將這些日志的功能看作是一個“方面”,然后將系統中需要日志能力的模塊置於該“方面”的偵聽之中,抽象出來的“方面”好像是一個容器,在其內部的世界里,不分貧富貴賤。只要執行了某種業務,這個容器就會忠實地記錄這些模塊間傳遞的消息。至於這些模塊到底實現了何種業務,卻並非“方面”所關注的。

前面已經敘述到,面向方面編程的價值主要體現在事務處理、日志管理、權限控制等與業務無關,卻為業務模塊所共同調用的邏輯或責任上,而這些所謂的“方面”,恰恰是企業應用時非常必須的。因此,與其說AOP是一種編程的技術,毋寧說AOP是一種企業的“設計模式”。它彌補了OOP之拙,卻未曾也不可能超越OOP而單獨存在。

Aspect-Oriented Programming(面向方面編程,AOP)正好可以解決這一問題。它允許開發者動態地修改靜態的OO模型,構造出一個能夠不斷增長以滿足新增需求的系統,就象現實世界中的對象會在其生命周期中不斷改變自身,應用程序也可以在發展中擁有新的功能。AOP利用一種稱為橫切”的技術,剖解開封裝的對象內部,並將那些影響了多個類的行為封裝到一個可重用模塊,並將其名為“Aspect”,即方面。所謂方面,簡單地說,就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任,例如事務處理、日志管理、權限控制等,封裝起來,便於減少系統的重復代碼,降低模塊間的耦合度,並有利於未來的可操作性和可維護性。

       面向方面編程(AOP)是施樂公司帕洛阿爾托研究中心(Xerox PARC)在上世紀90年代發明的一種編程范式。但真正的發展卻興起於近幾年對軟件設計方興未艾的研究。由於軟件系統越來越復雜,大型的企業級應用越來越需要人們將核心業務與公共業務分離。AOP技術正是通過編寫橫切關注點的代碼,即方面,分離出通用的服務以形成統一的功能架構。它能夠將應用程序中的商業邏輯同對其提供支持的通用服務進行分離,使得開發人員從重復解決通用服務的勞動中解脫出來,而僅專注於企業的核心商業邏輯。因此,AOP技術也就受到越來越多的關注,而應用於各種平台下的AOP技術也應運而生。但由於AOP技術相對於成熟的OOP技術而言,在性能、穩定性、適用性等方面還有待完善,同時AOP技術也沒有形成一個統一的標准,這使得AOP技術的研究更具有前沿性的探索價值。

108、請問你在項目中是否用到存儲過程,並請你談談存儲過程以及它的特點

存儲過程(stored procedure)是一組為了完成特定功能的sql 語句集,經編譯后存儲在數據庫。中用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。 在sql server 的系列版本中存儲過程分為兩類:系統提供的存儲過程和用戶自定義存儲過程。系統過程主要存儲在master 數據庫中並以sp_為前綴,並且系統存儲過程主要是從系統表中獲取信息,從而為系統管理員管理sql server 提供支持。通過系統存儲過程,ms sql server 中的許多管理性或信息性的活動(如了解數據庫對象、數據庫信息)都可以被順利有效地完成。盡管這些系統存儲過程被放在master 數據庫中,但是仍可以在其它數據庫中對其進行調用,在調用時不必在存儲過程名前加上數據庫名。而且當創建一個新數據庫時,一些系統存儲過程會在新數據庫中被自動創建。用戶自定義存儲過程是由用戶創建並能完成某一特定功能(如查詢用戶所需數據信息)的存儲過程。在本章中所涉及到的存儲過程主要是指用戶自定義存儲過程。 

存儲過程的優點 

當利用ms sql server 創建一個應用程序時,transaction-sql 是一種主要的編程語言。若運用transaction-sql 來進行編程,有兩種方法。其一是,在本地存儲transaction- sql 程序,並創建應用程序向sql server 發送命令來對結果進行處理。其二是,可以把部分用transaction-sql 編寫的程序作為存儲過程存儲在sql server 中,並創建應用程序來調用存儲過程,對數據結果進行處理存儲過程能夠通過接收參數向調用者返回結果集,結果集的格式由調用者確定;返回狀態值給調用者,指明調用是成功或是失敗;包括針對數據庫的操作語句,並且可以在一個存儲過程中調用另一存儲過程。 

存儲過程具有以下優點: 

1) 存儲過程允許標准組件式編程 

存儲過程在被創建以后可以在程序中被多次調用,而不必重新編寫該存儲過程的sql 語句。而且數據庫專業人員可隨時對存儲過程進行修改,但對應用程序源代碼毫無影響(因為應用程序源代碼只包含存儲過程的調用語句),從而極大地提高了程序的可移植性。 

2) 存儲過程能夠實現較快的執行速度 

如果某一操作包含大量的transaction-sql 代碼或分別被多次執行,那么存儲過程要比批處理的執行速度快很多。因為存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,並給出最終被存在系統表中的執行計划。而批處理的transaction- sql 語句在每次運行時都要進行編譯和優化,因此速度相對要慢一些。 

3) 存儲過程能夠減少網絡流量 

對於同一個針對數據數據庫對象的操作(如查詢、修改),如果這一操作所涉及到的 transaction-sql 語句被組織成一存儲過程,那么當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調用語句,否則將是多條sql 語句,從而大大增加了網絡流量,降低網絡負載。 

4) 存儲過程可被作為一種安全機制來充分利用 

系統管理員通過對執行某一存儲過程的權限進行限制,從而能夠實現對相應的數據訪問權限的限制,避免非授權用戶對數據的訪問,保證數據的安全。(我們將在14 章“sqlserver 的用戶和安全性管理”中對存儲過程的這一應用作更為清晰的介紹)

109、請簡單介紹一下使用js腳本的好處以及其本身的特點

JavaScript是一種基於對象(Object)和事件驅動(Event Driven)並具有安全性能的腳本語言。使用它的目的是與HTML超文本標記語言、Java 腳本語言(Java小程序)一起實現在一個Web頁面中鏈接多個對象,與Web客戶交互作用。從而可以開發客戶端的應用程序等。它是通過嵌入或調入在標准的HTML語言中實現的。它的出現彌補了HTML語言的缺陷,它是JavaHTML折衷的選擇,具有以下幾個基本特點: 

是一種腳本編寫語言

JavaScript是一種腳本語言,它采用小程序段的方式實現編程。像其它腳本語言一樣,JavaScript同樣已是一種解釋性語言,它提供了一個易的開發過程。 

它的基本結構形式與CC++VBDelphi十分類似。但它不像這些語言一樣,需要先編譯,而是在程序運行過程中被逐行地解釋。它與HTML標識結合在一起,從而方便用戶的使用操作。 基於對象的語言。

JavaScript是一種基於對象的語言,同時以可以看作一種面向對象的。這意味着它能運用自己已經創建的對象。因此,許多功能可以來自於腳本環境中對象的方法與腳本的相互作用。 

簡單性

JavaScript的簡單性主要體現在:首先它是一種基於Java基本語句和控制流之上的簡單而緊湊的設計從而對於學習Java是一種非常好的過渡。其次它的變量類型是采用弱類型,並未使用嚴格的數據類型。 

安全性

JavaScript是一種安全性語言,它不允許訪問本地的硬盤,並不能將數據存入到服務器上,不允許對網絡文檔進行修改和刪除,只能通過瀏覽器實現信息瀏覽或動態交互。從而有效地防止數據的丟失。 

動態性的

JavaScript是動態的,它可以直接對用戶或客戶輸入做出響應,無須經過Web服務程序。它對用戶的反映響應,是采用以事件驅動的方式進行的。所謂事件驅動,就是指在主頁(Home Page)中執行了某種操作所產生的動作,就稱為“事件”(Event)。比如按下鼠標、移動窗口、選擇菜單等都可以視為事件。當事件發生后,可能會引起相應的事件響應。 

跨平台性

    JavaScript是依賴於瀏覽器本身,與操作環境無關,只要能運行瀏覽器的計算機,並支持JavaScript的瀏覽器就可正確執行。從而實現了“編寫一次,走遍天下”的夢想。 

   實際上JavaScript最傑出之處在於可以用很小的程序做大量的事。無須有高性能的電腦,軟件僅需一個字處理軟件及一瀏覽器,無須WEB服務器通道,通過自己的電腦即可完成所有的事情。

    綜合所述JavaScript 是一種新的描述語言,它可以被箝入到 HTML 的文件之中。 JavaScript語言可以做到回應使用者的需求事件 (如: form 的輸入,而不用任何的網路來回傳輸資料,所以當一位使用者輸入一項資料時,它不用經過傳給伺服端 (server)處理,再傳回來的過程,而直接可以被客戶端 (client) 的應用程式所處理。

JavaScript 和 Java 很類似,但到底並不一樣! Java 是一種比 JavaScript 更復雜許多的程式語言,而 JavaScript 則是相當容易了解的語言。JavaScript 創作者可以不那麽注重程式技巧,所以許多 Java 的特性在 Java Script 中並不支援。

110、gridview控件基本總結(一招在手,走遍天下renfuming-to-all schoolmates)

/*author:renfuming

  date:2007/5/12

  send to:yyaccp's schoolmates who are studying asp.net

*/

public partial class _Default : System.Web.UI.Page 

{

    private SqlConnection conn;

    private SqlCommand comm;

    private string connstring = ConfigurationManager.ConnectionStrings[1].ConnectionString;

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            bind();

        }

    }

    //數據邦定

    private void bind()

    {

 

        string sqlstr = "select * from teacher";

        this.conn = new SqlConnection(connstring);

        SqlDataAdapter adapter = new SqlDataAdapter(sqlstr, conn);

        DataSet ds = new DataSet();

        adapter.Fill(ds,"teacher");

        this.GridView1.DataSource = ds;

        GridView1.DataKeyNames = new string[] { "teaid" };//主建 

        this.GridView1.DataBind();

        conn.Close();

 

    }

    //編輯數據信息

    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)

    {

        this.GridView1.EditIndex = e.NewEditIndex;

        bind();

    }

    //更新數據信息

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

    {

        try

        {

            this.conn = new SqlConnection(connstring);

            string col1 = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim();//cell索引從1開始,這是從第二列開

始修改數據信息,主建不能修改

            int col2 = int.Parse(((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim());

            int id = int.Parse(this.GridView1.DataKeys[e.RowIndex].Value.ToString());

            string sqlstr = "update teacher set teaname='" + col1 + "',teaage=" + col2 + " where teaid=" + id + "";

            this.comm = new SqlCommand(sqlstr, conn);

            conn.Open();

            comm.ExecuteNonQuery();

            conn.Close();

            this.GridView1.EditIndex = -1;

            bind();

        }

        catch (Exception ex)

        {

 

            Response.Write(ex.Message);

        }

    }

    //刪除信息

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

    {

        string sql = "delete from teacher where teaid='"+this.GridView1.DataKeys[e.RowIndex].Value.ToString()+"'";

        this.conn = new SqlConnection(connstring);

        this.comm = new SqlCommand(sql,conn);

        this.conn.Open();

        response.write("<script language='javascript'>return confirm('您真的要刪除此紀錄嗎?');</script>");

        this.comm.ExecuteNonQuery();

        this.conn.Close();

        bind();s

    }

    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)

    {

        this.GridView1.EditIndex = -1;

        bind();

    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

    {

        //如果是綁定數據行 

        if (e.Row.RowType == DataControlRowType.DataRow)

        {

            //鼠標經過時,行背景色變 

            e.Row.Attributes.Add("onmouseover", "this.style.backgroundColor='#E6F5FA'");

            //鼠標移出時,行背景色變 

            e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor='#FFFFFF'");

        }

    }

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)

    {

        this.GridView1.PageIndex = e.NewPageIndex;

        

    }

    protected void GridView1_PageIndexChanged(object sender, EventArgs e)

    {

        bind();

    }

    //通過存儲過程插入數據信息

    protected void btnInsert_Click(object sender, EventArgs e)

    {

        SqlParameter[] para = new SqlParameter[] { 

        new SqlParameter("@name",TypeCode.String),new SqlParameter("@age",TypeCode.Int32)};

        this.conn = new SqlConnection(connstring);

        conn.Open();

        this.comm = new SqlCommand("Myproc",conn);

        this.comm.CommandType = CommandType.StoredProcedure;

        para[0].Value = this.txtname.Text;

        para[1].Value = int.Parse(this.txtage.Text.Trim());

        this.comm.Parameters.AddRange(para);

        this.comm.ExecuteNonQuery();

        this.conn.Close();

        bind();

    }

}

111、請舉例說明ref的基本用法

//Author:renfuming

//相當於傳引用

public static void Userref(ref int i)

        {

            i += 100;

            Console.WriteLine("使用ref后的結果是:"+i);

        }

        static void Main()

        {

            int i = 10;

            Console.WriteLine("先前的值是:"+i);

            Userref(ref i);

            Console.WriteLine("使用函數后的值是:"+i);//如果不是用的ref,則此處的打印結果是10

        } 

112、請問在Asp.net中xml文件與xsl文件如何進行整合

//Author:renfuming

System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();

xmldoc.Load(Server.MapPath("user.xml"));

System.Xml.Xsl.XslTransform xmltrans = new System.Xml.Xsl.XslTransform();

xmltrans.Load(Server.MapPath("user.xsl"));

Xml1.Document = xmldoc;

Xml1.Transform = xmltrans;

 

113、請用C#語言調用Oracle的存儲過程

//Author:renfuming

Function GetList(keywords In varchar2

                 ,p_info_list_Cursor out get_data_cur_type)

  Return Number 

As 

  Begin

       open p_info_list_Cursor For 

       Select * from Test where Key=keywords;

       Return 0;

  End;

----------------

       OracleConnection OracleConn = new OracleConnection(連接字符串);

       OracleCommand cmd = new OracleCommand("GetList", OracleConn);

       cmd.Parameters.AddRange(new OracleParameter[]

             {

                new OracleParameter("keyWords", OracleType.VarChar),

                new OracleParameter("ReturnValue", OracleType.Number, 0,                  ParameterDirection.ReturnValue, true, 0, 0, "",DataRowVersion.Default,                   Convert.DBNull),

                new OracleParameter("p_info_list_Cursor", OracleType.Cursor, 2000,                  ParameterDirection.Output, true, 0, 0, "",DataRowVersion.Default, Convert.DBNull)

             });

        cmd.Parameters[0].Value = 't07美女';

        cmd.Parameters[0].Direction = ParameterDirection.Input;

        cmd.CommandType = CommandType.StoredProcedure;

        OracleConn.Open()

        OracleDataReader rdr=cmd.ExecuteReader();

        //其他代碼

        OracleConn.Close();

C#執行Oracle的參數過程,Sql 語句中使用":" 表示參數。

     在Sql Server 中我們可以按以下方式使用SQL 語句: "Insert into Table (Field1,field2) values(@Value1,@Value2) ", 然后我們再New 幾個Paramter: new SqlParameter("@Value1",value)...

  在查詢字符串中使用@+字符 來描述參數,在SqlParameter中的參數名也要使用"@"符號。

 而在OracleSql 語句不能使用@符號, 以冒號":"代替如:

------string Sql = "Insert into SEARCH_HISTORY(KEYWORDS,PHONE,RESULT_ID,SEARCH_TIME) values(:KEYWORDS,:PHONE,:RESULT_ID,:SEARCH_TIME)";

        OracleCommand cmd = new OracleCommand(Sql, OracleConn);

        cmd.Parameters.AddRange(new OracleParameter[]{

            new OracleParameter("KEYWORDS",OracleType.VarChar),

            new OracleParameter("PHONE",OracleType.VarChar),

            new OracleParameter("RESULT_ID",OracleType.Number),

            new OracleParameter("SEARCH_TIME",OracleType.DateTime)

        });

        cmd.Parameters[0].Value = Keywords;

        cmd.Parameters[1].Value = Phone;

        cmd.Parameters[2].Value=2;

        cmd.Parameters[3].Value = DateTime.Now;

114、請簡單介紹依賴注入在asp.net中的基本體現

所謂“依賴注入”,就是將應用程序所依賴的組件在運行的時候動態的加載到應用程序中間。依賴注入的目標並非為、應用程序添加更多的功能,而是提升了組件的重用性,並為應用程序搭建一個具有較強靈活性和擴展性的平台。在Asp.net中,程序的實現是如此實現的:Assembly.Load(AssemblyName).CreateInstance(TypeName(類名等)),如此可以在程序中得到一個要求的對象實例。在程序的實現過程中間,可以配合反射技術,達到更加靈活的變化。

115、任復明整理經典sql語句集:

(qq)、說明:刪除數據庫

drop database dbname

(qq)、說明:備份sql server

--- 創建 備份數據的 device

USE master

EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

--- 開始 備份

BACKUP DATABASE pubs TO testBack 

(qq)、說明:創建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根據已有的表創建新表: 

Acreate table tab_new like tab_old (使用舊表創建新表)

Bcreate table tab_new as select col1,col2… from tab_old definition only

(qq)、說明:刪除新表

drop table tabname 

(qq)、說明:增加一個列

Alter table tabname add column col type

注:列增加后將不能刪除。DB2中列加上后數據類型也不能改變,唯一能改變的是增加varchar類型的長度。

(qq)、說明:添加主鍵: Alter table tabname add primary key(col) 

(qq)、說明:刪除主鍵: Alter table tabname drop primary key(col) 

(qq)、說明:創建索引:create [unique] index idxname on tabname(col.) 

刪除索引:drop index idxname

注:索引是不可更改的,想更改必須刪除重新建。

(qq)、說明:創建視圖:create view viewname as select statement 

刪除視圖:drop view viewname

(qq)、說明:幾個高級查詢運算詞

A: UNION 運算符 

UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。當 

ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是

來自 TABLE2。 

B: EXCEPT 運算符 

EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重復行而派生出一個結果表。當 ALL 

隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。 

C: INTERSECT 運算符

INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALL 隨 

INTERSECT 一起使用時 (INTERSECT ALL),不消除重復行。 

注:使用運算詞的幾個查詢結果行必須是一致的。 

(qq)、說明:使用外連接 

Aleft outer join: 

左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。 

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

Bright outer join: 

右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。 

Cfull outer join: 

全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。

(qq)、說明:復制表(只復制結構,源表名:新表名:b) (Access可用)

法一:select * into b from a where 1<>1

法二:select top 0 * into b from a

說明:拷貝表(拷貝數據,源表名:目標表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

(qq)、說明:跨數據庫之間表的拷貝(具體數據使用絕對路徑) (Access可用)

insert into b(a, b, c) select d,e,f from b in ‘具體數據庫’ where 條件

例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

(qq)、說明:子查詢(表名1表名2b)

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

(qq)、說明:外連接查詢(表名1表名2b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

(qq)、說明:在線視圖查詢(表名1a )

select * from (SELECT a,b,c FROM a) T where t.a > 1;

(qq)、說明:between的用法,between限制查詢數據范圍時包括了邊界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 數值1 and 數值2

(qq)、說明:in 的使用方法

select * from table1 where a [not] in (‘值1,’值2,’值4,’值6)

(qq)、說明:兩張關聯表,刪除主表中已經在副表中沒有的信息 

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

(qq)、說明:四表聯查問題:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d 

where .....

(qq)、說明:日程安排提前五分鍾提醒 

SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5

(qq)、說明:一條sql 語句搞定數據庫分頁

select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 

where b.主鍵字段 = a.主鍵字段 order by a.排序字段

(qq)、說明:前10條記錄

select top 10 * form table1 where 范圍

(qq)、說明:選擇在每一組b值相同的數據中對應的a最大的記錄的所有信息(類似這樣的用法可以用於論壇每月排行

,每月熱銷產品分析,按科目成績排名,等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

(qq)、說明:包括所有在 TableA 中但不在 TableBTableC 中的行並消除所有重復行而派生出一個結果表

(select a from tableA ) except (select a from tableB) except (select a from tableC)

(qq)、說明:隨機取出10條數據

select top 10 * from tablename order by newid()

(qq)、說明:隨機選擇記錄

select newid()

(qq)、說明:刪除重復記錄

Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

(qq)、說明:列出數據庫里所有的表名

(qq)select name from sysobjects where type='U' 

(qq)、說明:列出表里的所有的

select name from syscolumns where id=object_id('TableName')

(qq)22、說明:列示typevenderpcs字段,以type字段排列,case可以方便地實現多重選擇,類似select 

case

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 

end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type

顯示結果:

type vender pcs

電腦 A 1

電腦 A 1

光盤 B 2

光盤 A 2

手機 B 3

手機 C 3

(qq)、說明:初始化表table1

TRUNCATE TABLE table1

(qq)、說明:選擇從1015的記錄

select top 5 * from (select top 15 * from table order by id asc) table_別名 order by id desc

技巧

(qq)1=11=2的使用,在SQL語句組合時用的較多

where 1=1” 是表示選擇全部   “where 1=2”全部不選,

如:

if @strWhere !='' 

begin

set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere 

end

else 

begin

set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 

end 

我們可以直接寫成

set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 

(qq)、收縮數據庫

--重建索引

DBCC REINDEX

DBCC INDEXDEFRAG

--收縮數據和日志

DBCC SHRINKDB

DBCC SHRINKFILE

(qq)、壓縮數據庫

dbcc shrinkdatabase(dbname)

(qq)、轉移數據庫給新用戶以已存在用戶權限

exec sp_change_users_login 'update_one','newname','oldname'

go

(qq)、檢查備份集

RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

(qq)、修復數據庫

ALTER DATABASE [dvbbs] SET SINGLE_USER

GO

DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK

GO

ALTER DATABASE [dvbbs] SET MULTI_USER

GO

(qq)、說明:更改某個表

exec sp_changeobjectowner 'tablename','dbo'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM