.NET、C#基礎知識

前言:

  學習是一個按部就班的過程,做爲一名.Net軟件工程師咱們須要學習和掌握的東西很是的多,本章主要是記錄下前段時間面試中常常遇到的一些基礎常識,這裏只是大體的歸納還有不少須要學習的東西須要不斷的學習和積累。html

訪問修飾符:
public:公有訪問,不受任何限制。
private:私有訪問,只限於本類成員訪問。
protected:受保護的,只限於本類和子類訪問。
internal:內部訪問,只限於本項目內訪問,其餘的不能訪問
protected internal:內部保護訪問,只限於本項目或是子類訪問,其餘的不能訪問c++

 

 枚舉:程序員

  是由一組特定常量構成的一組數據結構,是值類型的一種特殊形式,當須要一個由指定常量集合組成的數據類型時,使用枚舉類型。枚舉聲明能夠顯式地聲明 byte、sbyte、short、ushort、int、uint、long 或 ulong 類型做爲對應的基礎類型。沒有顯式地聲明基礎類型的枚舉聲明意味着所對應的基礎類型是 int,在代碼中使用枚舉,能夠將之前笨拙的代碼變得優雅簡單,更加直觀,方便記憶。   web

 枚舉在什麼地方適用呢?面試

  一條廣泛規則是,任何使用常量的地方,例如目前用 switch 代碼切換常量的地方。若是隻有單獨一個值(例如,鞋的最大尺寸,或者籠子中能裝猴子的最大數目),則仍是把這個任務留給常量吧。可是,若是定義了一組值,而這些值中的任何一個均可以用於特定的數據類型,那麼將枚舉用在這個地方最適合不過。ajax

WebAPI 和 WebService的區別:sql

  (https://blog.csdn.net/cysong168/article/details/51433986)webapi使用的是http協議,而webservices採用的是soap協議webapi是無狀態的,相對於webserives更輕量級。webapi支持get,和post等http請求數據庫

http soap關係:編程

  http是一個客戶端和服務器端請求和應答的標準(TCP)。http協議其目的是爲了提供一種發佈和接收htttp頁面的方法一http協議的客戶端與服務器的交互:由HTTP客戶端發起一個請求,創建一個到服務器指定端口(默認是80端口)的TCP鏈接。HTTP服務器則在那個端口監聽客戶端發送過來的請求。一旦收到請求,服務器(向客戶端)發回一個狀態行,好比」HTTP/1.1 200 OK」,和(響應的)消息,消息的消息體多是請求的文件、錯誤消息、或者其它一些信息。soap 協議:它描述了一種在分散或分佈式的環境中如何交換信息的輕量級協議。soap在http協議的基礎上,一個基於XML的協議。json

不一樣:都是底層的通訊協議,請求包的格式不一樣而已,soap包是XML格式,http純文本格式。


WCF和WEB API我該選擇哪一個? 

一、當你想建立一個支持消息、消息隊列、雙工通訊的服務時,你應該選擇WCF 

二、當你想建立一個服務,能夠用更快速的傳輸通道時,像TCP、Named Pipes或者甚至是UDP(在WCF4.5中),在其餘傳輸通道不可用的時候也能夠支持HTTP  

三、當你想建立一個基於HTTP的面向資源的服務而且可使用HTTP的所有特徵時(好比URIs、request/response頭,緩存,版本控制,多種內容格式),你應該選擇Web API   

四、當你想讓你的服務用於瀏覽器、手機、iPhone和平板電腦時,你應該選擇Web API

hashmap和hashTable的區別:

1.hashTable是Dictionary的子類,HashMap是Map接口的一個實現的類

2.Hashtable中的方法是同步的,而HashMap中的方法缺省狀況爲非同步

3.HashTabe不容許null值,而hashmap容許有null4.hashtable默認長度是11,增加方式是0ld*2+1,而hashmap則默認是16,並且必定是2的指數

如何理解委託和事件?

委託至關於c或者c++中的指針,委託可以把方法當作參數傳遞,而且提升程序的可擴展性。

 

事件:以一種特殊的委託


委託具備以下特色:

1.委託至關於c++中的指針,可是他是安全類型

2.委託能夠把方法當作參數傳遞

3.委託能夠定義回調方法

4.委託能夠連接在一塊兒,例如:能夠對多個事件調用多個方法

5.方法不須要與委託前面精確匹配

UDP鏈接和tcp鏈接的異同:

  二者均可以實現遠程通信,而主要區別在於tcp須要保持鏈接,而Udp不須要,由此能夠看出udp更高的效率和佔用資源更少,可是tcp傳輸數據更可靠

.Net身份驗證的方式有哪幾種:

  默認值爲 Windows。 在Web.config 文件中,經過 <authentication> 節能夠配置 ASP.NET 使用的安全身份驗證模式,以標識傳入的用戶。 <authentication mode="[Windows|Forms|Passport|None]"><forms>...</forms><passport/></authentication><authentication> 節的mode 爲必選的屬性。指定應用程序的默認身份驗證模式。

此屬性能夠爲下列值之一: Windows :將 Windows 驗證指定爲默認的身份驗證模式。將它與如下任意形式的 Microsoft Internet 信息服務 (IIS) 身份驗證結合起來使用:基本、摘要、集成 Windows 身份驗證 (NTLM/Kerberos) 或證書。在這種狀況下,您的應用程序將身份驗證責任委託給基礎 IIS。 Forms :將 ASP.NET 基於窗體的身份驗證指定爲默認身份驗證模式。Passport :將 Microsoft Passport Network 身份驗證指定爲默認身份驗證模式。 None :不指定任何身份驗證。您的應用程序僅期待匿名用戶,不然它將提供本身的身份驗證。

在c#中object類:

一、類Object是 .NET Framework 中全部類、結構、枚舉和委託的最終基類。

二、C#一般不要求類顯示聲明從 Object 的繼承,由於繼承是隱式的。

三、由於 .NET Framework 中的全部類均從 Object 派生,因此 Object 類中定義的每一個方法可用於系統中的全部對象。 派生類也能夠重寫這些方法中的某些。


高內聚,低耦合的理解:

內聚:是從功能角度來度量模塊內的聯繫,一個好的內聚模塊應當剛好作一件事。它描述的是模塊內的功能聯繫;

耦合:是軟件結構中各模塊之間相互鏈接的一種度量,耦合強弱取決於模塊間接口的複雜程度、進入或訪問一個模塊的點以及經過接口的數據。


C#面向對象思想主要包括:封裝,繼承,多態:
封裝:用抽象的數據類型將數據類型和基本的方法操做封裝在一塊兒,在數據保護在抽象類型內部 (封裝就是把數據或者函數集合在一個個的類中,封裝的對象被稱爲抽象對象,封裝的意義是防止或保護代碼被咱們無心的破壞,提升代碼的重用性,職責分配)

繼承:子類擁有父類的全部數據和操做
多態:一個程序中同名的不一樣方法的共存狀況(方法重載和重寫)

 

C#面向切面編程(AOP):

  這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程http://www.javashuo.com/article/p-fugdlmtx-cx.html

通常而言,咱們管切入到指定類指定方法的代碼片斷稱爲切面,而切入到哪些類、哪些方法則叫切入點。有了AOP,咱們就能夠把幾個類共有的代碼,抽取到一個切片中,等到須要時再切入對象中去,從而改變其原有的行爲。
這樣看來,AOP其實只是OOP的補充而已。OOP從橫向上區分出一個個的類來,而AOP則從縱向上向對象中加入特定的代碼。有了AOP,OOP變得立體了。若是加上時間維度,AOP使OOP由原來的二維變爲三維了,由平面變成立體了。從技術上來講,AOP基本上是經過代理機制實現的。
AOP在編程歷史上能夠說是里程碑式的,對OOP編程是一種十分有益的補充。


重載和重寫的區別:

重載:方法名相同參數個數和參數類型不一樣
重寫:當子類繼承父類,子類中的方法與父類中的方法名,參數類型和參數個數徹底相同則稱爲子類重寫了父類方法(須要一override字標示)(對基類成員的  重寫)

概述反射和序列化: 

   反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可使用反射動態地建立類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。而後,能夠調用類型的方法或訪問其字段和屬性    (就如:實例化對應的類,而後經過實例字段獲取對應的方法)序列化:序列化是將對象轉換爲容易傳輸的格式的過程。例如,能夠序列化一個對象,而後使用 HTTP 經過 Internet 在客戶端和服務器之間傳輸該對象。在另外一端,反序列化將從該流從新構造對象。

C#中的構造函數: 

  每次建立類或結構,將會調用其構造函數。類或結構中能夠建立多個不個不一樣參數的構造函數,程序員能夠對不一樣構造函數設置默認值,約束條件,並編寫靈活易讀的代碼。

構造函數的特色:      

a:構造函數與類名相同 

b:構造函數沒有返回值 

c:能夠帶參數,也能夠不帶參數   

d:每一個類中必需要有都應一個構造函數,通常假如不須要常常用到的話能夠不須要聲明構造函數,由於程序在編譯的時候會本身調用無參的構造函數。

 

類成員有多少種訪問方式:

a:實例成員,能夠經過類的實例訪問

b:靜態成員能夠直接經過類訪問

簡單描述 string str=null;string str="",請儘可能用文字說明區別(要點:說明詳細的內存空間分配)前者聲明變量不會分配內存空間;後者建立了一個空的字符類型,而且分配了對應的內存空間
String str=new String("加油");建立了幾個string object?
建立了兩個,一個對象是加油 一個是指向"加油"的str
String 類是否能夠被繼承:不能,由於String類是selead類

簡單描述.NET裏class和struct(結構)異同: 

類和結構有不少類似之處:結構能夠實現接口,而且具備於類相同的成員類型不一樣:結構是值類型而非引用類型,結構不能繼承,結構存儲在堆棧或者內聯上。

值類型:

整數,浮點數,高精度浮點數,布爾,字符,結構,枚舉

 

引用類型:

對象(Object),字符串,類,接口,委託,數組


sealed(又稱密封類)修飾的類有哪些特色:     

  sealed修飾的類防止此類被派生出其餘的類,若是密封類被指定爲其它的基類則編譯出錯(密封類同時不能爲抽象類)

C#.NET裏面抽象類和接口有什麼區別?

  聲明方法的存在而不去實現它的類被叫作抽象類(abstract class),它用於要建立一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的狀況。不能建立abstract 類的實例。然而能夠建立一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類爲它們父類中的全部抽象方法提供實現,不然它們也是抽象類爲。取而代之,在子類中實現該方法。知道其行爲的其它類能夠在類中實現這些方法。
接口(interface)是抽象類的變體。在接口中,全部方法都是抽象的。多繼承性可經過實現這樣的接口而得到。接口中的全部方法都是抽象的,沒有一個有程序體。接口只能夠定義static final成員變量。接口的實現與子類類似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)全部這種接口的方法。而後,它能夠在實現了該接口的類的任何對象上調用接口的方法。因爲有抽象類,它容許使用接口名做爲引用變量的類型。一般的動態聯編將生效。引用能夠轉換到接口類型或從接口類型轉換,instanceof 運算符能夠用來決定某對象的類是否實現了接口。

接 口:
(1) 接口不能被實例化   

(2) 接口只能包含方法聲明   

(3) 接口的成員包括方法、屬性、索引器、事件   

(4) 接口中不能包含常量、字段(域)、構造函數、析構函數、靜態成員。
(5) 接口中的全部成員默認爲public,所以接口中不能有private修飾符   

(6) 派生類必須實現接口的全部成員   

(7) 一個類能夠直接實現多個接口,接口之間用逗號隔開   

(8) 一個接口能夠有多個父接口,實現該接口的類必須實現全部父接口中的全部成員

 

抽象類和接口 :  

相同點和不一樣點(http://www.cnblogs.com/ronli/archive/2011/10/26/2224654.html

相同點: 

1. 都不能被直接實例化,均可以經過繼承實現其抽象方法。         

2. 都是面向抽象編程的技術基礎,實現了諸多的設計模式。

不一樣點:

1. 接口支持多繼承;抽象類不能實現多繼承。

2. 接口只能定義抽象規則;抽象類既能夠定義規則,還可能提供已實現的成員。

3. 接口是一組行爲規範;抽象類是一個不徹底的類,着重族的概念。

4. 接口能夠用於支持回調;抽象類不能實現回調,由於繼承不支持。

5. 接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法;抽象類能夠定義字段、屬性、包含實現的方法


.net中dataset和datareader的區別:

  首先,datareader是在線對象,用來以只讀只進方式讀取數據。只讀,就是隻能經過它獲取數據而不能修改數據,只進,就是讀取記錄的遊標只會不斷前進,好比說讀取了第5條記錄之後就不能返回去讀取第2條記錄而dataset是離線對象,它就好像是一個數據庫,也能夠說是數據庫的一個副本,你能夠對dataset進行離線編輯修改,以後提交回數據庫,實現數據的離線操做


sql語句中int轉varchar:

2011-02-12 10:39SELECT parent_id_list+','+cast(id AS varchar(10)) FROM mytable
或者cast也能夠用convert來代替
同時看到有網友有這樣的需求,它想把1轉成varchar的」000001″這樣的串,可是cast函數是隻會轉成」1″,因此要借用right函數select right(’00000000′ CAST(@i as varchar)

 

1).數據庫多表鏈接查詢能夠分爲哪幾種?而且各有什麼做用?

主要分爲五種: a:主鍵條件關聯查詢(表中至少有一個匹配與inner join...on 類似)

              b:inner join ...on內鏈接查詢(表中有至少一個匹配,則返回匹配的行)

              c:left join....on 左鏈接查詢(右邊表沒有匹配,也從左邊表返回全部的行) 

              d:right join...on 右鏈接查詢(左邊表沒有匹配,也從右邊表返回全部行)

              e:full join...on 全鏈接查詢(就是返回兩個表中的全部行)


數據庫中的存儲過程和sql語句有優缺點:      

數據庫存儲過程優勢:

a:代碼精簡一致,代碼重用性強,能夠實現模塊化程序設計 

b:運行速度快,提升程序的性能, 由於存儲程序只在建立時進行編譯,之後每次執行存儲過程都不需再從新編譯,而通常SQL語句每執行一次就編譯一次,  因此使用存儲過程可提升數據庫執行速度       

c:可維護性高,只需建立存儲過程一次並將其存儲在數據庫中,之後便可在程序中調用該過程任意次。存儲過程可獨立於程序源代碼而單獨修改,而不須要      更 改 ,測試以及從新部署程序集。

d: 有安全機制,可授予沒有直接執行存儲過程當中語句的權限的用戶,也可執行該存儲過程的權限。另外能夠防止用戶直接訪問表,強制用戶使用存儲過程      執行特定的任務。

e: 減小網絡流量,在網絡中要發送的數百行代碼,可由一條執行其存儲過程代碼的一條單獨語句就可實現(多條sql語句這裏簡化成立一個存儲過程)         

不足:

a:架構不清醒不利於面向對象: 存儲過程不太適合面向對象的設計,沒法採用面向對象的方式將業務邏輯進行封裝,業務邏輯在存儲層實現,增長了業務和存儲的耦合,代碼的可讀性也會下降。

b:可移植性差:過多的使用存儲過程會下降系統的移植性。在對存儲進行相關擴展時,可能會增長一些額外的工做。 


T-sql語句:

可移植性強,語句靈活查詢速度比存儲過程要慢


數據庫存儲過程和T-sql語句的選擇:

在一些新的項目開發過程當中通常不推薦優先使用數據庫存儲過程,通常數據庫存儲過程適用於通常業務邏輯複雜,涉及到了多表操做,而且查詢大批量的數據的時候。例如後臺大批量查詢,以及按期更新等。 

(1)當一個事務涉及到多個SQL語句時或者涉及到對多個表的操做時能夠考慮應用存儲過程 

(2)在一個事務的完成須要很複雜的商業邏輯時能夠考慮應用存儲過程 

(3)比較複雜的統計和彙總能夠考慮應用後臺存儲過程


數據庫經常使用類型及其含義:注:

Unicode 是「字符集」,UTF-8 是「編碼規則」)       

Char,NChar 定長,速度快,佔空間大,需處理   

Varchar,Nvarchar,text 不定長,空間小,速度慢,無需處理

Nchar、NVarchar、NTEXT處理Unicode碼 

char、varchar最多能存儲8000個英文,4000個漢字。能夠看出使用nchar、nvarchar數據類型時不用擔憂輸入的字符是英文仍是漢字,較爲方便但在存儲英文時數量上有些損失。

 

如何使用這些類型: 若是你確定存儲的數據長度,並且不包中文的,能夠選擇char類型。

                   若是確定存儲的數據長度,但可能包括中文,能夠選擇nchar類型。

                   若是不肯定存儲的數據長度,存儲只有英文、數字的最好用varchar 

                   若是不肯定存儲的數據長度,也有可能有中文,能夠選擇nvarchar類型

XML和json數據傳輸格式的優缺點: 

什麼是 XML?XML 指可擴展標記語言(EXtensible Markup Language)XML 是一種標記語言,很相似 HTMLXML 的設計宗旨是傳輸數據,而非顯示數據XML 標籤沒有被預約義。您須要自行定義標籤。XML 被設計爲具備自我描述性。XML 是 W3C 的推薦標準

 

什麼是json?JSON 是純文本JSON 具備「自我描述性」(人類可讀)JSON 具備層級結構(值中存在值)JSON 可經過 JavaScript 進行解析JSON 數據可以使用 AJAX 進行傳輸  

 

區別:xml(可擴展性標記語言)和json二者都是一種跨平臺,跨語言的數據傳輸格式,xml能夠自定義標籤而json是有規定的文本格式,json                  的適用範圍有限而xml沒有,可是xml看起來比較複雜,json簡單。

 

XSLT?

是一種可擴展的樣式表文件,使用xsl能夠格式化xml格式,而且可以將xml轉化爲另外一種格式的輸出

用.net作B/S結構的系統,您是用幾層結構來開發,每一層之間的關係以及爲何要這樣分層? 
答:從下至上分別爲:數據訪問層、業務邏輯層(又或成爲領域層)、表示層 

數據訪問層:有時候也稱爲是持久層,其功能主要是負責數據庫的訪問

業務邏輯層:是整個系統的核心,它與這個系統的業務(領域)有關 是表現層與數據訪問的的橋樑(起到了邏輯判斷)

表示層:是系統的UI部分,負責使用者與整個系統的交互。

優勢:  分工明確,條理清晰,易於調試,並且具備可擴展性

缺點:  增長成本。


分層式結構究竟其優點何在? 

一、開發人員能夠只關注整個結構中的其中某一層;

二、能夠很容易的用新的實現來替換原有層次的實現; 

三、能夠下降層與層之間的依賴;

四、有利於標準化; 

五、利於各層邏輯的複用。

 歸納來講,分層式設計能夠達至以下目的:分散關注、鬆散耦合、邏輯複用、標準定義、易於拓展


分層式結構也不可避免具備一些缺陷:  

一、下降了系統的性能。這是不言而喻的。若是不採用分層式結構,不少業務能夠直接造訪數據庫,以此獲取相應的數據,現在卻必須經過中間層來完成。

二、有時會致使級聯的修改。這種修改尤爲體如今自上而下的方向。若是在表示層中須要增長一個功能,爲保證其設計符合分層式結構,可能須要在相應的業務邏輯層和數據訪問層中都增長相應的代碼。

 

MVC 編程模式MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計建立 Web 應用程序的模式:

Model(模型)表示應用程序核心(好比數據庫記錄列表)

View(視圖)顯示數據(數據庫記錄)

Controller(控制器)處理輸入(寫入數據庫記錄)

MVC 模式同時提供了對 HTML、CSS 和 JavaScript 的徹底控制。

Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。一般模型對象負責在數據庫中存取數據

View(視圖)是應用程序中處理數據顯示的部分。一般視圖是依據模型數據建立的。

Controller(控制器)是應用程序中處理用戶交互的部分。一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。

MVC 分層有助於管理複雜的應用程序,由於您能夠在一個時間內專門關注一個方面。例如,您能夠在不依賴業務邏輯的狀況下專一於視圖設計。同時也讓應用程序的測試更加容易。MVC 分層同時也簡化了分組開發。不一樣的開發人員可同時開發視圖、控制器邏輯和業務邏輯。

 

mvc的優勢:

1.經過把項目分紅model view和controller,使得複雜項目更加容易維護。

2.沒有使用view state和服務器表單控件,能夠更方便的控制應用程序的行爲

3.應用程序經過controller來控制程序請求,能夠提供豐富的url重寫。

4.對單元測試的支持更加出色

5.在團隊開發模式下表現更出衆


MVC的不足: 

(1)增長了系統結構和實現的複雜性。對於簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增長結構的複雜性,並可能產生過多的更新操做,下降運行效率。 

(2)視圖與控制器間的過於緊密的鏈接。視圖與控制器是相互分離,但確實聯繫緊密的部件,視圖沒有控制器的存在,其應用是頗有限的,反之亦然,這樣就妨礙了他們的獨立重用。    

(3)視圖對模型數據的低效率訪問。依據模型操做接口的不一樣,視圖可能須要屢次調用才能得到足夠的顯示數據。對未變化數據的沒必要要的頻繁訪問,也將損害操做性能。

 

asp.net如何實現MVC模式,舉例說明!web/business/dataaccess

 

 列舉ASP.NET 頁面之間傳遞值的幾種方式

1.response. Redirect()   QueryString()...............

2.使用Session變量 

3.使用Server.Transfer(只能在同一站點中進行url重定向,並且url和url中的參數不會在瀏覽器中顯示)

4.application和Cookie
請說明在.net中經常使用的幾種頁面間傳遞參數的方法,並說出他們的優缺點
QueryString  傳遞一個或多個安全性要求不高或是結構簡單的數值。

可是對於傳遞數組或對象的話,就不能用這個方法了 session(viewstate) 簡單,但易丟失 做用於用戶我的,過量的存儲會致使服務器內存資源的耗盡。

application 對象的做用範圍是整個全局,也就是說對全部用戶都有效。其經常使用的方法用Lock和UnLock 

cookie 簡單,但可能不支持,可能被僞造 Cookie是存放在客戶端的,而session是存放在服務器端的。並且Cookie的使用要配合ASP.NET內置對象Request來使用 input ttype="hidden" 簡單,可能被僞造 url參數簡單,顯示於地址欄,長度有限

 Server.Transfer  把流程從當前頁面引導到另外一個頁面中,新的頁面使用前一個頁面的應答流 數據庫穩定,安全,但性能相對弱  

 

什麼是Viewstate?它有什麼做用?

ViewState用來保存頁面狀態,就是說提交以後咱們還能夠看到文本框裏面的內容就是ViewState保存的功勞。 ViewState只維護當前頁面的狀態,不一樣頁面之間不能共享,Session能夠。 ViewState你能夠理解爲一個隱藏控件


ASP.Net頁面生命週期 :(重要)https://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html
當咱們在瀏覽器地址欄中輸入網址,回車查看頁面時,這時會向服務器端(IIS)發送一個request請求,服務器就會判斷髮送過來的請求頁面,  徹底識別 HTTP 頁面處理程序類後,ASP.NET 運行時將調用處理程序的 ProcessRequest 方法來處理請求,來建立頁面對象。一般狀況下,無需更改此方法的實現,由於它是由 Page 類提供的。接下來被建立頁面對象的ProcessRequest方法使頁面經歷了各個階段:初始化、加載視圖狀態信息和回發數據、加載頁面的用戶代碼以及執行回發服務器端事件。以後,頁面進入顯示模式:收集更新的視圖狀態,生成 HTML 代碼並隨後將代碼發送並輸出控制檯。最後,卸載頁面,並認爲請求處理完畢。其中頁面對象ProcessRequest方法 完成的這一系列事件的處理過程就是Asp.Net頁面生命週期。

個人理解:
首先在對應的瀏覽器中輸入對應的網址對服務器發送請求(request)服務器識別瀏覽器的http請求,經過調用processrequest方法來處理請求,建立頁面對象而後經過建立processrequest方法使頁面經歷了:初始化,加載試圖狀態信息,和回發數據,加      載用戶代碼及執行返回服務器端的事件。以後頁面進入顯示模式:收集更新的試圖狀態,生成html代碼將代碼發送輸出在瀏覽器中展現。最後卸載頁面,並認爲請求處理完畢


每一個頁面的生命週期爲用戶的每一次訪問,也就是說每一次客戶端與服務器之間的一個往返過程.全局變量的生命週期在此之間.

1. Page_Init(); 

2. Load ViewState and Postback data; 

3. Page_Load(); 

4. Handle control events; 

5. Page_PreRender(); 

6. Page_Render(); 

7. Unload event; 

8. Dispose method called; 

 

ADO.net中經常使用的對象有哪些?

分別描述一下。

Connection  數據庫鏈接對象 

Command    執行數據庫命令

DataAdapter  鏈接數據,執行數據庫命令,填充DataSet

DataSet  數據在內存中的緩存,數據結構 

DataReader    只讀向前的讀取數據庫

 

DataReader和DataSet的異同 

1.與數據庫鏈接:DataReader:面向鏈接,只讀,只進,只能向前讀,讀完數據就斷開鏈接;(沒法對獲取的數據進行操做)

DataSet:非面向鏈接,把數據加載到sql緩存池中,而後斷開鏈接;

2.處理數據速度:DataReader:速度快;DataSet:速度慢;

3.更新數據庫:DataReader:更新後,沒有辦法還原到原來的數據庫;DataSet:更新後,能夠還原回原來的數據庫;

4.支持分頁排序:DataReader:不支持分頁與排序;DataSet:支持分頁與排序,從內存中直接讀取前多少條(假分頁);

5.佔用內存:DataReader:佔用內存小;DataSet:佔用內存大;


DataSet能夠比做一個內存中的數據庫,DataTable是一個內存中的數據表,DataSet裏能夠存儲多個DataTable


說出你所瞭解的數據庫訪問組件(例如ADO,至少4種) 

答:ADO,ADO.Net,MDAC(Microsoft Data Access Components),Microsoft SQL Server OLE DB Provider,Microsoft Jet OLE DB Provider,Desktop Database Drivers ODBC Driver,Visual FoxPro ODBC Driver  


什麼是裝箱和拆箱? 

答:從值類型接口轉換到引用類型裝箱。從引用類型轉換到值類型拆箱。裝箱(boxing)是將 值類型的數據轉化成引用類型,int i=3; object o = i ;即是裝箱過程,而拆箱(unboxing)是將飲用類型數據轉換值類型,好比int j = (int)o;屬於拆箱


接口含義:接口是指一組函數成員而不實現他們的引用類型,一般只能經過接和類的繼承,繼承接口要實 其所有方法


何時使用抽象類,何時用接口 :
接口用於規範,抽象類用於共性。

接口中只能聲明方法,屬性,事件,索引器。而抽象類中能夠有方法的實現,也能夠定義非靜態的類變量。

抽象類是類,因此只能被單繼承,可是接口卻能夠一次實現多個。

抽象類能夠提供某些方法的部分實現,接口不能夠.抽象類的實例是它的子類給出的。接口的實例是實現接口的類給出的。再抽象類中加入一個方法,那麼它的子類就同時有了這個方法。而在接口中加入新的方法,那麼實現它的類就要從新編寫(這就是爲何說接口是一個類的規範了)。接口成員被定義爲公共的,但抽象類的成員也能夠是私有的、受保護的、內部的或受保護的內部成員(其中受保護的內部成員只能在應用程序的代碼或派生類中訪問)。此外接口不能包含字段、構造函數、析構函數、靜態成員或常量。 


枚舉的使用:http://www.javashuo.com/article/p-tjsrwhjx-s.html


委託和事件:http://www.tracefact.net/tech/009.html)委託 和 事件在 .Net Framework中的應用很是普遍,然而,較好地理解委託和事件對不少接觸C#時間不長的人來講並不容易。它們就像是一道檻兒,過了這個檻的人,以爲真是太容易了,而沒有過去的人每次見到委託和事件就以爲內心別(biè)得慌,混身不自在。本文中,我將經過兩個範例由淺入深地講述什麼是委託、爲何要使用委託、事件的由來、.Net Framework中的委託和事件、委託和事件對Observer設計模式的意義,對它們的中間代碼也作了討論。

 
const和readonly有什麼區別?

 const關鍵字用來聲明編譯時常量,readonly用來聲明運行時常量。


用sealed修飾的類有什麼特色 sealed 修飾符用於防止從所修飾的類派生出其它類,若是一個密封類被指定爲其餘類的基類,則會發生編譯時錯誤。 密封類不能同時爲抽象類。 sealed 修飾符主要用於防止非有意的派生,可是它還能促使某些運行時優化。具體說來,因爲密封類永遠不會有任何派生類,因此對密封類的實例的虛擬函數成員的調用能夠轉換爲非虛擬調用來處理。 


虛函數的用法 

1)virtual指明一成員函數爲虛函數,而virtual僅用於類的定義裏,在類外可不加此關鍵字. 

2)一個類的成員函數被定義爲虛函數時,子類該函數仍保持虛函數特徵. 

3)子類覆蓋此函數時,定義裏可不加virtual關鍵字,但函數聲明要和基類的徹底一致!且此聲明是必須的. 

4)不是純虛函數時,父類的虛函數必需要實現; 而若將父類的虛函數設定爲純虛函數時,子類必須要覆蓋之並且必需要實現之! 


解釋virtual、sealed、override和abstract的區別 virtual申明虛方法的關鍵字,說明該方法能夠被重寫 sealed說明該類不可被繼承 override重寫基類的方法 abstract申明抽象類和抽象方法的關鍵字,抽象方法不提供實現,由子類實現,抽象類不可實例化。 

c#繼承:

base表示對象基類的實例(使用base能夠調用基類中的成員)base 表示當前對象基類的實例(使用base關鍵字能夠調用基類的成員)this表示當前類的實例  

在靜態方法中不可使用base和this關鍵字  

派生類會繼承基類全部的成員可是構造函數和析構函數不會被繼承  

 

什麼是析構函數:

析構函數(destructor) 與構造函數相反,當對象脫離其做用域時(例如對象所在的函數已調用完畢),系統自動執行析構函數。析構函數每每用來作「清理善後」 的工做(例如在創建對象時用new開闢了一片內存空間,應在退出前在析構函數中用delete釋放)。


注意若是派生類的方法和基類的方法同名則基類中的方法將會被隱藏若是須要隱藏則可使用關鍵字new來隱藏若是不寫new關鍵字默認處理爲隱藏雖然基類中同名的方法被隱藏了可是仍是能夠經過base關鍵字來調用   


進程和線程的區別?

進程是系統進行資源分配和調度的單位;

線程是CPU調度和分配的單位,一個進程能夠有多個線程,這些線程共享這個進程的資源。


堆和棧的區別: 

棧:由編譯器自動分配、釋放。在函數體中定義的變量一般在棧上。

堆:通常由程序員分配釋放。用new、malloc等分配內存函數分配獲得的就是在堆上。 

概述:
棧(Stack)由系統管理生存期,存儲代碼執行和調用路徑,執行或調用完畢即從棧中清除; 

堆(Heap)中保存值和對象,調用完畢以後依然存在,由垃圾回收器查找棧中有無指向該值或對象的引用,無則從堆中刪除


C# ref與out區別:

一、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。

二、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以知足匹配。

三、out適合用在須要retrun多個返回值的地方,而ref則用在須要被調用的方法修改調用者的引用的時候。

 你對泛型瞭解嗎?簡單說明一下泛型的有什麼好處?

泛型:經過參數化類型來實如今同一份代碼上操做多種數據類型。利用「參數化類型」將類型抽象化,從而實現靈活的複用 好處是——類型安全和減小裝箱、拆箱。提升性能、類型安全和質量,減小重複性的編程任務 


C#中全部對象共同的基類是什麼? System.Object. 


如何在C#中實現繼承? 在類名後加上一個冒號,再加上基類的名稱。 

 
私有成員會被繼承麼? 會,可是不能被訪問。因此看上去他們彷佛是不能被繼承的,但實際上確實被繼承了。 (是有成員可以被繼承,可是不可以被訪問)


new的三種用法 

答:實例化對象,隱藏基類方法。

運算符(建立對象,建立值類型的默認構造函數)

修飾做用(隱藏基類中的繼承對象,子類中的對象覆蓋基類中的版本)


string是值類型仍是引用類型?引用類型 


String類與StringBuilder類有什麼區別?爲何在.Net類庫中要同時存在這2個類?

(簡答)stringBuilder比string更節約內存,因此stringBuilder更快String 對象是不可改變的。

每次使用 System.String 類中的方法之一或進行運算時(如賦值、拼接等)時,都要在內存中建立一個新的字符串對象,這就須要爲該新對象分配新的空間。而 StringBuilder 則不會。在須要對字符串執行重複修改的狀況下,與建立新的 String 對象相關的系統開銷可能會很是昂貴。

若是要修改字符串而不建立新的對象,則可使用 System.Text.StringBuilder 類。例如,當在一個循環中將許多字符串鏈接在一塊兒時,使用 StringBuilder 類能夠提高性能。

 
Session有什麼重大BUG,微軟提出了什麼方法加以解決?

 答:是iis中因爲有進程回收機制,系統繁忙的話Session會丟失,能夠用Sate server或SQL Server數據庫的方式存儲Session不過這種方式比較慢,並且沒法捕獲Session的END事件 


c#中的三元運算符是 ?: 


.能用foreach遍歷訪問的對象須要實現(Ienumber) 接口或聲明 ( GetEnumerator)方法的類型。


.<%# %> 和 <% %> 有什麼區別?

<%# %>表示綁定的數據源 <% %>是服務器端代碼塊 


C#能否對內存進行直接的操做?

在.net下,.net引用了垃圾回收(GC)功能,它替代了程序員 不過在C#中,不能直接實現Finalize方法,而是在析構函數中調用基類的Finalize()方法 


DateTime是否能夠爲null?

不能,由於其爲Struct類型,而結構屬於值類型,值類型不能爲null,只有引用類型才能被賦值null 

DateTime.Parse(myString); 這行代碼有什麼問題?有問題,當myString不能知足時間格式要求的時候,會引起異常,建議使用DateTime.TryParse() 


net的錯誤處理機制是:採用try->catch->finally結構, 爲何不提倡catch(Exception) try..catch在出現異常的時候影響性能; 應該捕獲更具體得異常,好比IOExeception,OutOfMemoryException等 catch(Exception e){throw e;}和catch(Exception e){throw;}的區別將發生的異常對象拋出,另外一個只是拋出異常,並無拋出原異常對象) 

 

 我應該如何容許鏈接池?

對於.NET應用程序而言,默認爲容許鏈接池。(這意味着你能夠沒必要爲這件事情作任何的事情)固然,若是你能夠在SQLConnection對象的鏈接字符串中加進Pooling=true;確保你的應用程序容許鏈接池的使用。(pooling=true)5. 我應該如何禁止鏈接池?ADO.NET默認爲容許數據庫鏈接池,若是你但願禁止鏈接池,可使用以下的方式:1) 使用SQLConnection對象時,往鏈接字符串加入以下內容:Pooling=False;2) 使用OLEDBConnection對象時,往鏈接字符串加入以下內容:OLE DB Services=-4; 

 

提升.NET的性能 

1 使用異步方式調用Web服務和遠程對象只要有可能就要避免在請求的處理過程當中對Web服務和遠程對象的同步調用,由於它佔用的是的ASP.NET 線程池中的工做線程,這將直接影響Web服務器響應其它請求的能力。

2 使用適當的Caching策略來提升性能

3 判斷字符串,不要用""比較。//避免 if(strABC!=null && strABC!="") {}//推薦 if(!strABC.IsNullOrEmpty) {}

4 頁面優化

5 用完立刻關閉數據庫鏈接

6 儘可能使用存儲過程,並優化查詢語句 

7 只讀數據訪問用SqlDataReader,不要使用DataSet


請解釋轉發與跳轉的區別 轉發就是服務端的跳轉A頁面提交數據到B頁面,B頁面進行處理而後從服務端跳轉到其它頁面 跳轉就是指客戶端的跳轉

 

什麼叫應用程序域? 

答:應用程序域能夠理解爲一種輕量級進程。起到安全的做用。佔用資源小。

 

CTS、CLS、CLR分別做何解釋?

 答:CTS:通用語言系統。CLS:通用語言規範。CLR:公共語言運行庫。

 

請解釋web.config文件中的重要節點

appSettings包含自定義應用程序設置

system.web 系統配置 

compilation動態調試編譯設置

customErrors自定義錯誤信息設置 

authentication身份驗證,此節設置應用程序的身份驗證策略

 authorization受權, 此節設置應用程序的受權策略.


請解釋ASP。NET中的web頁面與其隱藏類之間的關係? 

ASP.NET頁面通常都對應一個隱藏類,通常都在ASP.NET頁面的聲明中指定了隱藏類例如一個頁面Tst1.aspx的頁面聲明以下 <%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %> Codebehind="Tst1.aspx.cs" 代表經編譯此頁面時使用哪個代碼文件 Inherits="T1.Tst1" 表用運行時使用哪個隱藏類

 

當發現不能讀取頁面上的輸入的數據時頗有多是什麼緣由形成的?怎麼解決? 

頗有多是在Page_Load中數據處理時沒有進行Page的IsPostBack屬性判斷 

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

 

解釋一下ajax及實現原理 

答:Ajax的核心是JavaScript對象XmlHttpRequest,它使您可使用JavaScript向服務器提出請求並處理響應, 而不阻塞用戶,異步請求。

 總結:

      這篇總結就先到這裏,推薦你們學習《CLR via C#》和《.net軟件之美》對C#瞭解到深刻有很大的幫助。

相關文章
相關標籤/搜索