1、列舉ASP.NET頁面之間傳值的幾種方式。
答:使用QueryString,如.../id=1;response.Redirect()
使用Session
使用Server.Transfer
使用Cookie
2、簡述private、protected、public、internal修飾符的訪問權限。
答:privata:私有成員,在類的內部才可以訪問
protected:保護成員,該類內部和繼承類可以訪問
public:公開成員,沒有訪問限制
internal: 當前程序集可以訪問
3、簡述ADO.NET中的五個主要對象。
答:Connection:主要是開啟程序和數據庫之間的連接。沒有利用連接對象將數據庫打開,是無法從數據庫中取得數據的。Close和Dispose的區別,Close以后還可以Open,Dispose以后則不能再用。
Command:主要可以用來對數據庫發出一些指令,例如可以對數據庫下達查詢、新增、修改、刪除數據等指令,以及調用存在數據庫中的存儲過程等。這個對象是架構在Connection 對象上,也就是Command 對象是透過連接到數據源。
DataAdapter:主要是在數據源以及DataSet 之間執行數據傳輸的工作,它可以透過Command 對象下達命令后,並將取得的數據放入DataSet 對象中。這個對象是架構在Command對象上,並提供了許多配合DataSet 使用的功能。
DataSet:這個對象可以視為一個暫存區(Cache),可以把從數據庫中所查詢到的數據保留起來,甚至可以將整個數據庫顯示出來,DataSet是放在內存中的。DataSet 的能力不只是可以儲存多個Table 而已,還可以透過DataAdapter對象取得一些例如主鍵等的數據表結構,並可以記錄數據表間的關聯。DataSet 對象可以說是ADO.NET 中重量級的對象,這個對象架構在DataAdapter對象上,本身不具備和數據源溝通的能力;也就是說我們是將DataAdapter對象當做DataSet 對象以及數據源間傳輸數據的橋梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。
DataReader:當我們只需要循序的讀取數據而不需要其它操作時,可以使用DataReader 對象。DataReader對象只是一次一筆向下循序的讀取數據源中的數據,這些數據是存在數據庫服務器中的,而不是一次性加載到程序的內存中的,只能(通過游標)讀取當前行的數據,而且這些數據是只讀的,並不允許作其它的操作。因為DataReader 在讀取數據的時候限制了每次只讀取一筆,而且只能只讀,所以使用起來不但節省資源而且效率很好。使用DataReader 對象除了效率較好之外,因為不用把數據全部傳回,故可以降低網絡的負載。
ADO.NET 使用Connection 對象來連接數據庫,使用Command 或DataAdapter對象來執行SQL語句,並將執行的結果返回給DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 對象操作數據結果。
4、請簡述.NET中類與結構的異同。
答:class可以被實例化,屬於引用類型,是分配在內存的堆上的。類是引用傳遞。
struct屬於值類型,是分配在內存的棧上的。結構是值傳遞。
int32、boolean都屬於結構。
5、override與重載(overload)的區別。
答:重載是方法的名稱相同。參數或參數類型不同,進行多次重載以適應不同的需要。
重載是面向過程的概念。override是進行基類中函數的重寫,是面向對象的概念。
6,什么是面向對象
面向對象OO = 面向對象的分析OOA + 面向對象的設計OOD + 面向對象的編程OOP; 通俗的解釋就是萬物皆對象,把所有的事物都看作一個個可以獨立的對象(單元),它們可以自己完成自己的功能,而不是像C那樣分成一個個函數; 現在純正的OO語言主要是java和C#,C++也支持OO,C是面向過程的。
7,靜態成員和實例成員的區別
(1)語法區別:靜態成員有關鍵字static,非靜態成員無static修飾;
(2)存儲區別: 靜態成員變量存儲位於程序的全局變量存儲區,其作用域限制為類內部,並且在整個程序運行期間只在內存中擁有一個存儲位置,不會拷貝不會復制,只是一個;
非靜態成員變量存儲位於對象的變量存儲區,多個對象擁有多個變量的存儲,只隸屬於自己的的對象
(3)歸屬區別:靜態成員隸屬於類,是類的財產,無論對一個類創建多少個實例,它的靜態成員都只有一個副本,在各個地方的改變都會改變其值;
非靜態成員隸屬於它的對象,各自對象同一個非靜態成員值的改變都不互相影響,有多少實例就有多少副本;
(4)生存周期區別: 知道了存儲位置的區別也就不難理解生存周期的差異了,靜態成員只要分配了空間則在整個程序運行期間,它都是存在的,只有程序關閉之后,它的內存才會被GC回收器收回,不過作用域仍然只限制於類的內部,在類外部調用時需要使用類 名加點的方式訪問;
類的非靜態成員的生存周期跟隨於隸屬於對象的生存周期,對象消亡則非靜態成員就會被回收;
(5)初始化順序的區別:初始化都是最先初始化類的靜態成員,然后才是非靜態數據成員。
8,什么是存儲過程,有什么優點
存儲過程是一組予編譯的SQL語句
它的優點:
1.允許模塊化程序設計,就是說只需要創建一次過程,以后在程序中就可以調用該過程任意次。
2.允許更快執行,如果某操作需要執行大量SQL語句或重復執行,存儲過程比SQL語句執行的要快。
3.減少網絡流量,例如一個需要數百行的SQL代碼的操作有一條執行語句完成,不需要在網絡中發送數百行代碼。
4.更好的安全機制,對於沒有權限執行存儲過程的用戶,也可授權他們執行存儲過程。
附加:cache:在計算機存儲系統的層次結構中,介於中央處理器和主存儲器之間的高速小容量存儲器。它和主存儲器一起構成一級的存儲器。
消息隊列(MQ)是一種應用程序對應用程序的通信方法。
CLR common language runtime 就是運行時相當於一個運行環境(相當於JVM)
IL intermidiate language中間語言,C#先編譯成中間語言再在CLR上面執行
9、new有幾種用法?
答:1、new Class();
2、覆蓋方法,public new XXXX();
3、new() 約束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數
10、用sealed修飾的類有什么特點?
答:sealed修飾符用於防止從所修飾的類派生出其他類。如果一個密封類指定為其他類的基類,則會發生編譯錯誤。
密封類不能同時為抽象類。
sealed修飾符主要用於防止非有意的派生,他還能促使某些運行時優化。
String就是用sealed修飾的密封類,所以不能被繼承。
11、在.NET中,配件的意思是?
答:程序集。(中間IL語言、元數據、資源、裝配清單)
12、一個數組:1,1,2,3,5,8,13,21...,求第30位數是多少?
答:int[] arr = new int[30];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < arr.Length; i++)
{
arr[i] = arr[i-1] + arr[i-2];
}
Console.WriteLine(arr[29]);
Console.ReadLine();
13、請簡述面向對象的多態的特性及意義
答:簡單來說,多態是具有表現多種形態的能力特征,在OO中是指,語言根據對象的類型的不同,以不同的方式處理。
特別是重載方法和繼承類這種形式的能力。
多態被認為是面向對象語言的必備特性。
面向對象的語言使用虛方法表達多態。
這意味着派生類可以有和父類具有同樣簽名的方法,並且父類可以調用派生類的方法。
在C#中,必須使用virtual關鍵字才能使方法被父類調用。
或者:面向對象的編程使用了派生繼承以及虛函數機制.一個本來指向基類的對象指針可以指向其派生類的.並訪問從基類繼承而來的成員變量和函數.而虛函數是專門為這個特性設計的,這個函數在每個基類的派生類中都是同一個名字,但函數體卻並不一定相同,派生類往往為實現自己的功能而修改這個虛函數.這樣用一個指針就能夠實現對多種不同的派生類的訪問, 並實現其派生類的特定功能(代碼 )
14、請編程遍歷winform窗口上所有TextBox控件,並給它的Text屬性賦值為string.Empty。
答:using System.Windows.Forms;
foreach (Control control in this.Controls)
{
if(control is TextBox)
{
TextBox tb = (TextBox)control;
tb.Text = String.Empty;
}
}
15、什么是裝箱(inboxing)和拆箱(unboxing)。
答:裝箱:將一個值類型隱式地轉換成一個object類型,或把這個值類型轉換成一個被該值類型應用的接口類型,把一個值類型的值裝箱,就是創建一個object實例並將值復制給這個object
拆箱:和裝箱相反,拆箱轉換是指將一個對象類型顯式地轉換成一個值類型,或將一個接口類型顯式地轉換成一個執行該接口的值類型。
object obj = null;
obj = 1;//裝箱,把值類型包裝成引用類型。
int num = (int)obj;// 拆箱,顯示類型轉換。
16、如何理解三層架構。
答:三層架構就是將整個業務應用划為:表現層、業務邏輯層、數據訪問層。
區分層次的目的即為了“高內聚,低耦合”的思想。
表現層:通俗講就是展現給用戶的界面,即用戶在使用一個系統的時候的所見所得。
業務邏輯層:針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。
數據訪問層:該層所做事務直接操作數據庫,針對數據的增刪改查等。
每層之間是一種垂直關系。
三層架構是N層架構的一種,一般來說,層次之間是向下依賴的,下層代碼未確定其接口前,上層代碼是無法開發的,下層代碼接口的變化將使上層的代碼一起變化。
優點:分工明確,條理清晰,易於調試,而且具有擴展性。
缺點:增加系統復雜度,增加成本。
17、寫一個冒泡排序(從小到大)。
答:int[] myInts = { 11, 22, 33, 44, 55 ,66};
int temp = 0;
int count = 0;
for (int i = 1; i <= myInts.Length - 1; i++)
{
//bool 是否需要排序 = false;
for (int j = myInts.Length - 1; j >= i; j--)
{
if (myInts[j] < myInts[j - 1])
{
temp = myInts[j];
myInts[j] = myInts[j - 1];
myInts[j - 1] = temp;
}
count++;
}
}
18、數據庫三范式是什么?
答:1NF,確保每列保持原子性
2NF,確保表中的每列都和主鍵相關
3NF,確保每列都和主鍵列直接相關,而不是間接相關
19、能用foreach遍歷訪問的對象有什么要求?
答:需要實現IEnumerable接口或聲明GetEnumerator方法的類型。
20、GC是什么?為什么要有GC?
答:GC是垃圾收集器。
程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。
GC只能處理托管內存資源的釋放,對於非托管資源則不能使用GC回收內存,必須由程序員手工回收。
21、說出五個集合類。
答:List、Dictionary、Stack、Queue、Tree等
22、不用JQuery等庫,原生JS使用AJAX實現登陸。
答:window.onload = function () {
document.getElementById('btn').onclick = function () {
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
var xhr = new XMLHttpRequest();
xhr.open('POST','/url?username=' + username + '&password=' + password, true);
xhr.onreadystatechange = function () {
if(xhr.readyState === 4) {
if (xhr.status === 200) {
alert('登陸成功')
} else {
alert('登陸失敗')
}
}
}
}
}
23、你覺得如何才能提高代碼的效率和性能(可以列舉多種思路,越多越好)?
答:可以根據業務流程、業務數據的特點進行優化,比如可以采用緩存、索引等來提高代碼的效率和性能。
同時不要進行無意義的代碼優化,重點優化系統的性能瓶頸。
按照設計模式去編寫代碼,徹底的面向對象編程,多用委托事件。
盡量做到方法的每一個實現代碼只寫一遍。
24、什么是Code-Behind技術?
答:Code-Behind是代碼隱藏。
在ASP.NET中通過ASPX頁面指向CS文件的方法顯示邏輯和處理邏輯的分離,這樣有助於web應用程序的創建。
Code-Behind是基於部分類技術實現的。
25、using關鍵字有什么用?什么是IDisposable?
答:using可以聲明namespace的引入,還可以實現非托管資源的釋放,實現了IDisposable的類在using中創建對象,using結束后會自動調用Dispose方法,釋放資源。
using其實等價於於try...finally,用起來更方便。
26、String是值類型還是引用類型?它是如何工作的。
答:String是引用類型。
String的值是不可變的,當對String類型的對象重新賦值時,這個對象的引用指向就會變成一個新的引用,而原來的那個值並沒有改變,只是引用改變了。
27、簡述堆與棧的區別。
答:棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧中。
堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。
28、有一個8個數的數組{1,2,3,3,4,5,6,6},計算其中不重復數字的個數。
答:int values = {1,2,3,3,4,5,6,6};
HashSet<int> set = new HashSet<int>();
foreach(int i in values)
{
set.Add(i);
}
Console.WriteLine(set.Count)
29、是否可以從一個static方法內部發出對非static方法的調用?
答:不可以。因為非static方法與對象相關聯,必須創建一個對象后,才可以在該對象上進行方法調用,而static方法調用時不需要創建對象,可以直接調用。
也就是說,當一個static方法被調用時,可能還沒有創建任何實例對象,如果從一個static方法中調用一個非static方法,那么非static方法沒有關聯的對象,所以不可以。
30、說出一些常用類、接口,請各列舉5個。
答:類:StreamReader、StringBuilder、SqlConnection、FileStream、File、Regex
接口:IDisposable、IEnumerable、IComparable、ICollection、IList
31、C#支持多重繼承么?
答:類之間不支持,接口之間支持。
類對接口叫做實現,不叫繼承。
類是爹、接口是能力,能力可以有多個,但不能有多個爹。
32、簡單說明數據庫建立索引的優缺點。
答:優點,使用索引可以加快數據的查詢速度。
缺點,插入數據過程中會建立索引,所以會降低數據的插入、更新速度,還會占用磁盤。
33、通過超鏈接<a>如何傳遞中文參數。
答:用URL編碼,通過QueryString傳遞,用System.Web.HttpUtility.UrlEncode編碼 用System.Web.HttpUtility.UrlDecode解碼。
34、Ajax解決什么問題?如何使用Ajax?Ajax有什么問題需要注意?
答:AJAX解決的問題就是“無刷新更新頁面”,用傳統的HTML表單方式進行頁面的更新時,每次都要將請求提交到服務器,服務器返回后再重繪界面。
這樣界面就會經歷:提交→變白→重新顯示這樣一個過程,用戶體驗非常差,使用AJAX則不會導致頁面重新提交、刷新。
AJAX最本質的實現是在Javascript中使用XMLHttpRequest進行Http的請求,開發中通常使用UpdatePanel、JQuery等方式簡化AJAX的開發。
使用XmlHttpRequest實現Ajax請求。
Ajax最重要的問題是無法跨域請求,也就是無法在再頁面中向和當前域名不同的頁面發送請求。
35、你經常訪問的技術類網站是什么?
答:博客園、CSDN、GitHub、MSDN、MDN、CnBate、CodePlex
36、Session有什么缺陷?微軟提出了什么方法加以解決。
答:iis中由於有進程回收機制,系統繁忙的話Session會丟失,IIS重啟也會丟失。
可以用SateServer或SQL Server數據庫的方式存儲Session不過這種方式比較慢,而且無法捕獲Session的END事件。
SateServer還可以解決集群Session共享的問題。
37、ASP.NET中的錯誤機制。
答:ASP.NET四種錯誤處理機制,分別是:Page_Error(不常用),Application_Error(應用程序中的未捕獲異常),<customErrors>四種。
如果一個表查詢比寫入頻繁可以建立索引,如果寫入比查詢頻繁,就不建議建立索引。
38、SQL注入漏洞產生的原因?如何防止。
答:程序開發過程中不注意書寫sql語句和對特殊字符進行過濾,導致客戶端可以提交一些sql語句正常執行。
1、sql語句盡量不要省略引號和單引號。
2、過濾掉SQL語句中的一些關鍵字。
3、控制錯誤信息,不要再瀏覽器上輸出錯誤信息。
4、使用SqlParameter類,盡量不要拼接字符串SQL語句。
39、如何提高頁面的顯示速度?假如一個頁面的加載時間是10.89S,你會用什么樣的方式優化。
答:首先要找出問題所在,是服務器端運行的速度慢還是服務器端到客戶端的下載慢還是頁面在瀏覽器的加載速度慢。
如果是服務器端運行速度慢,則找是數據庫的原因還是算法的問題,如果是數據庫的問題則嘗試添加索引、優化SQL語句,如果是算法的問題,則優化算法。
如果對於一些不經常改動的頁面可以使用靜態頁技術!
對於一些數據不需要及時更新的而且取數據的過程非常耗時可以使用緩存。
頁面中的內容可以按需加載(比如說可以像網站的評論那樣當用戶需要看的時候再加載其內容)
可以在圖片需要顯示的時候再進行加載。
如果是服務器端到客戶端的下載慢則看是頁面體積過於臃腫還是網絡問題,
如果是頁面體積過於臃腫,則優化HTML代碼,去掉無用的標簽,壓縮JS、CSS,可以用CSS Spirit技術將多個圖片放到一個圖片中,減少向服務器的請求。
如果是網絡問題,則嘗試在不同的網絡、地區部署服務器,然后使用CDN技術加速訪問。
如果是頁面中的JavaScript運行復雜導致運行速度慢,則優化JavaScript。
40、你會采用什么樣的策略和方法來實現系統緩存。
答:在ASP.NET中 緩存有 頁面緩存,數據源緩存,和一些自己定義的緩存!
對於那些整個頁面不經常變化的我們可以使用頁面緩存,而對於那些執行非常耗時的SQL語句並且數據的及時性要求不高的我們可以使用數據源緩存。
41、網站想要實現文件防盜鏈的功能,說說你的解決方案。
答:讀取HTTP報文頭中的UrlReferrer在Application_BeginRequest中我們可以判斷用戶的請求是否來源於本網站。如果不是我們可以終止用戶的請求。
42、StringBuilder和String的區別。
答:String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。
所以在大量字符串拼接或頻繁對某一字符串進行操作時最好使用 StringBuilder,不要使用 String
如果要操作一個不斷增長的字符串,盡量不用String類,改用StringBuilder類。
兩個類的工作原理不同:String類是一種傳統的修改字符串的方式,它確實可以完成把一個字符串添加到另一個字符串上的工作沒錯,但是在.NET框架下,這個操作實在是划不來。
因為系統先是把兩個字符串寫入內存,接着刪除原來的String對象,然后創建一個String對象,並讀取內存中的數據賦給該對象。這一來二去的,耗了不少時間。
而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,能夠在已有對象的原地進行字符串的修改,簡單而且直接。
當然,一般情況下覺察不到這二者效率的差異,但如果你要對某個字符串進行大量的添加操作,那么StringBuilder類所耗費的時間和String類簡直不是一個數量級的。
43、對於大流量的網站,應采用什么樣的方法來解決訪問量問題。
答:首先,確認服務器硬件是否足夠支持當前的流量。
普通的P4服務器一般最多能支持每天10萬獨立IP,如果訪問量比這個還要大,那么必須首先配置一台更高性能的專用服務器才能解決問題,否則怎么優化都不可能徹底解決性能問題。
其次,優化數據庫訪問。
服務器的負載過大,一個重要的原因是CPU負荷過大,降低服務器CPU的負荷,才能夠有效打破瓶頸。而使用靜態頁面可以使得CPU的負荷最小化。
前台實現完全的靜態化當然最好,可以完全不用訪問數據庫,不過對於頻繁更新的網站,靜態化往往不能滿足某些功能。
緩存技術就是另一個解決方案,就是將動態數據存儲到緩存文件中,動態網頁直接調用這些文件,而不必再訪問數據庫,WordPress和Z-Blog都大量使用這種緩存技術。
如果確實無法避免對數據庫的訪問,那么可以嘗試優化數據庫的查詢SQL.避免使用Select * from這樣的語句,每次查詢只返回自己需要的結果,避免短時間內的大量SQL查詢。
第三,禁止外部的盜鏈。
外部網站的圖片或者文件盜鏈往往會帶來大量的負載壓力,因此應該嚴格限制外部對於自身的圖片或者文件盜鏈。
第四,控制大文件的下載。
大文件的下載會占用很大的流量,並且對於非SCSI硬盤來說,大量文件下載會消耗CPU,使得網站響應能力下降。因此,盡量不要提供超過2M的大文件下載, 如果需要提供,建議將大文件放在另外一台服務器上。
第五,使用不同主機分流主要流量
將文件放在不同的主機上,提供不同的鏡像供用戶下載。
第六,使用流量分析統計軟件
在 網站上安裝一個流量分析統計軟件,可以即時知道哪些地方耗費了大量流量,哪些頁面需要再進行優化,因此,解決流量問題還需要進行精確的統計分析才可以。
44、打印出由*號組成的倒三角形的圖案
******* 4*2-1 要求: 1、輸入倒三角的行數,行數范圍3-18,對於不在范圍的行數,拋出提示.
***** 3*2-1 2、在控制台打印出指定行數的倒三角形。
***2
*1
答:while (true)
{
Console.Write("請輸入一個數(3-50)之間:");
int num = Convert.ToInt32(Console.ReadLine());
if (num < 3 || num > 50)
{
Console.WriteLine("非法數值");
continue;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < num; i++)
{
sb.Clear();
//生成空格,規則:行首空格數=行數-1
string space = "".PadLeft(i, ' ');
sb.Append(space);
//生成星號, 規則:行號*2-1,行號=num-i
string star = "".PadLeft((num - i) * 2 - 1, '*');
sb.Append(star);
Console.WriteLine(sb);
}
}
45、什么是單例?編寫一個單例類。
答:單例是一種設計模式。
這一模式的目的是使得類的一個對象成為系統中的唯一實例。
單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
/// <summary>
/// 單例模式的實現
/// </summary>
public class Singleton
{
// 定義一個靜態變量來保存類的實例
private static Singleton uniqueInstance;
// 定義私有構造函數,使外界不能創建該類實例
private Singleton()
{
}
/// <summary>
/// 定義公有方法提供一個全局訪問點,同時你也可以定義公有屬性來提供全局訪問點
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
// 如果類的實例不存在則創建,否則直接返回
if (uniqueInstance == null)
{
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
46、try{}里有一個return語句,那么緊跟在try后的finally{}里的代碼會不會被執行,什么時候被執行。
答:會執行,如果return后面有一個返回值或者表達式,則會先進行計算,把值暫存起來,然后再執行finally里的代碼,無論如何,return總是最后執行。
47、不用中間變量,交換兩個整型變量。
答:i = 10, j = 20;
i = i + j;//i = 30;
j = i - j;//j = 10;
i = i - j;//i = 20;
48、對數據的並發采用什么方法比較好?
答:可以控制連接池的連接數量,越多越好,還可以使用負載均衡。
49、short s=1;s=s+1;有錯么?short s=1;s+=1;有錯么?
答:short s=1;s=s+1;
這句不會通過編譯(類型轉換錯誤),因為s+1,其中1為int型,而s會隱式轉換為int再和1進行運算,運算結果自然是int,而int則無法隱式轉換回short,所以這里是錯的。
short s=1;s+=1;
這句是則不會報錯,因為s+=1,相當於s=(short)(s+1),在運算后賦值前進行了顯式類型轉換。
50、產生一個int數組,長度為100,並向其隨機插入1-100,並且不能重復(要求使用兩種方法)。
答://方法一
List<int> list = new List<int>();
Random rand = new Random();
while (list.Count < 100)
{
int num = rand.Next(1, 101);
if (!list.Contains(num))
{
list.Add(num);
}
}
//方法二
int[] arr = new int[100];
for (int i = 0; i < 100; i++)
{
arr[i] = i + 1;
}
Random rand1 = new Random();
for (int i = 0; i < 100; i++)
{
int m = rand1.Next(0, 100);
int n = rand1.Next(0, 100);
int temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}
51、C#中的委托是什么?事件是不是一種委托?事件和委托的關系。
答:委托可以把一個方法作為參數代入另一個方法。
委托可以理解為指向一個函數的指針。
委托是類型,事件是對象。
事件的內部是用委托實現的,對於事件來講,外部只能注冊自己(+=)和注銷自己(-=)。
事件內部就是一個private的委托和add(+=)、remove(-=)兩個方法。
52、屬性和字段的區別是什么?
答:屬性可以對值的獲取和設置進行控制,而字段不能。
一般情況下get讀取的值就是set設置的值。
如果只有get,則說明值是只讀。
如果只有set,則說明值是只寫。
get和set的本質是就是內部方法。
53、C#的接口和類有什么異同?
答:不同點:
不能直接實例化接口。
接口不包含方法的實現。
接口可以繼承,類只能單繼承。
類定義可在不同的源文件之間進行拆分。
相同點:
接口、類和結構都可以從多個接口繼承實現。
繼承接口的任何非抽象類型都必須實現接口的所有成員。
接口和類都可以包含事件、索引、方法和屬性。
54、什么情況下會用到虛方法?它與接口有什么不同?
答:子類重新定義父類的某一個方法時,必須把父方法定義為virtual。
在定義接口中不能有方法體,虛方法可以。
實現時,子類可以可以不重新定義虛方法,但如果一個類繼承接口,那必須實現這個接口。
55、常見的HTTP狀態碼有哪些?各是什么意思?
答:200:(成功) 服務器已成功處理了請求 。通常,這表示服務器提供了請求的網頁
400 :(錯誤請求) 服務器不理解請求的語法
404:(未找到) 服務器找不到請求的網頁。
302 :(臨時移動) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
500 :(服務器內部錯誤) 服務器遇到錯誤,無法完成請求。
56、abstract class和interface有什么區別?
答:相同點:
都不能被直接實例化,都可以繼承實現其(抽象)方法。
不同點:
接口支持多繼承,抽象類不能實現多繼承。
接口只能定義行為,抽象類既可以定位行為,還能提供實現。
接口只包括:方法、屬性、索引器、事件的簽名,不能定義字段和包含實現的方法。
抽象類可以定義字段、屬性、包含實現的方法。
接口可用作於結構和類,抽象只能用作於類。
結構可以繼承接口,而不能繼承類。
57、簡述屬性與索引器的區別?
答:屬性用於以可驗證的方式訪問私有成員變量。索引器用於以更便捷的方式訪問對象中包含的成員數組或集合。
區別:
1、屬性名可自定義,索引器必須以this命名。
2、屬性可以為實例或靜態,索引器必須是實例的。
3、索引器有索引參數列表,而屬性沒有。
58、DataReader和DataSet的異同?
答:DataReader為在線操作數據, DataReader會一直占用SqlConnection連接,在其獲得數據過程中其它操作不可以再使用SqlConnection連接對象。
DataSet為離線操作數據,DataSet會將數據一次性讀入內存,然后斷開連接,這時其它操作就可以使用SqlConnection連接對象。
由於DataReader一次只讀取一行數據,所以占用內存較小。但DataReader為只進且只讀的,也就是只能單方向向前讀取,如果你想回頭去讀取上一條數據是不允許的,並且 不允許其修改數據。
由於DataSet一次性讀取所有數據,所以比較消耗資源,但也提高了靈活性,在斷開數據庫連接情況下你可以對數據進行任何增刪改查,按照任意的順序讀取數據,並可以將 其寫回到數據庫。
59. 值傳遞和引用傳遞的區別
答:數據類型在內存中的保存時,值類型保存在堆棧中,引用類型將它的值保存在托管堆中,在堆棧中保存的是對堆上地址的引用,
在方法中傳遞參數時,所有類型都是傳遞堆棧中的位置,具體過程為先在堆棧上復制一個傳遞的對象,然后將該對象傳給參數,所以顯而易見,數值類型保存在堆棧中,作為參 數傳遞時直接復制了數值的一個副本給方法,方法對該副本所做的任何操作都不會影響到該數值的原值,但是引用類型復制的是堆棧上對堆的引用,該引用指向的仍然是堆上的引 用類型,所以對應用類型所做的操作都會引起其本身的改變。
60. C#中索引器是否只能根據數字進行索引?是否允許多個索引器參數?
答:索引器就是對一個集合的快速訪問方法,如一個類中有一個List類型的變量,可以使用this[int index]來訪問該List變量,間接的就是this.List[index],
索引器中的參數不一定是整數,也可以是其他類型,如字典使用的就是字符串,參數的個數和類型可以是任意類型
回答方式二:參數的個數和類型都是任意的。加分的補充回答:用reflector反編譯可以看出,索引器的內部本質上就是set_item、get_item方法。
加分的補充回答:回答傳智播客.net培訓中講解設計模式中開發的SettingsProvider就是用的string類型的參數名做索引器參數。
61. 屬性和public字段的區別是什么?調用set方法為一個屬性設置,然后用get方法讀取出來的值一定是set進去的值嗎?
答: 屬性可以對設值、取值的過程進行非法值控制,比如年齡禁止設值負數,而字段則不能進行這樣的設置。
雖然一般情況下get讀取的值就是set設置的值,但是可以讓get讀取的值不是
set設置的值的,極端的例子。Public Age{get{return 100;}set{}}。
加分的補充回答:用reflector反編譯可以看出,屬性內部本質上就是set_***、get_***方法
