.NET筆試題集(五)


1.什么是受管制的代碼? 

答:unsafe:非托管代碼。不經過CLR運行。

 

2.net Remoting 的工作原理是什么? 
答:服務器端向客戶端發送一個進程編號,一個程序域編號,以確定對象的位置。

 

3.O/R Mapping 的原理 
答:利用反射,配置將對象和數據庫表映射。

 

4.remoting和webservice兩項技術的理解以及實際中的應用。 
答:WS主要是可利用HTTP,穿透防火牆。而Remoting可以利用TCP/IP,二進制傳送提高效率。

 

5.out保留字怎么使用,什么時候使用。
答:有時為了從一個函數中返回多個值,我們需要使用out關鍵字,把輸出值賦給通過引用傳遞給方法的變量(也就是參數)。但C#要求變量再被引用的前必須初始化。在調用該方法時,還需要添加out關鍵字。

 

6.PDB是什么東西? 在調試中它應該放在哪里?

答:PDB是用於保存調試和項目狀態信息的文件,在debug的時候將產生pdb文件,調試的時候應該放在和對應應用程序集相同目錄。

 

7.使用ASMX的XML Web服務與使用SOAP的.NET Remoting的區別?

答:Web服務使用的消息機制,而Remoting采用的RPC. Web Service能用於不同平台,不同語言,Remoting只適用於.Net。效率上Remoting高於Xml Web Service。

 

8.從概念上闡述前期綁定(early-binding)和后期綁定(late-binding)的區別?

這個就像是強弱類型的比較相似,前期綁定是在編譯的時候就確定了要綁定的數據,而后期綁定是在運行的時候才填充數據。所以前期綁定如果失敗,會在編譯時報編譯錯誤,而后期綁定失敗只有在運行時的時候才發生。

 

9.概述反射和序列化

反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然后,可以調用類型的方法或訪問其字段和屬性。

序列化:序列化是將對象轉換為容易傳輸的格式的過程。例如,可以序列化一個對象,然后使用 HTTP 通過 Internet 在客戶端和服務器之間傳輸該對象。在另一端,反序列化將從該流重新構造對象。

 

10.XmlSerializer是如何工作的?使用這個類的進程需要什么ACL權限?

我只知道XmlSerializer是將對象的屬性和字段進行序列化和反序列化的,序列化成為xml數據,反序列化再將xml轉換成對象。應該至少需要ACL權限中的讀權限.

 

11.XmlSerializer使用的針對屬性的模式有什么好處?解決了什么問題?

只序列化有用的數據,而不是序列化整個對象。實現沒必要的數據冗余,和提升序列化時的性能。

 

12.SQLSERVER服務器中,給定表 table1 中有兩個字段 ID、LastUpdateDate,ID表示更新的事務號,LastUpdateDate表示更新時的服務器時間,請使用一句SQL語句獲得最后更新的事務號

答:Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

 

13.在對象比較中,對象一致和對象相等分別是指什么?a.Equals(b)和a == b一樣嗎?

對象一致是指兩個對象是同一個對象,引用相同。而對象相等是指兩個對象的值相同,但引用不一定相同。

不一樣。a.Equals(b)表示a與b一致, a==b表示a與b的值相等。

 

14.請解釋一下IClonable

IClonable方法是實現深度復制的接口,實現它應該能深度復制一個對象出來。深度復制的特征的調用對象的構造方法,創建新的對象,包括創建對象中嵌套的引用對象的新實例。而Shadow復制則不同,是淺表復制,不重新創建新實例。淺表復制的實現是Object.MemberWiseClone().

深度復制(Deep Copy)與淺表復制(Shadow Copy)的比較 

View Code
public class Name 
    { 
        public string FirstName; 
        public string LastName; 
    } 
    public class Person:ICloneable 
    { 
        public Name PersonName; 
        public string Email; 
        /**//// <summary> 
        /// Deep Copy的例子 
        /// </summary> 
        /// <returns></returns> 
        public Object Clone() 
        { 
            Person p = new Person(); 
            p.Email = this.Email; 
            p.PersonName = new Name(); 
            p.PersonName.FirstName = this.PersonName.FirstName; 
            p.PersonName.LastName = this.PersonName.LastName; 
            return p; 
        }

        public void ChangLastName(string lastName) 
        { 
            this.PersonName.LastName = lastName; 
        } 
        public static void Main() 
        { 
            Person p = new Person(); 
            p.PersonName = new Name(); 
            p.PersonName.LastName = "jill"; 
            p.PersonName.FirstName = "zhang"; 
            p.Email = "jillzhang@126.com"; 
            Person sameNamePerson = p.Clone() as Person; 
            sameNamePerson.ChangLastName("clr_"); 
            Console.WriteLine(p.PersonName.LastName); 
            Console.WriteLine(sameNamePerson.PersonName.LastName);           

            Person samePerson = p.MemberwiseClone() as Person; 
            samePerson.ChangLastName("Shadow");

            Console.WriteLine(p.PersonName.LastName); 
            Console.WriteLine(sameNamePerson.PersonName.LastName); 
            Console.Read(); 
        } 
    }

 

15.特性能夠放到某個方法的參數上?如果可以,這有什么用?

可以,作用可以對參數有進一步限定,比如輸入參數為int類型,可以通過允許AttributeTargets=ParameterInfo的Attribute自定義實現來限定輸入參數的大小,比如當輸入參數小於100的時候便報錯。對方法的參數設置Attribute的例子

View Code
  [AttributeUsage(AttributeTargets.Parameter)] 
    public class ParameterAtt : Attribute 
    { 
        public int Min = 100; 
    }

    public class AttributeTest 
    {       
        public void TestMethod([ParameterAtt(Min = 100)] int par1) 
        { 
            ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0]; 
            ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as ParameterAtt; 
            if (att.Min > par1) 
            { 
                throw new Exception("要求para1最小為" + att.Min); 
            } 
        } 
    }

 

16.WEB控件可以激發服務端事件,請談談服務端事件是怎么發生並解釋其原理?自動傳回是什么?為什么要使用自動傳回。 

在web控件發生事件時,客戶端采用提交的形式將數據交回服務端,服務端先調用Page_Load事件,然后根據傳回的狀態信息自動調用服務端事件自動傳回,當我們在點擊客戶端控件時,采用提交表單的形式將數據直接傳回到務端 只有通過自動傳回才能實現服務端事件的機制,如果沒有自動回傳機制就只能調用客戶端事件,而不能調用服務端事件。

 

17.請解釋web.config文件中的重要節點 
appSettings包含自定義應用程序設置。 
system.web 系統配置 
compilation動態調試編譯設置 
customErrors自定義錯誤信息設置 
authentication身份驗證,此節設置應用程序的身份驗證策略 
authorization授權, 此節設置應用程序的授權策略

 

18.請解釋什么是上下文對象,在什么情況下要使用上下文對象 
上下文對象是指HttpContext類的Current 屬性,當我們在一個普通類中要訪問內置對象(Response,Request,Session,Server,Appliction等)時就要以使用此對象

 

19. 幾十上百萬行,如何快速查詢出表數據 

答:用分頁存儲過程 

View Code
/* 
  函數名稱: GetRecordFromPage 
  函數功能: 獲取指定頁的數據 
  參數說明: @tblName      包含數據的表名 
           @fldName      關鍵字段名 
           @PageSize     每頁記錄數 
           @PageIndex    要獲取的頁碼 
           @OrderType    排序類型, 0 - 升序, 1 - 降序 
           @strWhere     查詢條件 (注意: 不要加 where) 
*/ 
CREATE PROCEDURE GetRecordFromPage 
    @tblName      varchar(255),       -- 表名 
    @fldName      varchar(255),       -- 字段名 
    @PageSize     int = 10,           -- 頁尺寸 
    @PageIndex    int = 1,            -- 頁碼 
    @OrderType    bit = 0,            -- 設置排序類型, 非 0 值則降序 
    @strWhere     varchar(2000) = ''  -- 查詢條件 (注意: 不要加 where) 
AS

declare @strSQL   varchar(6000)       -- 主語句 
declare @strTmp   varchar(1000)       -- 臨時變量 
declare @strOrder varchar(500)        -- 排序類型

if @OrderType != 0 
begin 
    set @strTmp = '<(select min' 
    set @strOrder = ' order by [' + @fldName + '] desc' 
end 
else 
begin 
    set @strTmp = '>(select max' 
    set @strOrder = ' order by [' + @fldName +'] asc' 
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 
    + @strOrder

if @strWhere != '' 
    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
        + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 
        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1 
begin 
    set @strTmp = '' 
    if @strWhere != '' 
        set @strTmp = ' where (' + @strWhere + ')'

    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + ']' + @strTmp + ' ' + @strOrder 
end

exec (@strSQL)

GO

 

20.數據庫查詢優化: 
1、多態性,多種數據庫兼容; 

2、支持翻頁,支持查詢總數,頁碼顯示; 
3、能處理100萬以上數據量; 
答: 

View Code
CREATE   PROCEDURE   dbo.LSP_SP_SelectElementByPage       
  @SelectFields   varchar(200),/*要查詢的字段列表*/   
  @Condition   varchar(300),/*查詢條件*/   
  @PageSize   int   =20,/*頁面大小,默認為20*/   
  @PageNumber   int   =1/*頁號,默認為第一頁*/   
  /*@PageCount   int   out返回滿足條件的總頁數*/   
  AS   
  begin   
  declare   @count   int   
  select   @count   =count(*)   from   lsp_t_elementInfo   
  if(@count   %@PageSize=0)   
  set   @count   =   @count/@PageSize   
  else   
  set   @count   =   @count/@PageSize   +1   
  select   @count   PageCount   
  select   IDENTITY(int,1,1)   as   iid,ElementName,Type   into   #temptable   from   LSP_T_ElementInfo   
  select     *   from   #temptable   where   iid   between     @PageSize   *   (@PageNumber   -1)   and   @PageSize   *   @PageNumber   
  end   
  GO

 

21.兩個表,寫查詢語句,根據兩個字段一個是升序,一個將序。 

答:select * from a,b where a.字段1 = b.字段1 order by a.字段2 asc,b.字段2 desc

 

22.一個長度為10000的字符串,通過隨機從a-z中抽取10000個字符組成。請用c#語言編寫主要程序來實現。 

View Code
       using System.Text; 
StringBuilder sb = new StringBuilder(0, 10000); 
        string strABC = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"; 
        string[] ABC = strABC.Split(','); 
        int len = ABC.Length; 
        Random rd = new Random(); 
        for (int i = 0; i < 10000; i++) 
        { 
            sb.Append(ABC[rd.Next(len)]); 
        }

 

23.產生一個int數組,長度為100,並向其中隨機插入1-100,並且不能重復。 

View Code
int[] intArr=new int[100]; 
ArrayList myList=new ArrayList(); 
Random rnd=new Random(); 
while(myList.Count<100) 
{ 
int num=rnd.Next(1,101); 
if(!myList.Contains(num)) 
myList.Add(num); 
} 
for(int i=0;i<100;i++) 
intArr[i]=(int)myList[i];

 

24.用C#寫一段選擇排序算法,要求用自己的編程風格。 

View Code
    private int min; 
    public void xuanZhe(int[] list)//選擇排序 
    { 
        for (int i = 0; i < list.Length - 1; i++) 
        { 
            min = i;
            for (int j = i + 1; j < list.Length; j++) 
            { 
                if (list[j] < list[min])

                    min = j;

            }
            int t = list[min];

            list[min] = list[i];

            list[i] = t;

        } 
    }

 

25.寫一個函數計算當參數為N的值:1-2+3-4+5-6+7……+N 

View Code
    public int returnSum(int n) 
    { 
        int sum = 0; 
        for (int i = 1; i <= n; i++) 
        { 
            int k = i; 
            if (i % 2 == 0) 
            { 
                k = -k; 
            } 
            sum = sum + k; 
        } 
        return sum; 
    }

    public int returnSum1(int n) 
    { 
        int k = n; 
        if (n == 0) 
        { 
            return 0; 
        } 
        if (n % 2 == 0) 
        { 
            k = -k; 
        } 
        return aaa(n - 1) + k; 
    }

 

26.頁面生命周期?

頁面生命周期執行一系列步驟:頁面的初始化、實例化控件、還原和維護狀態、運行事件處理程序代碼、呈現。為了在合適的階段執行所需的代碼,所以要對頁面生命周期非常熟悉。在頁生命周期的各個階段,頁面會逐個引發定義的事件,通過對代碼開發,在頁面的生命事件中執行我們所需要的程序;

27.頁生命周期階段?

1、頁請求:發生在頁面生命周期之前,用戶請求頁時,ASP.NET 將確定是否需要分析和編譯頁,從而確定是否開始頁面的生命周期,或者是否可以在不運行頁面的情況下發送頁面緩存以進行響應;
2、開始:設置頁屬性,如:HttpContext 以及其他屬性;在此階段,頁面需要確定是回發請求還是新請求,並設置 IsPostBack 屬性;設置頁面的 UICulture 屬性;
3、頁面初始化:加載所有主題;控件生成,並設置 UniqueID;
注:ViewState、ControlState中的值還未加載至控件;如果頁面是回發,則回發數據也還未加載;故此時控件可以訪問,但值可能出錯;
4、加載:如果當前請求是回發請求,則為控件加載 ViewState 和 ControlState 中的值;
5、驗證:調用所有驗證程序控件的 Validate 方法,此方法將設置驗證程序控件和頁的 IsValid 屬性;
6、回發事件處理:如果請求是回發請求,則調用所有事件處理程序;
7、呈現:首先對該頁和所有控件進行保存視圖狀態,然后對每個控件調用 Render 方法,它會提供一個文本編寫器,用於將控件的輸入寫入頁的 Response 屬性的 OutputStream 中;
8、卸載:完成呈現,並已將頁發送至客戶端、准備丟棄該頁后,調用卸載。將卸載屬性如:Response和Request等等;

28.
生命周期事件?大概描述一下ASP.NET服務器控件的生命周期?

1、PreInit
完成操作:檢查IsPostBack屬性來確定是不是第一次處理該頁;創建或重新創建動態控件;動態設置主控頁;動態設置Theme屬性;讀取或設置配置文件屬性;
注:如果請求是回發請求,則控件的值尚未從視圖狀態恢復,即:不應該在此事件中設置控件屬性。
2、Init
完成操作:在所有控件都已經初始化並且應用所有外觀設置后引發。使用該事件來讀取和初始化控件屬性;
3、InitComplete
完成操作:由Page對象引發,使用該事件來處理要求完成所有初始化工作的任務;
4、PreLoad
完成操作:為頁和所有控件加載視圖狀態,然后處理 Request 實例包括的任何回發數據;
注:如果需要在Load之前對頁或控件進行處理,需要該事件;
5、Load
完成操作:以遞歸方式加載所有控件;
6、控件事件
完成操作:處理控件引發的事件;
注:在回發請求中,如果頁包含驗證程序控件,請在執行任何處理之前檢查Page和各個驗證控件的IsValid屬性;
7、LoadComplete
8、PreRender
在控件輸出前最后的修改機會;
注:在該事件發生前的操作:Page對所有控件遞歸進行EnsureChildControl操作、設置了DataSourceID屬性的數據綁定控件會調用DataBind方法;
9、SaveStateComplete
在該事件發生前,已經對控件的ViewState進行了保存。
10、Render
11、UnLoad
服務器控件的生命周期初始化、加載視圖狀態、處理回發數據、加載、發送回發更改通知、處理回發事件、預呈現、保存狀態、呈現、處置、卸載;

29.應用程序生命周期?

在應用程序的生命周期期間,應用程序會引發可處理的事件並調用可重寫的特定方法。若要處理應用程序事件或方法,可以在應用程序根目錄中創建一個名為 Global.asax 的文件。如果創建了 Global.asax文件,ASP.NET 會將其編譯為從 HttpApplication 類派生的類,然后使用該派生類表示應用程序;
HttpApplication 進程的一個實例每次只處理一個請求。由於在訪問應用程序類中的非靜態成員時不需要將其鎖定,這樣可以簡化應用程序的事件處理過程。這樣還可以將特定於請求的數據存儲在應用程序類的非靜態成員中。例如,可以在 Global.asax 文件中定義一個屬性,然后為該屬性賦一個特定於請求的值;
Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在應用程序域的生命周期期間,ASP.NET 僅調用這些方法一次,而不是對每個 HttpApplication 實例都調用一次;


30.ASP.NET 頁面在什么時候產生?又在什么時候銷毀?

1、Page_Init() —— 初始化對象
這一過程主要是初始化包括頁面本身的所有控件,每次的頁面載入就會執行一次初試過程,而在這里面訪問到的也是控件的初始值。還有就是可以通過OnInit()來重載初試化事件;
2、LoadViewState() —— 導入ViewState數據
在初試化事件后,在 LoadViewState 事件中所有控件將獲得他們的第一個屬性 ViewState 屬性,這個屬性最終將被返回給服務器以判斷這個頁面是已經被用戶訪問完畢還是仍然在被用戶所訪問。也可重 LoadViewState 事件對相應的控件進行值設定;
3、LoadPostData() —— 用 LoadPostData 處理 Postback 數據
Postback數據也可以理解成就是服務器頁面提交的表單數據,每一次表單數據的提交都會觸發執行 IPostBackDataHandler 接口操作的控件;
4、Page_Load() —— 導入對象
這個過程就比較熟悉了,也是在頁面的每次載入時一定會執行,但是注意和 PageInit() 之間的區別,所有的對象第一次被布置在 DOM 頁面(在ASP.NET中稱控件樹)里了並且可以通過代碼或是相關的位置被引用。這樣,對象就可以很容易的從客戶端獲得諸如寬度、高度、值、可見性等在 HTML中的屬性值。經常會用到的Page.IsPostBack()指示該頁是否正為響應客戶端回發而加載,或者它是否正被首次加載和訪問;
5、Handle Control Events —— 具體的控件事件
這個過程執行的是相應具體控件事件;
6、Page_PreRender() —— 預先呈遞對象
預先呈遞對象可以改變對象並將改變保存的最后時刻。可以對控件的屬性、控件樹的結構等做出最后的修改,同時還不用考慮ASP.NET對其作出任何改變,因為此時已經脫離了數據庫調用以及 ViewState 更新了,也可以通過OnPreRender來重載;
7、Page_Render() —— 呈遞對象呈遞頁面
所有對頁面控件的修改完成后 ViewState就被保存了。運用HTML創建給瀏覽器輸出的頁面的時候Render事件就發生了。在Render事件過程中,頁面調用其中的對象將它們呈遞給HTML。然后,頁面就可以以HTML的形式被用戶的瀏覽器訪問了。當Render事件被重載時,開發者可以編寫自定義的HTML代碼使得原先生成的HTML都無效而按照新的HTML來組織頁面。Render方法將一個 HtmlTextWriter 對象作為參數並用它將HTML在瀏覽器上以網頁的形式顯示。這時仍然可以做一些修改動作,不過它們只是客戶端的一些變化而已了。亦可以重載Render事件;
8、Unload event —— 卸載對象
當想服務器請求一個對象的時候,就會在內存里生成一個繼承頁面對象,也就是頁面的類,它繼承自System.Web.UI.Page。當頁面對象從內存中卸載時發生,將觸發該事件;
9、Dispose method called
在呈遞給HTML完成后,所有的對象都應被銷毀。在Dispose事件中,你應該銷毀所有在建立這個頁面時創建的對象。這時所有的處理已經完畢,所以銷毀任何剩下的對象都是不會產生錯誤的,包括頁面對象。你可以重載Dispose事件;

 

作者: ForEvErNoME
出處: http://www.cnblogs.com/ForEvErNoME/
歡迎轉載或分享,但請務必聲明文章出處。如果文章對您有幫助,希望你能 推薦關注
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM