目錄
本次給大家介紹的是我收集以及自己個人保存一些.NET面試題第二篇
簡介1.接口
2.您在什么情況下會用到虛方法或抽象類揍瑟,接口正压?
3.重載(Overload )和覆寫(Override)的區(qū)別
4.值類型和引用類型的區(qū)別瓷式?寫出C#的樣例代碼替饿。
5.委托和事件簡述
6.Session,ViewState,Application,cookie的區(qū)別?
7.Application,Session,Cookie,ViewState和Cache生命周期
8.ajax原理
9.請敘述屬性與索引器的區(qū)別
10.String類與StringBuilder類有什么區(qū)別?為啥在.Net類庫中要同時存在這2個類蒿往?
11.淺談C#中的枚舉
12.C#的New關(guān)鍵字的幾種用法
回到頂部
簡介
此次包含的不止是.NET知識盛垦,也包含少許前端知識以及.net面試時所涉及的種種考點湿弦,希望能給找工作的同學(xué)們哪怕一點點幫助瓤漏。
在此提醒下,本文適合:
剛畢業(yè)的萌新
工作不久換工作的
大偶瞻#可忽略啦
1.接口
文章引用:http://www.cnblogs.com/jiajiayuan/archive/2011/09/16/2178462.html
①.接口的特性:
接口類似于抽象基類蔬充,不能直接實例化接口;接口中的方法都是抽象方法班利,實現(xiàn)接口的任何非抽象類型都必須實現(xiàn)接口的所有成員:
當(dāng)顯式實現(xiàn)該接口的成員時饥漫,實現(xiàn)的成員不能通過類實例訪問,只能通過接口實例訪問罗标。
當(dāng)隱式實現(xiàn)該接口的成員時庸队,實現(xiàn)的成員可以通過類實例訪問,也可以通過接口實例訪問闯割,但是實現(xiàn)的成員必須是公有的彻消。
接口不能包含常量、字段宙拉、運算符宾尚、實例構(gòu)造函數(shù)、析構(gòu)函數(shù)或類型谢澈、不能包含靜態(tài)成員煌贴。
接口成員是自動公開的,且不能包含任何訪問修飾符锥忿。
接口自身可從多個接口繼承牛郑,類和結(jié)構(gòu)可繼承多個接口,但接口不能繼承類敬鬓。
②為什么不能指定接口中方法的修飾符淹朋?
接口中的方法用來定義對象之間通信的契約,指定接口中的方法為私有或保護(hù)沒有意義列林。它們默認(rèn)為公有方法瑞你。
interface IProgram { void Fun(); } class Program:IProgram { //顯式實現(xiàn)接口成員 void IProgram.Fun() { Console.WriteLine("I am Fun."); } staticvoid Main(string[] args) { IProgram p =new Program(); //聲明一個接口實例,但不是對接口進(jìn)行實例化 p.Fun(); Console.Read(); } }
③實現(xiàn)接口可以顯式實現(xiàn)和隱式實現(xiàn)希痴,那么這兩種實現(xiàn)到底有什么優(yōu)缺點呢者甲?
一般情況,當(dāng)類或者結(jié)構(gòu)要實現(xiàn)的是單個接口砌创,可以使用隱式實現(xiàn)虏缸。如果類或者結(jié)構(gòu)繼承了多個接口且接口中具有相同名稱成員時鲫懒,就要用到顯式實現(xiàn),當(dāng)顯式實現(xiàn)方式存在時刽辙,隱式實現(xiàn)方式就失效了窥岩。
interface IProgram { void Fun(); } interface IAProgram { void Fun(); } class Program : IProgram, IAProgram { void IProgram.Fun() //顯式實現(xiàn)接口IProgram { Console.WriteLine("I am IProgram Fun."); } void IAProgram.Fun() //顯式實現(xiàn)接口IAProgram { Console.WriteLine("I am IAProgram Fun."); } //public void Fun() //隱式實現(xiàn)接口 //{ // Console.WriteLine("I am Program Fun."); //} staticvoid Main(string[] args) { //IProgram p = new Program(); //p.Fun(); //IAProgram ap = new Program(); //ap.Fun(); Program pro =new Program(); ((IProgram)pro).Fun(); ((IAProgram)pro).Fun(); Console.Read(); } }
④接口的繼承:
接口繼承和類繼承不同
首先,類繼承不僅是說明繼承宰缤,而且也是實現(xiàn)繼承颂翼;而接口繼承只是說明繼承。也就是說慨灭,派生類可以繼承基類的方法實現(xiàn)朦乏,而派生的接口只繼承了父接口的成員方法說明,而沒有繼承父接口的實現(xiàn);
其次氧骤,C#中類繼承只允許單繼承呻疹,但是接口繼承允許多繼承,一個子接口可以有多個父接口筹陵。接口可以從零或多個接口中繼承刽锤。從多個接口中繼承時,用":"后跟被繼承的接口名字朦佩,多個接口名之間用","分割并思。被繼承的接口應(yīng)該是可以訪問得到的,比如從private 類型或internal 類型的接口中繼承就是不允許的吕粗。接口不允許直接或間接地從自身繼承纺荧。和類的繼承相似,接口的繼承也形成接口之間的層次結(jié)構(gòu)颅筋。
interface IProgram { void Fun(); } interface IAProgram:IProgram { } class Program : IAProgram { void IProgram.Fun() { Console.WriteLine("I am IProgram Fun."); } static void Main(string[] args) { Program pro =new Program(); ((IAProgram)pro).Fun(); Console.Read(); } }
⑤接口的覆蓋:
由于接口的實現(xiàn)沒有方法體宙暇,抽象方法也沒有方法體,那么當(dāng)我們在接口的實現(xiàn)方法里調(diào)用抽象方法時议泵,會如何執(zhí)行呢占贫?
interface IProgram { void Fun(); } abstract class AProgram : IProgram { public abstract void AFun(); void IProgram.Fun() { AFun(); } } class Program:AProgram { public override void AFun() { Console.WriteLine("I am AProgram."); } static void Main(string[] args) { IProgram pro =new Program(); pro.Fun(); Console.Read(); } }//結(jié)果:I am Aprogram.
通過斷點,可以看到先口,當(dāng)執(zhí)行pro.Fun();時型奥,首先會跳到接口的實現(xiàn)方法里,然后去調(diào)用抽象函數(shù)的實現(xiàn)方法碉京,當(dāng)抽象函數(shù)的方法實現(xiàn)后厢汹,再回到接口的實現(xiàn)方法,直到執(zhí)行完成谐宙。
當(dāng)我們在實現(xiàn)接口的方法里調(diào)用虛函數(shù)呢烫葬?
interface IProgram { void Fun(); } class AProgram : IProgram { public virtual void AFun() //注意這里是虛函數(shù) { Console.WriteLine("I am virtual AFun."); } void IProgram.Fun() { AFun(); } } class Program:AProgram { public override void AFun() //這里是Override重寫 { Console.WriteLine("I am override AFun."); } static void Main(string[] args) { IProgram pro =new Program(); pro.Fun(); Console.Read(); } }
這時,我們發(fā)現(xiàn),執(zhí)行的順序和上一個例子是相同的搭综。所以結(jié)果為:I am override AFun.由此垢箕,我們可以繼續(xù)聯(lián)想,當(dāng)我們把override關(guān)鍵字兑巾,換成new呢条获?是不是也是同樣的結(jié)果,還是和我們以前講的例子一樣蒋歌,是隱藏呢帅掘?
我們把上面的例子進(jìn)行改進(jìn):
interface IProgram { void Fun(); } class AProgram : IProgram { public virtual void AFun() { Console.WriteLine("I am virtual AFun."); } void IProgram.Fun() { AFun(); } } class Program:AProgram { public new void AFun() { Console.WriteLine("I am new AFun."); } static void Main(string[] args) { Program pro =new Program(); ((IProgram)pro).Fun(); pro.AFun(); Console.Read(); } }
結(jié)果為:
I am virtual AFun.I am new AFun.
由于前面已經(jīng)講過了==,這里不在對此進(jìn)行分析奋姿,由此我們可知使用New關(guān)鍵字是對其進(jìn)行隱藏锄开,當(dāng)對接口實現(xiàn)的方法里調(diào)用的是虛方法時素标,和類的執(zhí)行過程是一樣的称诗。
⑥接口和抽象類的區(qū)別
接口用于規(guī)范,抽象類用于共性头遭。
接口中只能聲明方法寓免,屬性,事件计维,索引器袜香。而抽象類中可以有方法的實現(xiàn),也可以定義非靜態(tài)的類變量鲫惶。
抽象類是類蜈首,所以只能被單繼承,但是接口卻可以一次實現(xiàn)多個欠母。
抽象類可以提供某些方法的部分實現(xiàn)欢策,接口不可以。
抽象類的實例是它的子類給出的赏淌。接口的實例是實現(xiàn)接口的類給出的踩寇。
在抽象類中加入一個方法,那么它的子類就同時有了這個方法六水。而在接口中加入新的方法俺孙,那么實現(xiàn)它的類就要重新編寫(這就是為什么說接口是一個類的規(guī)范了)。
接口成員被定義為公共的掷贾,但抽象類的成員也可以是私有的睛榄、受保護(hù)的、內(nèi)部的或受保護(hù)的內(nèi)部成員(其中受保護(hù)的內(nèi)部成員只能在應(yīng)用程序的代碼或派生類中訪問)想帅。
此外接口不能包含字段场靴、構(gòu)造函數(shù)、析構(gòu)函數(shù)博脑、靜態(tài)成員或常量憎乙。
⑦C#中的接口和類有什么異同
異:
不能直接實例化接口票罐。
接口不包含方法的實現(xiàn)。
接口可以實現(xiàn)多繼承泞边,而類只能是單繼承该押。
類定義可在不同的源文件之間進(jìn)行拆分。
同:
接口阵谚、類和結(jié)構(gòu)可從多個接口繼承蚕礼。
接口類似于抽象基類:繼承接口的任何非抽象類型都必須實現(xiàn)接口的所有成員。
接口可以包含事件、索引器嗡午、方法和屬性囤躁。
一個類可以實現(xiàn)多個接口荔睹。
2.您在什么情況下會用到虛方法或抽象類狸演,接口劝篷?
如果某個方法可能性在派生類中會被重寫。這時就將該方法寫為虛方法仅乓。
抽象類:是一個類型紧显,與派生類之間的關(guān)系是一個“ISA”的關(guān)系。用來做基類郭厌,抽象類不能創(chuàng)建對象袋倔,類中包括抽象方法和實例方法。
接口:是設(shè)計一個規(guī)范折柠,描述了Can do ;與實現(xiàn)類之間是中”LINE A 的關(guān)系批狐,C#中接口不能包含字段訪問修飾符扇售。
3.重載(Overload )和覆寫(Override)的區(qū)別
簡述:簡單的說,一個是同一個函數(shù)的幾種形式,一個是重寫父類函數(shù)嚣艇。
重載:當(dāng)類包含兩個名稱相同但簽名不同(方法名相同,參數(shù)列表不相同)的方法時發(fā)生方法重載承冰。用方法重載來提供在語義上完成相同而功能不同的方法。
覆寫:在類的繼承中使用食零,通過覆寫子類方法可以改變父類虛方法的實現(xiàn)困乒。
區(qū)別:
方法的覆蓋是子類和父類之間的關(guān)系,是垂直關(guān)系贰谣;方法的重載是同一個類中方法之間的關(guān)系娜搂,是水平關(guān)系。
覆蓋只能由一個方法吱抚,或只能由一對方法產(chǎn)生關(guān)系百宇;方法的重載是多個方法之間的關(guān)系。
覆蓋要求參數(shù)列表相同秘豹;重載要求參數(shù)列表不同携御。
覆蓋關(guān)系中,調(diào)用那個方法體,是根據(jù)對象的類型(對象對應(yīng)存儲空間類型)來決定啄刹;重載關(guān)系涮坐,是根據(jù)調(diào)用時的實參表與形參表來選擇方法體的。
4.值類型和引用類型的區(qū)別誓军?寫出C#的樣例代碼膊升。
簡述:值類型包括簡單類型、結(jié)構(gòu)體類型和枚舉類型谭企,引用類型包括自定義類廓译、數(shù)組、接口债查、委托等
賦值方式:將一個值類型變量賦給另一個值類型變量時非区,將復(fù)制包含的值。這與引用類型變量的賦值不同盹廷,引用類型變量的賦值只復(fù)制對象的引用征绸,而不復(fù)制對象本身。
派生:值類型不可能派生出新的類型俄占,所有的值類型均隱式派生自 System.ValueType管怠。但與引用類型相同的是,結(jié)構(gòu)也可以實現(xiàn)接口缸榄。
null:與引用類型不同渤弛,值類型不可能包含 null 值。然而甚带,可空類型功能允許將 null 賦給值類型她肯。
每種值類型均有一個隱式的默認(rèn)構(gòu)造函數(shù)來初始化該類型的默認(rèn)值。值類型主要由兩類組成:結(jié)構(gòu)鹰贵、枚舉
①. 結(jié)構(gòu)分為以下幾類:Numeric(數(shù)值)類型晴氨、整型、浮點型碉输、decimal籽前、bool、用戶定義的結(jié)構(gòu)敷钾。
②. 引用類型的變量又稱為對象枝哄,可存儲對實際數(shù)據(jù)的引用。聲明引用類型的關(guān)鍵字:class闰非、interface膘格、delegate、內(nèi)置引用類型: object财松、string
值類型存貯在棧中瘪贱,而引用類型存貯在動態(tài)的堆中纱控,棧是先進(jìn)先出的有系統(tǒng)管理的空間,而堆是由應(yīng)用程序控制的可隨時申請和釋放該空間菜秦,在Donnet中一般情況下有垃圾收集器處理甜害,他們的不同導(dǎo)致在編程上的不同。例:
using System;using System.Text;class EventDel{ static void Main(string[] args) { StringBuilder a=new StringBuilder();//將StringBuilder的一個首地址傳給a StringBuilder b=a; //將StringBuilder的一個首地址傳給b b.Append("mxh"); Console.WriteLine(a); a=null; Console.WriteLine(b); }}
"a=null"的意思是:a的引用置為空但此時StringBuilder的堆空間并沒有被釋放球昨,因此在此之后尔店,輸出b時,仍然可以輸出mxh
輸出結(jié)果:mxhmxh
5.委托和事件簡述
參考資料 :C# 知識回顧 - 委托 delegate
C# 知識回顧 - 委托 delegate (續(xù))
事件是不是一種委托主慰?
委托是一種安全的函數(shù)指針嚣州,事件是一種消息機制
委托與事件是什么關(guān)系?為什么要使用委托
委托提供了封裝方法的方式,事件是某動作已發(fā)生的說明,事件是建立于委托之上的共螺。
程序運行時同一個委托能夠用來調(diào)用不同的方法该肴,只要改變它的引用方法即可,因此委托調(diào)節(jié)器用的方法不是在編譯時決定的,而是在運行時確定的.
6.Session,ViewState,Application,cookie的區(qū)別?
Session:用于保持狀態(tài)的基于 Web 服務(wù)器的方法。Session 允許通過將對象存儲在Web 服務(wù)器的內(nèi)存中在整個用戶會話過程中保持任何對象藐不。主要用于保持代碼隱藏類中對象的狀態(tài)匀哄。為每個用戶創(chuàng)建的,用于存儲單個用戶,因為他是相對每個用戶的.所以可能來取得在線人數(shù)等。
ViewState:主要用于保持 Web 頁上控件的狀態(tài)雏蛮。當(dāng) Web 頁上的控件被綁定到代碼隱藏類中的對象涎嚼。
Application 用于存儲所有用戶都可視的信息.所以它存儲的是要讓所有用戶共享的一些信息.如總訪問數(shù)等Cache,頁面緩存挑秉。
Cookie:通常我們都把它放在客戶端,也可以存儲在服務(wù)器端法梯。主要用它存儲用戶的個性設(shè)制,和登陸信息。
7.Application,Session,Cookie,ViewState和Cache生命周期
在ASP.NET中衷模,有很多種保存信息的內(nèi)置對象鹊汛,如:Application,Session,Cookie,ViewState和Cache等。下面分別介紹它們的用法和區(qū)別阱冶。
①.Application對象
Application用于保存所有用戶的公共的數(shù)據(jù)信息,如果使用Application對象,一個需要考慮的問題是任何寫操作都要在Application_OnStart事件(global.asax)中完成.盡管使用Application.Lock和Applicaiton.Unlock方法來避免寫操作的同步,但是它串行化了對Application對象的請求,當(dāng)網(wǎng)站訪問量大的時候會產(chǎn)生嚴(yán)重的性能瓶頸.因此最好不要用此對象保存大的數(shù)據(jù)集合. 下面我們做個在線用戶統(tǒng)計的例子來說明這個問題:
Global.asax類 代碼using System;using System.Collections;using System.ComponentModel;using System.Web;using System.Web.SessionState;using System.IO; /// Global 的摘要說明。 public class Global : System.Web.HttpApplication { /// 必需的設(shè)計器變量滥嘴。 private System.ComponentModel.IContainer components = null; private FileStream fileStream; private StreamReader reader;//讀字符流 private StreamWriter writer;//寫字符流 public Global() { InitializeComponent(); } protected void Application_Start(Object sender, EventArgs e) { Application["CurrentGuests"]=0;//初始花為0木蹬; fileStream = File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate);//文件不存在,創(chuàng)建文件 reader = new StreamReader(fileStream);//要讀取的完整路徑 Application["AllGuests"] = Convert.ToInt32(reader.ReadLine()); //從當(dāng)前流中讀取一行字符并將數(shù)據(jù)作為字符串返回 reader.Close();//關(guān)閉流 } protected void Session_Start(Object sender, EventArgs e)//當(dāng)用戶訪問網(wǎng)站時若皱,在線用戶+1镊叁,總訪問數(shù)+1 { Application.Lock();//同步,避免同時寫入 Application["CurrentGuests"] =(int)Application["CurrentGuests"]+ 1;//總在線用戶數(shù) Application["AllGuests"] =(int)Application["AllGuests"]+ 1;//訪問網(wǎng)站的總用戶數(shù) fileStream = new FileStream(Server.MapPath("counts.text"),FileMode.OpenOrCreate,FileAccess.ReadWrite);// writer = new StreamWriter(fileStream);//實現(xiàn)一個寫入流,使其以一種特定的編碼向流中寫入字符 writer.WriteLine(Application["AllGuests"].ToString());//把訪問網(wǎng)站的總用戶數(shù)再次寫入到文件 writer.Close();//關(guān)閉寫入流 Application.UnLock();//同步結(jié)束 } protected void Session_End(Object sender, EventArgs e)//當(dāng)前用戶退出網(wǎng)站時,在線用戶數(shù)量-1, { Application.Lock(); Application["CurrentGuests"] =(int)Application["CurrentGuests"] - 1;//總在線用戶數(shù)量-1 Application.UnLock(); } (2) WebForm1.aspx private void Page_Load(object sender, System.EventArgs e) { this.Label1.Text = "正在訪問站點的用戶數(shù):" + Application["CurrentGuests"].ToString(); this.Label2.Text ="訪問過站點的總用戶數(shù):" + Application["AllGuests"].ToString(); }
②.Session對象
Session用于保存每個用戶的專用信息.每個客戶端用戶訪問時走触,服務(wù)器都為每個用戶分配一個唯一的會話ID(Session ID) . 她的生存期是用戶持續(xù)請求時間再加上一段時間(一般是20分鐘左右).Session中的信息保存在Web服務(wù)器內(nèi)容中,保存的數(shù)據(jù)量可大可小.當(dāng)Session超時或被關(guān)閉時將自動釋放保存的數(shù)據(jù)信息.由于用戶停止使用應(yīng)用程序后它仍然在內(nèi)存中保持一段時間,因此使用Session對象使保存用戶數(shù)據(jù)的方法效率很低.對于小量的數(shù)據(jù),使用Session對象保存還是一個不錯的選擇.使用Session對象保存信息的代碼如下:
//存放信息Session["key"]="value"http://讀取數(shù)據(jù)string UserName=Session["key"].ToString();
③.Cookie對象
Cookie用于保存客戶瀏覽器請求服務(wù)器頁面的請求信息,程序員也可以用它存放非敏感性的用戶信息晦譬,信息保存的時間可以根據(jù)需要設(shè)置.如果沒有設(shè)置Cookie失效日期,它們僅保存到關(guān)閉瀏覽器程序為止.如果將Cookie對象的Expires屬性設(shè)置為Minvalue,則表示Cookie永遠(yuǎn)不會過期.Cookie存儲的數(shù)據(jù)量很受限制,大多數(shù)瀏覽器支持最大容量為4K,因此不要用來保存數(shù)據(jù)集及其他大量數(shù)據(jù).由于并非所有的瀏覽器都支持Cookie,并且數(shù)據(jù)信息是以明文文本的形式保存在客戶端的計算機中,因此最好不要保存敏感的,未加密的數(shù)據(jù),否則會影響網(wǎng)站的安全性.使用Cookie對象保存的代碼如下:
//存放信息Response.Cookies["key"].Value="value";//讀取信息string UserID=Response.Cookies["key"].Value;
④.ViewState對象
ViewState 常用于保存單個用戶的狀態(tài)信息,有效期等于頁面的生存期互广。跟隱藏控件相似敛腌。viewstate是在本頁面之內(nèi)各函數(shù)間進(jìn)行傳值的 , 至于為什么要使用這種方法是因為在一個事件發(fā)生之后 , 頁面可能會刷新 , 如果定義全局變量會被清零 , 所以要使用viewstate. ViewState容器可以保持大量的數(shù)據(jù)卧土,但是必須謹(jǐn)慎使用,因為過多使用會影響應(yīng)用程序的性能像樊。所有Web服務(wù)器控件都使用ViewState在頁面回發(fā)期音保存自己的狀態(tài)信息尤莺。如果某個控件不需要在回發(fā)期間保存狀態(tài)信息,最好關(guān)閉該對象的ViewState,避免不必要的資源浪費生棍。通過給@Page指令添加“EnableViewState=false”屬性可以禁止整個頁面的ViewState颤霎。使用ViewState對象保存信息的代碼如下。
//存放信息 ViewState["key"]="value"; //讀取信息 string NameID=ViewState["nameID"].ToString();
⑤.Cache對象
Cache對象用于在HTTP請求間保存頁面或數(shù)據(jù)涂滴。該對象的使用可以極大地提高整個應(yīng)用程序的效率友酱。常用于將頻繁訪問的大量服務(wù)器資源存儲在內(nèi)存中,當(dāng)用戶發(fā)出相同的請求后服務(wù)器不再次處理而是將Cache中保存的信息返回給用戶柔纵,節(jié)省了服務(wù)器處理請求的時間缔杉。其生存期依賴于該應(yīng)用程序的生存期。當(dāng)重新啟動應(yīng)用程序時首量,將重新創(chuàng)建其Cache對象的實例壮吩。使用Cache對象保存信息的代碼如下。
//存放信息 Cache["nameID"]="0001"; //存放信息 Cache.Insert("nameID","0001"1); //讀取信息 string NameID=Cache["nameID"].ToString();
⑥.隱藏域
Hidden控件是屬于HTML類型的服務(wù)器控件加缘,使用此控件可以實現(xiàn)隱藏域的功能鸭叙。其實此控件和其它服務(wù)器控件的使用沒有太大區(qū)別,只是它不會在用戶端的瀏覽器中顯示拣宏,始終處于隱藏狀態(tài)沈贝。但是每次頁面提交的時候,此控件和其它服務(wù)器控件一同提交到服務(wù)器端勋乾,因此在服務(wù)器端可以使用Value屬性獲取或保存一些數(shù)據(jù)信息宋下。使用Hidden控件保存信息的代碼如下。
//存放信息 Hidden.Value="0001"; //獲取信息 string NameID=Hidden.Value;
⑦.查詢字符串
查詢字符串的方式是將要傳遞的值連接在URL后面辑莫,然后通過Response.Redirect方法實現(xiàn)客戶端的重定向学歧。這種方式可以實現(xiàn)在兩個頁面之間傳遞信息。由于URL的長度有一定的限制各吨,因此不能傳遞太大的信息枝笨,加外安全性也不是很好。傳遞信息如下揭蜒。問號后面格式 key1=value1&key2=value2
Response.Redirect("List.aspx?nameID=0001&gradeID=002"); //執(zhí)行上面的語句后在IE地址欄顯示的URL的代碼如下桥言。 http://localhost/List.aspx?nameID=0001&grade=002 //當(dāng)跳轉(zhuǎn)到List.aspx后宽闲,可以通過以下代碼獲得所傳遞的信息。 string NameID.GradeID;
8.ajax原理
簡述: Ajax的原理就是:通過javascript的方式,將前臺數(shù)據(jù)通過xmlhttp對象傳遞到后臺弯汰,后臺在接收到請求后跷坝,將需要的結(jié)果锌历,再傳回到前臺,這樣就可以實現(xiàn)不需要頁面的回發(fā)树绩,頁是數(shù)據(jù)實現(xiàn)來回傳遞,從頁實現(xiàn)無刷新脚猾。
Ajax的原理簡單來說葱峡,實際上就是通過XmlHttpRequest對象來向服務(wù)器發(fā)異步請求,從服務(wù)器獲得數(shù)據(jù)龙助,然后用javascript來操作DOM而更新頁面砰奕。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請求數(shù)據(jù)。要清楚這個過程和原理提鸟,我們必須對 XMLHttpRequest有所了解军援。
總結(jié):我們可以看出,XMLHttpRequest對象完全用來向服務(wù)器發(fā)出一個請求的称勋,它的作用也局限于此胸哥,但它的作用是整個ajax實現(xiàn)的關(guān)鍵,我們可以把服務(wù)器端看成一個數(shù)據(jù)接口赡鲜,它返回的是一個純文本流空厌,當(dāng)然,這個文本流可以是XML格式银酬,可以是Html嘲更,可以是Javascript代碼,也可以只是一個字符串揩瞪。這時候赋朦,XMLHttpRequest向服務(wù)器端請求這個頁面,服務(wù)器端將文本的結(jié)果寫入頁面李破,這和普通的web開發(fā)流程是一樣的宠哄,不同的是,客戶端在異步獲取這個結(jié)果后嗤攻,不是直接顯示在頁面毛嫉,而是先由javascript來處理,然后再顯示在頁面妇菱。
9.請敘述屬性與索引器的區(qū)別
屬性
索引器
通過名稱標(biāo)識
通過簽名標(biāo)識
通過簡單名稱或成員訪問來訪問
通過元素訪問來訪問
可以為靜態(tài)成員或?qū)嵗蓡T
必須為實例成員
屬性的get訪問器沒有參數(shù)
索引器的get訪問器具有與索引器相同的形參表
屬性的set訪問器包含隱式value參數(shù)器
除了value參數(shù)外狱庇,索引的 set 訪問器還具有與索引器相同的形參表
10.String類與StringBuilder類有什么區(qū)別?為啥在.Net類庫中要同時存在這2個類恶耽?
如果要操作一個不斷增長的字符串,盡量不用String類,改用StringBuilder類
String類原理:String類是一種傳統(tǒng)的修改字符串的方式颜启,它確實可以完成把一個字符串添加到另一個字符串上的工作沒錯,但是在.NET框架下偷俭,這個操作實在是劃不來。因為系統(tǒng)先是把兩個字符串寫入內(nèi)存缰盏,接著刪除原來的String對象涌萤,然后創(chuàng)建一個String對象淹遵,并讀取內(nèi)存中的數(shù)據(jù)賦給該對象。這一來二去的负溪,耗了不少時間透揣。
StringBulider原理:而使用 System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法川抡,能夠在已有對象的原地進(jìn)行字符串的修改辐真,簡單而且直接。
提醒:一般情況下覺察不到這二者效率的差異崖堤,但如果你要對某個字符串進(jìn)行大量的添加操作侍咱,那么StringBuilder類所耗費的時間和 String類簡直不是一個數(shù)量級的
11.淺談C#中的枚舉
枚舉類型是一種的值類型,它用于聲明一組命名的常數(shù)密幔。
①.枚舉的聲明:枚舉聲明用于聲明新的枚舉類型楔脯。
訪問修辭符 enum 枚舉名:基礎(chǔ)類型 { 枚舉成員 }
基礎(chǔ)類型必須能夠表示該枚舉中定義的所有枚舉數(shù)值。枚舉聲明可以顯式地聲明 byte胯甩、sbyte昧廷、short、ushort偎箫、int木柬、uint、long 或 ulong 類型作為對應(yīng)的基礎(chǔ)類型镜廉。沒有顯式地聲明基礎(chǔ)類型的枚舉聲明意味著所對應(yīng)的基礎(chǔ)類型是 int弄诲。
②.枚舉成員
枚舉成員是該枚舉類型的命名常數(shù)。任意兩個枚舉成員不能具有相同的名稱娇唯。每個枚舉成員均具有相關(guān)聯(lián)的常數(shù)值齐遵。此值的類型就是枚舉的基礎(chǔ)類型。每個枚舉成員的常數(shù)值必須在該枚舉的基礎(chǔ)類型的范圍之內(nèi)塔插。
public enum TimeofDay:uint { Morning=-3, Afternoon=-2, Evening=-1 }
產(chǎn)生編譯時錯誤梗摇,原因是常數(shù)值 -1、-2 和 –3 不在基礎(chǔ)整型 uint 的范圍內(nèi)想许。
③.枚舉成員默認(rèn)值
在枚舉類型中聲明的第一個枚舉成員它的默值為零伶授。以后的枚舉成員值是將前一個枚舉成員(按照文本順序)的值加 1 得到的。這樣增加后的值必須在該基礎(chǔ)類型可表示的值的范圍內(nèi)流纹;否則糜烹,會出現(xiàn)編譯時錯誤。
示例: public enum TimeofDay:uint { Morning, Afternoon, Evening }
Morning的值為0,Afternoon的值為1,Evening的值為2漱凝。
④.為枚舉成員顯示賦值
允許多個枚舉成員有相同的值疮蹦。沒有顯示賦值的枚舉成員的值,總是前一個枚舉成員的值+1
public enum Number { a=1, b, c=1, d }
b的值為2,d的值為2.注意:以上枚舉值都不能超過它的基礎(chǔ)類型范圍茸炒。否則會報錯.
⑤.枚舉類型與基礎(chǔ)類型的轉(zhuǎn)換
基礎(chǔ)類型不能隱式轉(zhuǎn)換為枚舉類型愕乎; 枚舉類型也不能隱式轉(zhuǎn)換為基礎(chǔ)類型
public enum Number { a, b, c, d } class Test { public static void Main() { int i=Number.a;//錯誤阵苇,要強制類型轉(zhuǎn)換(int)Number.a Number n; n=2 //錯誤,要強制類型轉(zhuǎn)換(Number)2 } }
⑥.System.Enum類型
System.Enum 類型是所有枚舉類型的抽象基類,并且從 System.Enum 繼承的成員在任何枚舉類型中都可用。
System.Enum 本身不是枚舉類型感论。相反绅项,它是一個類類型,所有枚舉類型都是從它派生的比肄。
System.Enum 從類型 System.ValueType派生
⑦.使用枚舉類型
using System; public enum TimeofDay { Morning, Afternoon, Evening } class Test { static void WriteGreeting(TimeofDay timeofDay) { switch(timeofDay) { case TimeofDay.Morning: Console.WriteLine("good morning"); break; case TimeofDay.Afternoon: Console.WriteLine("good afternoon"); break; case TimeofDay.Evening: Console.WriteLine("good evening"); break; } } static void Main() { WriteGreeting(TimeofDay.Morning); WriteGreeting(TimeofDay.Evening); WriteGreeting(TimeofDay.Afternoon); } }
12.C#的New關(guān)鍵字的幾種用法
①.new運算符:用于創(chuàng)建對象和調(diào)用構(gòu)造函數(shù)快耿。
用于創(chuàng)建對象和調(diào)用構(gòu)造函數(shù) 例:Class_Test MyClass=new Class_Test();
也用于為值類型調(diào)用默認(rèn)的構(gòu)造函數(shù)
例:int myInt=new int();
myInt初始化為0,它是int類型的默認(rèn)值薪前。該語句的效果等同于:intmyInt=0;
不能重載new運算符润努;
如果new運算符分配內(nèi)存失敗,則它將引發(fā)OutOfMemoryException異常示括。
②.new修飾符
使用new修飾符顯式隱藏從基類繼承的成員铺浇。若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員垛膝,并用new修飾符修飾它鳍侣。
請看下面的類:
public class MyClass { public int x; public void Invoke(){} }
在派生類中用Invoke名稱聲明成員會隱藏基類中的Invoke方法,即:
public class MyDerivedC:MyClass { new public void Invoke(){} }
但是吼拥,因為字段x不是通過類似名隱藏的倚聚,所以不會影響該字段。
通過繼承隱藏名稱采用下列形式之一:
1.引入類或結(jié)構(gòu)中的常數(shù)凿可、指定惑折、屬性或類型隱藏具有相同名稱的所有基類成員。
2.引入類或結(jié)構(gòu)中的方法隱藏基類中具有相同名稱的屬性枯跑、字段和類型惨驶。同時也隱藏具有相同簽名的所有基類方法。
3.引入類或結(jié)構(gòu)中的索引器將隱藏具有相同名稱的所有基類索引器敛助。
4.在同一成員上同時使用new和override是錯誤的粗卜。
注意:在不隱藏繼承成員的聲明中使用new修飾符將生成警告。
示例:在該例中纳击,嵌套類MyClass隱藏了基類中具有相同名稱的類续扔。該例不僅說明了如何使用完全限定名訪問隱藏類成員,同時也說明了如何使用new修飾符消除警告消息焕数。
using System; public class MyBaseC{public class MyClass{public int x=200;public int y;}}public class MyDerivedC:MyBaseC{new public class MyClass //nestedtypehidingthebasetypemembers{public int x=100;public int y;public int z;}public static void Main(){//Creating object from the overlapping class:MyClass S1=new MyClass();//Creating object from the hidden class:MyBaseC.MyClass S2=new MyBaseC.MyClass();Console.WriteLine(S1.x);Console.WriteLine(S2.x);}
輸出:100200
③.new約束:用于在泛型聲明中約束可能用作類型參數(shù)的參數(shù)的類型纱昧。