ASP.NET常見面試題及答案(130題)
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,dataview,IList]等介面型別的物件
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:執行資料表變化的命令
dataReader和dataset主要是對資料庫的表資訊進行兩種不同方式的讀取,具體的讀取得區別,後面將會有講解
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.詳述.NET裡class和struct的異同!
class:放在屬於引用型別,故其存放於記憶體的堆中
Struct屬於值型別,其存放於棧中,作為引數傳遞的時候屬於值傳遞
類與結構有很多相似之處:結構可以實現介面,並且可以具有與類相同的成員型別。然而,結構在幾個重要方面不同於類:結構為值型別而不
是引用型別,並且結構不支援繼承。結構的值儲存在“在堆疊上”或“內聯”。細心的程式設計師有時可以通過聰明地使用結構來增強效能。
12.概述.NET裡對 remoting 和 webservice 兩項技術的理解和實際中的應用。
其實現的原理並沒有本質的區別,在應用開發層面上有以下區別:
1、Remoting可以靈活的定義其所基於的協議,如果定義為HTTP,則與Web Service就沒有什麼區別了,一般都喜歡定義為TCP,這樣
比Web Service稍為高效一些
2、Remoting不是標準,而Web Service是標準;
3、Remoting一般需要通過一個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的執行機理
首先客戶端從伺服器的到WebService的WSDL,同時在客戶端聲稱一個代理類(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# 支援兩種型別:“值型別”和“引用型別”。
值型別(如 char、int 和 float)、列舉型別和結構型別。
引用型別包括類 (Class) 型別、介面型別、委託型別和陣列型別。
值型別與引用型別的區別在於值型別的變數直接包含其資料,而引用型別的變數則儲存物件引用。對於引用型別,兩個變數可能引用同一個對
象,因此對一個變數的操作可能影響另一個變數所引用的物件。對於值型別,每個變數都有自己的資料副本,對一個變數的操作不可能影響另一個變數
17.瞭解程式集強簽名嗎?
用強名稱來給程式集簽名即謂之程式集強簽名!
通過簽發具有強簽名的程式集合,可以確保名稱的全域性唯一性!因為強名稱是依賴於唯一的金鑰對來確保名稱的唯一性,其他人不會生成與你
相同的程式集名稱(不同的私鑰產生的名稱不同)
強名稱保護程式集的版本沿襲,因為強名稱的唯一效能夠確保沒有其他人能夠生成你的程式集的後續版本
強名稱提供可靠的完整性檢查,通過.NET Framework安全檢查後,可以確保程式集內容在生成後未被更改過!
要注意的是,具有強名稱的程式集引用其他程式集,如果這個程式集沒有強名稱,那麼具有強名稱的程式集所帶來的好處,並依舊會產生DLL衝
突!因此具有強名稱的程式集只能引用其他具有強名稱的程式集。
18. C#中介面和類有什麼區別?
介面是負責功能的定義,專案中通過介面來規範類,操作類以及抽象類的概念!
而類是負責功能的具體實現!
在類中也有抽象類的定義,抽象類與介面的區別在於:
抽象類是一個不完全的類,類裡面有抽象的方法,屬性,也可以有具體的方法和屬性,需要進一步的專業化。
但介面是一個行為的規範,裡面的所有東西都是抽象的!
一個類只可以繼承一個基類也就是父類,但可以實現多個介面
19.View State 的作用和實現方式?
設定是否要儲存控制元件的狀態,其功能的實質是利用隱藏表單域實現
如果設為false且在Page_Load中沒有重新繫結資料的話,只要頁面一重新整理,控制元件的內容就沒了 如果設為true,則頁面會儲存控制元件的內容
在一些不需要儲存狀態的頁面中最好把它設為false,為什設為true會增加伺服器的負擔 隱藏域
20.在ASP.net中可以利用哪些物件儲存狀態?幾種維持狀態的物件應用場合以及優缺點?
主要用Application,session,viewstate,cookie,cache。
Application:應用程式級別的共享變數,優點是應用程式一開啟該站點都能訪問此變數。缺點:所有對此進行寫入操作要加鎖,由此共享變
量鎖帶來的記憶體開銷只有此應用程式關閉才能結束。
Session:維護使用者個人的狀態資訊,優點:個人所從事活動,如登入資訊,購物車資訊等較安全而且又伺服器維護較穩定。缺點:維持http
連線的sessionID仍然有缺陷,同時為每個使用者維護狀態資訊,伺服器記憶體開銷很大。
Viewsate:如4所說,在一些場合能體現它的特點,但同時帶來的缺點:影響整個頁面的速度以及隱藏欄位未加密。
Cookie:優點是將狀態資訊維護在客戶端的一個文字檔案,不需要耗用伺服器的記憶體,是目前各大網站主要採用的方式。 缺點:由於其將狀態
資訊存貯在客戶端,很可能由別人破解此檔案而獲得此人的個人隱私和機密資訊。其受限大小為4K.
Cache:優點是提供的此功能很強大,如檔案快取依賴、API依賴、資料庫依賴以用於存貯資料變化而更換快取狀態資料。提供儲存週期
從httpcontext到httpruntime。缺點:耗用伺服器記憶體。
Request
21.簡單說說 ASP.NET 中基於表單的身份驗證方式的用法?
配置檔案提供對站點那些目錄的保護以及登入頁面,當訪問該目錄的檔案時,如果使用者未認證通過,將轉入登入頁面, 使用者輸入使用者名稱和密碼
,將此引數傳入認證模組authentication,該模組負責認證,如果通過將isauthentication設定為true,並返回使用者的identity物件,此
時頁面將轉入初始請求頁,如果未通過,將不允許訪問此目錄。
22.是否瞭解 URL Rewrite?請簡要說明其原理和在 ASP.NET 中的實現方式?
一般放在httpmodule中applicatioin_request事情中,當每次http請求,將此URL定位到重寫的url函式中並返回重寫後的URL地址。主要用
於當我們站點板塊移動時由於連結仍然指向舊地址,故可以重定向到新的地址,當然查詢引數也可以重寫。url-mapping配置
23. 在超過10萬條記錄的頁面顯示時,你如何處理分頁,有多少種替代方案?
一般根據頁面選擇的第幾頁PageIndex,以及服務端配置檔案配置的每頁行數PageSize,通過傳入引數傳入存貯過程,由其返回相應行
數pagesize的記錄。即每一頁資料都由服務端返回。
可以利用快取Cache,將資料一次載入,在結合asp.net2.0中資料庫快取方式,跟蹤資料庫表的資訊的變化,自動更新快取資訊
對於資料分野頁,也可以利用gridview的資料邦定控制元件的自動分頁的方式
24. DataReader和DataSet的異同?
Daatareader和datatset都是通過從資料來源取資料。不同點:datareader提供只進行流的方式讀取資料。Dataset提供一種容器裡面主要由表
以及表關係,由介面卡來提供從資料來源取得資料填充到此容器的表中。
DataReader和DataSet最大的區別在於,DataReader使用時始終佔用SqlConnection,線上操作資料庫..任何對SqlConnection的操作都會引
發DataReader的異常..因為DataReader每次只在記憶體中載入一條資料,所以佔用的記憶體是很小的..因為DataReader的特殊性和高效能.所以DataReader是隻進的..你讀了第一條後就不能再去讀取第一條了..
DataSet則是將資料一次性載入在記憶體中.拋棄資料庫連線..讀取完畢即放棄資料庫連線..因為DataSet將資料全部載入在記憶體中.所以比較消
耗記憶體...但是確比DataReader要靈活..可以動態的新增行,列,資料.對資料庫進行回傳更新操作
25. 你會利用那些工具進行資料庫的效能分析及其優化?說說你覺得優化資料庫需要注意的方面。比如:如何設計優化查詢為主、插入更新為
主的表。
我主要通過執行計劃以及索引優化以及客戶統計和伺服器跟蹤工具來檢測從SQL到索引、硬碟IO和時間等資訊。 對於查詢為主的表,首先對數
據量的大小有一定的估計,當達到一定程度應採用水平分割槽,有的根據主鍵有的根據時間段來區分。由於此表往往插入更新不是太快,可對適
當欄位採用索引並且填充因子可以儘量大。SQL優化等。 對於插入更新為主的表,我覺得健壯性更重要,只要根據標準外部採用存貯過程就可
以了。
26. 資料庫某表主鍵自增,是很常見的情形。在ASP. Net或C#程式中,要求向該表插入一條記錄,並馬上從該表查出這條記錄。不能使用時間戳,請問你如何實現?
插入一條記錄會返回◎◎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並定義一些方法如:load、addnode、deletenode、updatenode、selectednode等方法一些屬性如對圖示、節點位置、節
點前複選框等屬性,也會提供一些預設事件如修改節點前後重新整理等。
30.談談論壇聊天室IM和各種網站程式的互動與重新整理思路的差異與共同點。
IM互動式資訊通訊 ajax重新整理思路,對於集中重新整理方式,應該有部分和全部重新整理的區別
這個希望大家上網去找詳細的資料
31.談談對WSE的認識。
目前Web Service廣泛採用Https來保障安全,但是該方法也有很多的缺點,尤其是應用於現在越來越複雜的Web Service安全需求。
1.Https提供的是點對點安全保護,而Web Service的特點就是訊息往往就要經過多箇中介才能到達最終的服務提供方,每個中介還有可能對訊息做出些處理,也就是說它需要的是端到端的保護。這顯然是Https所不能提供的。
2.Https是在傳輸層提供的安全,而不是在訊息層面,也就是隻有在傳輸的過程中才有訊息才是安全的(加密的),而一旦到達了終點就是明文的了。比如可以從訊息佇列中將重要的資訊竊取出來。
3.在Https的建立完共享金鑰後,傳遞訊息的時候並沒有使用數字簽名技術,所以也就無法得到抗否認性的能力。而這又是在電子商務中不可豁缺的。
4.由於Https提供的是傳輸層的安全,當然也就不可能達到訊息安全所需要的靈活性的要求。比如加密訊息中的部分元素;用不同的金鑰加密訊息的不同部分,從而讓不同的訊息接受者檢視與之對應的資訊。
因此,為了適應Web Service對安全的特殊要求,IBM和MS等公司共同制定了WS-Security規範。重新回顧安全問題的三個概念:Confidentiality(機密性), Integrity(完整性), Authentication(身份鑑別),在Web Service使用SOAP(XML 格式)作為訊息傳輸協議的背景下,分別產生了XML Digital Signature,XML Encryption和SAML(XML格式的Security Token), 而WS-Security則是如何將他們組合起來以滿足Web Service安全需求的一套規範
Web Services Enhancements 2.0 for Microsoft .NET (WSE)是一個用來建設Web服務的.NET類庫,它支援最新的Web服務協議,包
括WS-Security、WS-SecureConversation、WS-Trust、WS-Policy、WS-SecurityPolicy、WS-Addressing和 WS-Attachments。
WSE可使開發人員跨安全平臺建設可升級的、安全的Web服務。它支援用傳輸的方式傳送SOAP訊息,而不是HTTP。另一個特點是具有建立SOAP路
由器的功能,SOAP訊息被髮送給SOAP路由器,路由器再將工作交付給託管該服務的Web伺服器。
32. 你用過哪些版本控制工具
--------------各位同學兄弟可以根據自己的實際情況,談論一些自己在使用這些工具時所遇到的問題以及體會
TFS(ASP.Net)、cvs、svn
33. 在開發中你利用那些工具進行單元測試和模組測試
NUNIT和PDM.頁面測試 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的情況)
主要根據實際情況來決定搭建的層數以及各層的規格。 一般情況下,可如下搭:
資料層:主要提供資料服務,該層繼承實體的介面並定製自己的資料提取和儲存。並根據資料庫型別如sqlserver、oracle等來建立此層服務。執行邏輯我個人偏好採用存貯過程。
業務層:由於定製的實體的屬性和操作實體的方法已由資料層獲得和執行,故業務邏輯元件對此實體進行組合以滿足上層對業務邏輯元件的呼叫,webservice也是建在此層,以用於提供資料服務和邏輯執行。
表示層:一般定製不同的容器控制元件,以用於載入從業務層不同型別的資料便於呈現。當然也要此層的風格以及各種顯示設定,webservice顯示頁面建在層,通過載入對指定目錄的webservice提供的方法用於呈現。
38.可否簡要的介紹asp.net 2.0 Membership,WebPart和C#的匿名函式和泛型等你認為.net 2.0自己感興趣的內容,希望可以簡要地闡述其中的特點(本題非常的重要)
1 Membership:成員管理主要提供了一套對使用者資訊、使用者角色、使用者配置資訊的使用者系統。通過MembershipConfigHandler載入配置檔案
中公有的基礎資訊,對配置檔案中的資訊進行了嚴格的邊界檢查和型別檢查。通過MembershipProvider提供了實現membership的抽象方法以
及配置資訊。由SqlMembershipProvider繼承MembershipProvider來實現sqlclient的資料提供服務。業務和實現相剝離,以利於擴充套件。當
然裡面有很多特點也有很多細節等。
2 WebPart:主要提供頁面佈局和自定義以及換面板的功能。通過定義主題Theme來決定整體的佈局風格,以及版面通過設定不同的區域Zone來
決定版面各塊的區域設定。通過不同的skin和css來確定風格。讓使用者能夠儲存自己的個人設定以及回覆預設設定的功能。
3 匿名函式:使用匿名方法可以減少因例項化委託所需要的開銷,1.0中使用委託必須例項化委託並且必須將所呼叫的類和方法作為引數傳入也
即命名方法,當然如果所呼叫的委託具有多變性應該還採用命名方法。
4 泛型:一般用於集合類。由於以前集合類資料都由framework隱式轉化為object型別,這種開銷很大。而用泛型,你就可以指定傳入物件類
型,而用於生成強型別的資料集,這樣各種操作就可以使用指定型別的特性和優勢了,自然速度也快了很多。當然介面、方法、類等都同樣使用這種方式
5 編譯模型除了asp.net1.0支援的批編譯,也提供新的編譯模式。
6 在httpmodule和httphander的處理速度要比以前1.0要快。
7 在請求響應輸出中,將緩衝區由asp.net宿主程序移到本機記憶體,可以消除資源瓶頸。
8 其快取模型提供了資料庫依賴和快取後替功能。
9 與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執行環境技術標準化這也許可行
,但是實際上當然不是這樣。成千上百萬臺電腦執行的是Linux、Unix, OS X 和其他作業系統,而這種環境不是.NET應用程式的標準化執行
環境。因此軟體開發組織需要考慮: 如何有效利用它們的 Microsoft開發人員和Visual Studio.NET的技術特徵和優勢但是仍然可以訪問非
微軟伺服器, PC機,手提電腦和移動裝置?怎樣才能使他們用.NET編寫的程式執行時不受執行環境的侷限?
Stryon公司開發的iNET解決了這一難題。iNET可以使應用程式和Web服務在Visual Basic 和C#下開發,但釋出於任何支援Java的執行環境,
網路主機也從IBM網路伺服器擴充套件到Linux和Unix的伺服器。有了iNET技術,開發人員既可以利用Visual Studio .net開發環境的優勢,但是又不侷限於Microsoft的執行環境。
41.寫出global.asax檔案的主要用途?
作用和asp的global.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.net和asp的最大區別在於程式設計思維的轉換,而不僅僅在於功能的增強。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),它可以看作是vc和java的混合體吧,儘管ms自己講c#核心中更多的象vc,但
實際上我還是認為它和java更象一些吧。首先它是面向物件的程式語言,而不是一種指令碼,所以它具有面向物件程式語言的一切特性,比如封裝性、繼承性、多型性等等,這就解決了剛才談到的asp的那些弱點。封裝性使得程式碼邏輯清晰,易於管理,並且應用到asp.net上就可以使業務邏輯和html頁面分離,這樣無論頁面原型如何改變,業務邏輯程式碼都不必做任何改動;繼承性和多型性使得程式碼的可重用性大大提高,你可以通過