.NET 面試題匯總(二)

目錄
本次給大家介紹的是我收集以及自己個人保存一些.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ù)的類型纱昧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堡赔,隨后出現(xiàn)的幾起案子砌些,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件存璃,死亡現(xiàn)場離奇詭異,居然都是意外死亡雕拼,警方通過查閱死者的電腦和手機纵东,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啥寇,“玉大人偎球,你說我怎么就攤上這事〖穑” “怎么了衰絮?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長磷醋。 經(jīng)常有香客問我猫牡,道長,這世上最難降的妖魔是什么邓线? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任淌友,我火速辦了婚禮,結(jié)果婚禮上骇陈,老公的妹妹穿的比我還像新娘震庭。我一直安慰自己,他們只是感情好你雌,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布器联。 她就那樣靜靜地躺著,像睡著了一般婿崭。 火紅的嫁衣襯著肌膚如雪拨拓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天逛球,我揣著相機與錄音千元,去河邊找鬼。 笑死颤绕,一個胖子當(dāng)著我的面吹牛幸海,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奥务,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼物独,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氯葬?” 一聲冷哼從身側(cè)響起挡篓,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后官研,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秽澳,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年戏羽,在試婚紗的時候發(fā)現(xiàn)自己被綠了担神。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡始花,死狀恐怖妄讯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酷宵,我是刑警寧澤亥贸,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站浇垦,受9級特大地震影響炕置,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溜族,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一讹俊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煌抒,春花似錦仍劈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至况既,卻和暖如春这溅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棒仍。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工悲靴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莫其。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓癞尚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乱陡。 傳聞我的和親對象是個殘疾皇子浇揩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法憨颠,內(nèi)部類的語法胳徽,繼承相關(guān)的語法积锅,異常的語法,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • (一)Java部分 1养盗、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,101評論 0 62
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理缚陷,服務(wù)發(fā)現(xiàn),斷路器爪瓜,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 1. [C#語言基礎(chǔ)]請簡述拆箱和裝箱蹬跃。 答: 裝箱操作: 值類型隱式轉(zhuǎn)換為object類型或由此值類型實現(xiàn)的任何...
    胤醚貔貅閱讀 4,800評論 1 29
  • 1、一個".java"源文件中是否可以包括多個類(不是內(nèi)部類)铆铆?有什么限制?答:可以有多個類丹喻,但只能有一個publ...
    岳小川閱讀 927評論 0 2