一、ADO 與ADO.Net兩種數據訪問方式區別?
1. ADO與ADO.Net簡介
ADO與ADO.NET既有相似也有區別,他們都能夠編寫對數據庫服務器中的數據進行訪問和操作的應用程序,並且易於使用、高速度、低內存支出和占用磁盤 空間較少,支持用於建立基於客戶端/服務器和 Web 的應用程序的主要功能。但是ADO使用OLE DB接口並基於微軟的COM技術,而ADO.NET擁有自己的ADO.NET接口並且基於微軟的.NET體系架構。眾所周知.NET體系不同於COM體 系,ADO.NET接口也就完全不同於ADO和OLE DB接口,這也就是說ADO.Net和ADO是兩種數據訪問方式。
2. 數據訪問方式的歷史
下面簡單的回顧一下微軟的數據訪問方式所走過的幾個階段。
ODBC – (Open Database Connectivity)是第一個使用SQL訪問不同關系數據庫的數據訪問技術。使用ODBC應用程序能夠通過單一的命令操縱不同的數據庫,而開發人員需要做的僅僅只是針對不同的應用加入相應的ODBC驅動。
DAO - (Data Access Objects)不像ODBC那樣是面向C/C++程序員的,它是微軟提供給Visual Basic開發人員的一種簡單的數據訪問方法,用於操縱Access數據庫。
RDO – 在使用DAO訪問不同的關系型數據庫的時候,Jet引擎不得不在DAO和ODBC之間進行命令的轉化,導致了性能的下降,而RDO(Remote Data Objects)的出現就順理成章了。
OLE DB – 隨著越來越多的數據以非關系型格式存儲,需要一種新的架構來提供這種應用和數據源之間的無縫連接,基於COM(Component Object Model)的OLE DB應運而生了。
ADO – 基於OLE DB之上的ADO更簡單、更高級、更適合Visual Basic程序員,同時消除了OLE DB的多種弊端,取而代之是微軟技術發展的趨勢。
3. ADO與ADO.Net對照
在開始設計.Net體系架構時,微軟就決定重新設計數據訪問模型,以便能夠完全的基於XML和離線計算模型。兩者的區別主要有:
ADO以Recordset存儲,而ADO.NET則以DataSet表示。Recordset看起來更像單表,如果讓Recordset以多表的方式 表示就必須在SQL中進行多表連接。反之,DataSet可以是多個表的集合。ADO 的運作是一種在線方式,這意味著不論是浏覽或更新數據都必須是實時的。ADO.NET則使用離線方式,在訪問數據的時候ADO.NET會利用XML制作數 據的一份幅本,ADO.Net的數據庫連接也只有在這段時間需要在線。
由於ADO使用COM技術,這就要求所使用的數據類型必須符合COM規范,而ADO.Net基於XML格式,數據類型更為豐富並且不需要再做COM編排導致的數據類型轉換,從而提高了整體性能。
4. 小結
ADO.NET為.Net構架提供了優化的數據訪問模型,和基於COM的ADO是完全兩樣的數據訪問方式。
二、DataSet與DataReader的區別
ADO.Net 提供以下兩個對象,用於檢索關系數據並將其存儲在內存中:DataSet和DataReader。DataSet提供一個內存中數據的關系表示形式,一整 套包括一些表在內的數據(這些表包含數據、對數據進行排序並約束數據),以及表之間的關系。DataReader提供一個來自數據庫的快速、僅向前、只讀 數據流。
當使用DataSet時,經常會利用DataAdapter(也可能是CommandBuilder)與數據源進行交互。當使用 DataSet時,也可以利用DataVIEw對DataSet中的數據應用排序和篩選。也可以從DataSet繼承,創建強類型DataSet,用於將 表、行和列作為強類型對象屬性公開。
下列主題包括的信息涉及:使用DataSet或DataReader的最佳時機、如何優化訪問它們所包含數據、以及如何優化使用DataAdapter(包括CommandBuilder)和DataVIEw的技巧。
DataSet與DataReader
當設計應用程序時,要考慮應用程序所需功能的等級,以確定使用DataSet或者是DataReader。
要通過應用程序執行以下操作,就要使用DataSet:
r 在結果的多個離散表之間進行導航。
r 操作來自多個數據源(例如,來自多個數據庫、一個XML文件和一個電子表格的混合數據)的數據。
r 在各層之間交換數據或使用XML Web服務。與DataReader不同的是,DataSet能傳遞給遠程客戶端
r 重用同樣的記錄集合,以便通過緩存獲得性能改善(例如排序、搜索或篩選數據)。
r 每條記錄都需要執行大量處理。對使用DataReader返回的每一行進行擴展處理會延長服務於DataReader的連接的必要時間,這影響了性能。
r 使用XML操作對數據進行操作,例如可擴展樣式表語言轉換(XSLT轉換)或XPath查詢。
對於下列情況,要在應用程序中使用DataReader:
r 不需要緩存數據。
r 要處理的結果集太大,內存中放不下。
r 一旦需要以僅向前、只讀方式快速訪問數據。
注 填充DataSet時,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表現為節省了 DataSet占用內存和填充DataSet需要的循環。一般來說,此性能提升只是象征性的,因此,設計決策應以所需功能為基礎。
三、基本概念
1、面向對象的語言具有封裝性、繼承性、多態性。
2、ADO.Net中的五個主要對象Connection、Command、DataSet、DataReader、DataAdapter
3、ASP.Net中的身份驗證有Windows、Forms、Passport,一般采用Forms,比較簡單、適用面廣
4、接口-- --接口定義了一組方法(Method,子程序或函數例程[譯注:指Visual Basic .Net中的Sub和Function])、屬性(Property)、事件(Event)和域(FIEld,變量或特性),這些都被聲明為公有。接口也 可以被另一個接口繼承。任何繼承了一個接口的類或結構都必須實現接口繼承鏈中所有接口所定義的成員。
5、繼承------繼承是指一個類——稱為子類[譯注:亦稱派生類],可以基於另一個類——稱為基類[譯注:亦稱父類、超類]。繼承提供了一種建立對象層次的機制。繼承使得你能夠在你自己的類中使用另外一個類的接口和代碼。
base->訪問基類的成員。
this->引用調用一個方法的當前對象。
6、抽象類-------抽象類是一種特殊的基類。除了通常的類成員,它們還帶有抽象類成員。抽象類成員是指沒有實現而只有聲明的方法和屬性。所有直接從抽象類派生的類都必須實現所有這些抽象方法和屬性。
抽 象方法不能實例化。這樣做[譯注:指實例化一個抽象類]是不合邏輯的,因為那些抽象成員沒有實現。那麼,不能實例化一個類有什麼好處呢?很多!抽象類穩坐 類繼承樹的頂端。它們確定了類的結構和代碼的意圖。用它們可以得到更易搭建的框架。這是可能的,因為抽象類具有這個框架中所有基類的一般信息和行為。
7、接口和抽象類之間的區別--------接口和抽象類關系很緊密,它們都具有對成員的抽象。
對於一個抽象類,至少一個方法是抽象方法既可,這意味著它也可以具有具體方法[譯注:Concrete Method,這只是相對於抽象方法而言,面向對象中並沒有這個概念]。
對於一個接口,所有的方法必須都是抽象的。
實現了一個接口的類必須為接口中的所有方法提供具體的實現,否則只能聲明為抽象類。
在C#中,多重繼承(Multiple Inheritance)只能通過實現多個接口得到。抽象類只能單繼承[譯注:C#中的單繼承是指所有類作為基類的時候都只能是派生類聲明中唯一的基類,而不僅僅是抽象類]。
接口定義的是一個契約,其中只能包含四種實體,即方法、屬性、事件和索引器。因此接口不能包含常數(Constant)、域、操作符、構造器、析構器、靜態構造器或類型[譯注:指嵌套的類型]。
同時,一個接口還不能包含任何類型的靜態成員。修飾符abstract、public、protected、internal、private、virtual、override都是不允許出現的,因為它們在這種環境中是沒有意義的。
類中實現的接口成員必須具有公有的可訪問性。
· C#中的接口是獨立於類來定義的。這與 C++模型是對立的,在 C++中接口實際上就是抽象基類。
· 接口和類都可以繼承多個接口。
· 而類可以繼承一個基類,接口根本不能繼承類。這種模型避免了 C++的多繼承問題,C++中不同基類中的實現可能出現沖突。因此也不再需要諸如虛擬繼承和顯式作用域這類復雜機制。C#的簡化接口模型有助於加快應用程序的開發。
· 一個接口定義一個只有抽象成員的引用類型。C#中一個接口實際所做的,僅僅只存在著方法標志,但根本就沒有執行代碼。這就暗示了不能實例化一個接口,只能實例化一個派生自該接口的對象。
· 接口可以定義方法、屬性和索引。所以,對比一個類,接口的特殊性是:當定義一個類時,可以派生自多重接口,而你只能可以從僅有的一個類派生。
8、多態性-- ------多態性反映了能夠在多於一個類的對象中完成同一事物的能力——用同一種方法在不同的類中處理不同的對象。例如,如果Customer和 Vendor對象都有一個Name屬性,則我們可以寫一個事物來調用Name屬性而不管我們所使用的是Customer對象還是Vendor對象,這就是 多態性。
交通工具是多態性的一個很好的例子。一個交通工具接口可以只包括所有交通工具都具有的屬性和方法,還可能包括顏色、車門數、變速器和點火 器等。這些屬性可以用於所有類型的交通工具,包括轎車、卡車和掛車。 多態性不在交通工具的屬性和方法背後實現代碼。相反,多態性只是實現接口。如果轎車、卡車和掛車都實現了同樣的交通工具接口,則所有這三個類的客戶代碼是 完全一樣的。
C#通過繼承來為我們提供多態性。C#提供了virtual關鍵字用於定義一個支持多態的方法。
9、結構----------結構是和類相似的一種封裝構造,因為它可以包含數據、類型和函數成員。但和類不同的
是,結構是值類型,因此存放在內存中稱為棧的地方。結構通常用來存入簡單數據類型--
在內存中有固定大小的實體----的集合,事實上,內建的基本值類型Int32、Int64、Double
等在.Net Framework中實現為結構。
10、委托-- -------委托是提供對具有特定返回類型和參數列表的方法的一般引用的引用類型。它的本質上和C或C++中的函數指針相似。但和C++函數指針不同的 是,委托是完全面向對象的---它們既封裝方法又封裝對象實例。委托是用戶定義的類型,所以當定義委托時,實際上是定義一個特定類型的委托,而不是一個具 體的實例
11、.Net中的內存回收機制
垃圾回收器是用來管理應用程序的內存分配和釋放的。在垃圾回收器出現以 前,程序員在使用內存時需要向系統申請內存空間。有些語言,例如Visual Basic,可以自動完成向系統申請內存空間的工作。但是在諸如Visual C++的語言中要求程序員在程序代碼中申請內存空間。如果程序員在使用了內存之後忘了釋放內存,則會引起內存洩漏。但是有了垃圾回收器,程序員就不必關心 內存中對象在離開生存期後是否被釋放的問題。當一個應用程序在運行的時候,垃圾回收器設置了一個托管堆。托管堆和C語言中的堆向類似,但是程序員不需要從 托管堆中釋放對象,並且在托管堆中對象的存放是連續的。
每次當開發人員使用 new 運算符創建對象時,運行庫都從托管堆為該對象分配內存。新創建的對象被放在上次創建的對象之後。垃圾回收器保存了一個指針,該指針總是指向托管堆中最後一 個對象之後的內存空間。當新的對象被產生時,運行庫就知道應該將新的對象放在內存的什麼地方。同時開發人員應該將相同類型的對象放在一起。例如當開發人員 希望向數據庫寫入數據的時侯,首先需要創建一個連接對象,然後是Command對象,最後是DataSet對象。如果這些對象放在托管堆相鄰的區域內,存 取它們就非常快。
12、.反射和序列化
反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然後,可以調用類型的方法或訪問其字段和屬性
序列化:序列化是將對象轉換為容易傳輸的格式的過程。例如,可以序列化一個對象,然後使用 HTTP 通過 Internet 在客戶端和服務器之間傳輸該對象。在另一端,反序列化將從該流重新構造對象。
13、.關於值類型和引用類型
數據在內存中的存儲位置,取決於它的數據類型,在C#中,分為值類型和引用類型,值類型的數據存儲在內存中的堆棧中,每個變量或程序都有自己的堆棧,不可以共用一個堆棧地址。當數據一個值類型的變量傳遞到另一個相同類型的變量時,會在堆棧中分配兩個不同的地址。
而引用類型的數據存儲在內存中的堆中,可以不同的變量或程序共同使用同一個位置的數據。當數據從一個引用類型的變量傳遞到另一個相同類型的變量時,只是把這個變量的引用地址傳遞給新的變量,同時引用當前堆中存儲的數據。
四、Public、Protected、Internal、Protected internal、Private的訪問權限
1、Public ------公共成員,成員對於任何人都是可見的。我們可以在類內部的和類的子孫的代碼中通過使用類的實例來訪問一個公有的成員。
2、Protected------保護成員,成員和私有成員類似,只能由包含它的類訪問。然而,受保護成員可以由一個類的子類所使用。如果類中的一個成員可能被該類的子類訪問,它應該聲明未受保護的
3、 Internal/FrIEnd--------成員對整個應用程序是公有的,但對於其他的外部應用程序是私有的。
當我們希望其他應用程序能夠使用當前應 用程序中的包含的一個類,但又希望這個類為當前應用程序保留一定的功能時,就要用到內部/友元成員。在C#中我們使用internal,而在Visual Basic .Net中我們使用FrIEnd。
4、Protected internal -------包括了Protected和Internal修飾符,成員只能由包含了基類的應用程序中的從該基類派生的子類所訪問。當你希望一個類中的成 員只能由其子類訪問,並且拒絕其他應用程序訪問該類的這個成員的時候,你就要將其聲明未受保護內部成員。
5、Private -------私有成員,成員是隱藏的,只有對類本身是可用的。所有使用了一個類的實例的代碼都不能直接訪問一個私有成員,這個類的子類也不允許。
五、ASP.Net兩個頁面之間傳遞值的幾種方式ASP.NET 提供了卓越的事件驅動編程模型,讓開發者簡化了應用程序的總體設計,但是這個也造成了它固有的一些問題,例如,使用傳統的ASP裡,我們可以通過使用 POST方法很容易地實現頁面間傳遞值,同樣的事情,在使用事件驅動編程模型的ASP.Net就不是那麼容易了,當然了,我們仍然有一些方法可以實現同樣 的功能。本文將試著使用不同的可能的方法來解決這個問題,但可以預見是,本文將包含使用querystring,session變量以及 server.Transfer方法來實現頁面間的值傳遞。
使用QueryString
使用QuerySting在頁面間傳遞值 已經是一種很老的機制了,這種方法的主要優點是實現起來非常簡單,然而它的缺點是傳遞的值是會顯示在浏覽器的地址欄上的(不安全),同時又不能傳遞對象, 但是在傳遞的值少而安全性要求不高的情況下,這個方法還是一個不錯的方案。使用這種方法的步驟如下:
1,使用控件創建web表單(form)
2,創建可以返回表單的按鈕和鏈接按鈕
3,在按鈕或鏈接按鈕的單擊事件裡創建一個保存URL的字符變量
4,在保存的URL裡添加QueryString參數
5,使用Response.Redirect重定向到上面保存的URL
下面的代碼片斷演示了如何實現這個方法:
源頁面代碼:
private void Button1_Click
(object sender, System.EventArgs e)
{
string url;
url="anotherwebform.ASPx?name=" + TextBox1.Text + "&email=" + TextBox2.Text;
Response.Redirect(url);
}
目標頁面代碼:
private void Page_Load
(object sender, System.EventArgs e)
{
Label1.Text=Request.QueryString["name"];
Label2.Text=Request.QueryString["email"];
}
使用Session變量
使 用Session變量是可以在頁面間傳遞值的的另一種方式,在本例中我們把控件中的值存在Session變量中,然後在另一個頁面中使用它,以不同頁面間 實現值傳遞的目的。但是,需要注意的是在Session變量存儲過多的數據會消耗比較多的服務器資源,在使用session時應該慎重,當然了,我們也應 該使用一些清理動作來去除一些不需要的session來降低資源的無謂消耗。使用Session變量傳遞值的一般步驟如下:
1,在頁面裡添加必要的控件
2,創建可以返回表單的按鈕和鏈接按鈕
3,在按鈕或鏈接按鈕的單擊事件裡,把控件的值添加到session變量裡
4,使用Response.Redirect方法重定向到另一個頁面
5,在另一個頁面提取session的值,在確定不需要使用該session時,要顯式清除它
下面的代碼片斷演示了如何實現這個方法:
源頁面代碼:
private void Button1_Click
(object sender, System.EventArgs e)
{
//textbox1 and textbox2 are webform
//controls
Session["name"]=TextBox1.Text;
Session["email"]=TextBox2.Text;
Server.Transfer("anotherwebform.ASPx");
}
目標頁面代碼:
private void Page_Load
(object sender,
System.EventArgs e)
{
Label1.Text=Session["name"].ToString();
Label2.Text=Session["email"].ToString();
Session.Remove("name");
Session.Remove("email");
}
使用Server.Transfer
這 個方法相比上面介紹的方法稍微復雜一點,但在頁面間值傳遞中卻是特別有用的,使用該方法你可以在另一個頁面以對象屬性的方式來存取顯露的值,當然了,使用 這種方法,你需要額外寫一些代碼以創建一些屬性以便可以在另一個頁面訪問它,但是,這個方式帶來的好處也是顯而易見的。總體來說,使用這種方法是簡潔的同 時又是面向對象的。使用這種方法的整個過程如下:
1,在頁面裡添加必要的控件
2,創建返回值的Get屬性過程
3,創建可以返回表單的按鈕和鏈接按鈕
4,在按鈕單擊事件處理程序中調用Server.Transfer方法轉移到指定的頁面
5,在第二個頁面中,我們就可以使用Context.Handler屬性來獲得前一個頁面實例對象的引用,通過它,就可以使用存取前一個頁面的控件的值了
以下代碼綜合實現上述步驟過程的代碼:
源頁面代碼:
把以下的代碼添加到頁面中
public string Name
{
get
{
return TextBox1.Text;
}
}
public string EMail
{
get
{
return TextBox2.Text;
}
}
然後調用Server.Transfer方法
private void Button1_Click
(object sender, System.EventArgs e)
{
Server.Transfer("anotherwebform.ASPx");
}
目標頁面代碼:
private void Page_Load
(object sender, System.EventArgs e)
{
//create instance of source web form
WebForm1 wf1;
//get reference to current handler instance
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
Label2.Text=wf1.EMail;
}
六、ASP.Net的Application、Session、Cookie、VIEwState和Cache等變量的區別是什麼?Application是公共的,所有人都能看到,所以可以用來做聊天室,
session是私有的,每個客戶端都存在一個不同的session 生存期正常是20分鐘,也可以自己設定為1分鐘或2個小時
cookie是保存在本機的文件,記錄短小的信息,除非你讓cookIE過期,否則會一直存在
vIEwstate類似於ASP中的hidden控件,用來記錄頁面中的控件的狀態的,主要在頁面間信息傳遞時用,
cache是緩存,用來記錄已經執行過的一些數據,比如讀取數據庫,目的是加速顯示,減少服務器的負擔,過期時間也是可以自己設定的,
七、C#中接口與類的區別?1、接口類似於類,但接口的成員都沒有執行方式,它只是方法、屬性、事件和索引符的組合而已,並且也只能包含這四種成員;類除了這四種成員之外還可以別的成員(如字段)。
2、不能實例化一個接口,接口只包括成員的簽名;而類可以實例化(abstract類除外)。
3、接口沒有構造函數,類有構造函數。
4、接口不能進行運算符的重載,類可以進行運算符重載。
5、接口的成員沒有任何修飾符,其成員總是公共的,而類的成員則可以有修飾符(如:虛擬或者靜態)。
6、派生於接口的類必須實現接口中所有成員的執行方式,而從類派生則不然。
那 麼為什麼還要有接口呢?主要原因是它是一種有效的契約。類有一些成員,不考慮把這些成員組合在一起,類只是一個擁有各種方法、字段和屬性的列表,但為了能 以某種方式使用類,必須知道類能執行那些功能,具體的操作就是聲明執行一個或多個接口的類,類執行接口的方式是從接口中派生,再提供這個接口中定義的所有 成員的執行方式。
八、進程與線程的區別?線程是一種操作系統對象,代表著一個進程中要被執行的代碼的路徑。每一個WIN32應用程序至少有一個線程--通常稱為住線程或默認線程--但應用程序可以自由地創建其他線程來執行其他任務!
進程是程序的一次動態執行過程,它對應了從代碼加載、執行到執行完畢的一個完整過程,這個過程也是進程本身從產生、發展到消亡的過程
線程是比進程更小的執行單位。一個進程在其執行過程能夠中,可以產生 多個線程,形成多條執行線索。每條線索,即每個線程也有它自身的產生、存在和消亡過程,也是一個動態的概念。
一個程序應該只有一個進程吧,但是可以擁有多個線程。
可以說,一個執文件被運行後,就可以稱為是一個進程了。但是進程只是存在內存中,實際上他是不會做任何事情的。
這個時候,起作用的就是線程了。線程是程序的執行者,一個程序至少有一個線程,但是在多線程的操作系統中,可以有一個以上的線程。
其 實我們可以把線程看成是我們排隊買肯德雞吃(循環的排隊,一直排下去,知道我不想買了,退出)。每人都有機會到達隊伍的最前端去買東西,這個就好比是線 程,都有機會被程序執行。但是線程真正起作用的時候,就是我們在隊伍的最前端買東西到東西買完後,這一段時間,這是線程真正執行的階段。
一.填空題
1.c#中的三元運算符是_____?
2.當整數a賦值給一個object對象時,整數a將會被_____?
3.類成員有_____種可訪問形式?
4.public static const int A=1;這段代碼有錯誤麼?是什麼?
5.float f=-123.567F;
int i=(int)f;
i的值現在是_____?
6.利用Operator聲明且僅聲明了==,有什麼錯誤麼?
7.委托聲明的關鍵字是______?
8.用sealed修飾的類有什麼特點?
9.在ASP.Net中所有的自定義用戶控件都必須繼承自________?
10.在.Net中所有可序列化的類都被標記為_____?
11.在.Net托管代碼中我們不用擔心內存漏洞,這是因為有了______?
12.下面的代碼中有什麼錯誤嗎?_______
using System;
class A
{
public virtual void F(){
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F();
}
13.當類T只聲明了私有實例構造函數時,則在T的程序文本外部,______(可以 or 不可以)從T
派生出新的類,____(可以 or 不可以)直接創建T的任何實例。
14.下面這段代碼有錯誤麼?
switch (i){
case():
CaseZero();
break;
case 1:
CaSEOne();
break;
case 2:
dufault;
CaseTwo();
break;
}
15.在.Net中,類System.Web.UI.Page 可以被繼承麼?
二.簡答題
1.在c#中using和new這兩個關鍵字有什麼意義,請寫出你所知道的意義?
2.在下面的例子裡
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的實例時,產生什麼輸出?
3.下面的例子中
using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
產生的輸出結果是什麼?
4.談談類和結構的區別?
5.一個長度為10000的字符串,通過隨機從a-z中抽取10000個字符組成。
請用c#語言編寫主要程
序來實現。
6.對於這樣的一個枚舉類型:
enum Color:byte{
Red,
Green,
Blue,
Orange
}
試寫一段程序顯示出枚舉類型中定義的所有符號名稱以及它們對應的數值。
7.您了解設計模式麼?請列出您所知道的設計模式的名稱。
8.請在SQL Server中設計表來保存一個樹狀結構的組織結構圖(假設結構圖中只有名稱這一項內容
需要保存),如果我想查詢某一職位下的所有職位,用一個存儲過程來實現,你有什麼思路?
9.什麼叫做SQL注入,如何防止?請舉例說明。
10.下面這段代碼輸出什麼?為什麼?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
1 ?:
2 裝箱
3 3種
4 const成員都是static所以應該去掉static
5 -123
6 要同時修改Equale和GetHash() ? 重載了"==" 就必須重載 "!="
7 delegate
8 不可被繼承
9 System.Web.UI.UserControl
10 [serializable]
11 gC
12 abstract override 是不可以一起修飾
13 不可以,不可以
14 case():不行 default;
15 可以
1 Using 引入一個名子空間,或在使用了一個對像後自動調用其IDespose,New 實例化一個對
像,或修飾一個方法,表此方法完全重寫此方法,
2 X=1,Y=0
3 x=1,y=2
4 最大區別一個是引用類型,一個是值類型 默認成員訪問為public是另外一個區別
.Net & C# 基礎知識試題 (20%)
1. 在.net(C# or vb.Net)中如何獲得當前窗體或控件的句柄,特別是控件本身的句柄(請列舉)。
答案:this(C#) Me(vb.Net).
2. 在.net(C# or vb.Net)中如何用戶自定義消息,並在窗體中處理這些消息。
答案:
在form中重載DefWndProc函數來處理消息:
protected override void DefWndProc ( ref System.WinForms.Message m )
{
switch(m.msg)
{
case WM_Lbutton :
///string與MFC中的CString的Format函數的使用方法有所不同
string message = string.Format("收到消息!參數為:{0},{1}",m.wParam,m.lParam);
MessageBox.Show(message);///顯示一個消息框
break;
case USER:
處理的代碼
default:
base.DefWndProc(ref m);///調用基類函數處理非自定義消息。
break;
}
}
3. 在.net(C# or vb.Net)如何啟動另一個程序。
答案:process
4. 在.net(C# or vb.Net)中如何取消一個窗體的關閉。
答案:
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel=true;
}
5. 在.net(C# or vb.Net)中,Appplication.Exit 還是 Form.Close有什麼不同?
答案:一個是退出整個應用程序,一個是關閉其中一個form
6. 在C#中有一個double型的變量,比如10321.5,比如122235401.21644,作為貨幣的值如何按各個不同國家的習慣來輸出。比如美國 用$10,321.50和$122,235,401.22而在英國則為£10 321.50和£122 235 401.22
答案:
System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo(";en-US");
//System.Globalization.CultureInfo MyCulture = new System.Globalization.CultureInfo("en-GB");為英國貨幣類型
decimal y = 9999999999999999999999999999m;
string str = String.Format(MyCulture,"My amount = {0:c}",y);
7. 某一密碼僅使用K、L、M、N、O共5個字母,密碼中的單詞從左向右排列,密碼單詞必須遵循如下規則:
(1) 密碼單詞的最小長度是兩個字母,可以相同,也可以不同
(2) K不可能是單詞的第一個字母
(3) 如果L出現,則出現次數不止一次
(4) M不能使最後一個也不能是倒數第二個字母
(5) K出現,則N就一定出現
(6) O如果是最後一個字母,則L一定出現
問題一:下列哪一個字母可以放在LO中的O後面,形成一個3個字母的密碼單詞?
A) K B)L C) M D) N
答案:B
問題二:如果能得到的字母是K、L、M,那麼能夠形成的兩個字母長的密碼單詞的總數是多少?
A)1個 B)3個 C)6個 D)9個
答案:A
問題三:下列哪一個是單詞密碼?
A) KLLN B) LOML C) MLLO D)NMKO
答案:C
8. 62-63=1 等式不成立,請移動一個數字(不可以移動減號和等於號),使得等式成立,如何移動?
答案:62移動成2的6次方
1)Which statement shows the maximum salary paid in each job category of each department?_______
A. select dept_id, job_cat,max(salary) from employees where salary > max(salary);
B. select dept_id, job_cat,max(salary) from employees group by dept_id,job_cat;
C. select dept_id, job_cat,max(salary) from employees;
D. select dept_id, job_cat,max(salary) from employees group by dept_id;
E. select dept_id, job_cat,max(salary) from employees group by dept_id,job_cat,salary;
2)description of the students table:
sid_id number
start_date date
end_date date
which two function are valid on the start_date column?_________。
A.sum(start_date)
B.avg(start_date)
C.count(start_date)
D.avg(start_date,end_date)
E.min(start_date)
F.maximum(start_date)
3)for which two constraints does the Oracle server implicitly create a unique index?______。
A. not null
B. primary
C. foreign key
D. check
E. unique
4)in a select statement that includes a where clause,where is the group by clause placed in the select statement?______。
A. immediately after the select clause
B. before the where clause
C. before the from clause
D. after the order by clause
E. after the where clause
5)in a select statement that includes a where clause,where is the order by clause placed in the select statement?
______.
A.immediately after the select clause
B.before the where clause
C.after all clause
D.after the where clause
E.before the from clause
6)evaluate there two sql statements______.
Select last_name,salary from employees order by salary;
Select last_name,salary from employees order by 2 asc;
A.the same result B.different result C.the second statement returns a syntax error
7) you would like to display the system date in the format“20051110 14:44:17”。Which select statement should you use?______。
A. select to_date(sydate,’yearmmdd hh:mm:ss’)from dual;
B. select to_char(sydate,’yearmonthday hh:mi:ss’)from dual;
C. select to_date(sydate,’yyyymmdd hh24:mi:ss’)from dual;
D. select to_char(sydate,’yyyymmdd hh24:mi:ss’)from dual;
E. select to_char(sydate,’yy-mm-dd hh24:mi:ss’)from dual;
8)which select statement will the result ‘ello world’from the string‘Hello world’?______.
A. select substr(‘Hello World’,1)from dual;
B. select substr(trim(‘Hello World’,1,1))from dual;
C. select lower(substr(‘Hello World’,1))from dual;
D. select lower(trim(‘H’from‘Hello World’))from dual;
9)which are DML statements(choose all that apply)______.
A.commit B.merge C.update D.delete E.creat F.drop
10)Select 語句中用來連接字符串的符號是______.
A. “+” B. “&” C.“||” D.“|”
問答題: 什麼是聚集索引,什麼是非聚集索引,什麼又是主鍵?
1. B
2. D,F
3. B, E
4. E
5. C
6. C
7. D
8. A
9. E
10. A
11. 表中經常有一個列或列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵.
聚集索引確定表中數據的物理順序。聚集索引類似於電話簿,後者按姓氏排列數據。由於聚集索引規定數據在表中的物理存儲順序,
因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
非聚集索引與課本中的索引類似。數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。
索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲(這可以由聚集索引規定)。
如果在表中未創建聚集索引,則無法保證這些行具有任何特定的順序。
1.new有幾種用法
第一種:new Class();
第二種:覆蓋方法
public new XXXX(){}
第三種:new 約束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。
2.如何把一個array復制到arrayList裡
foreach( object o in array )arrayList.Add(o);
3.datagrid.datasouse可以連接什麼數據源 [dataset,datatable,datavIEw]
dataset,datatable,datavIEw , IList
4.概述反射和序列化
反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然後,可以調用類型的方法或訪問其字段和屬性
序列化:序列化是將對象轉換為容易傳輸的格式的過程。例如,可以序列化一個對象,然後使用 HTTP 通過 Internet 在客戶端和服務器之間傳輸該對象。在另一端,反序列化將從該流重新構造對象。
5.概述o/r mapping 的原理
利用反射,配置 將類於數據庫表映射
6.類成員有( )種可訪問形式
可訪問形式?不懂。
可訪問性:public ,protected ,private,internal
7.用sealed修飾的類有什麼特點
sealed 修飾符用於防止從所修飾的類派生出其它類。如果一個密封類被指定為其他類的基類,則會發生編譯時錯誤。
密封類不能同時為抽象類。
sealed 修飾符主要用於防止非有意的派生,但是它還能促使某些運行時優化。具體說來,由於密封類永遠不會有任何派生類,所以對密封類的實例的虛擬函數成員的調用可以轉換為非虛擬調用來處理。
8.列舉ADO.Net中的五個主要對象,並簡單描述
connection,command,dataReader,trans,dataset ...
9.執行下面代碼後:
String strTemp ="abcdefg 某某某";
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 ="" 分配空間
11.詳述.Net裡class和struct的異同!
class:放在 ? struct放在?
struct值傳遞
類與結構有很多相似之處:結構可以實現接口,並且可以具有與類相同的成員類型。然而,結構在幾個重要方面不同於類:結構為值類型而不是引用類型,並且結構不支持繼承。結構的值存儲在“在堆棧上”或“內聯”。細心的程序員有時可以通過聰明地使用結構來增強性能。
12.概述.Net裡對 remoting 和 webservice 兩項技術的理解和實際中的應用。
遠程邏輯調用,remoing接口只能用在.Net中
13.什麼是code-behind技術
ASPx and cs
14.概述三層結構體系
web/business/dataAccess
15.ASP.Net如何實現MVC模式,舉例說明!
web/business/dataAccess