經典面試題2016——50題
1.面向對象語言具有——繼承性——,——封裝性——,——多態性——
繼承性:就是讓一個類型的對象擁有另一個類型的對象的屬性的方法。繼承后,子類擁有父類的屬性和方法。
封裝性:就是將數據和代碼捆綁在一起,防止外界干擾。
多態性:就是一個事物擁有不同形式的能力。
2.簡述 private、 protected、 public、 internal 修飾符的訪問權限。
答 . private : 私有成員, 在類的內部才可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
internal: 是同一程序集中文件才可訪問的。
3.列舉asp.net頁面傳值的幾種方法?
1. 使用QueryString變量
QueryString是一種非常簡單的傳值方式,他可以將傳送的值顯示在瀏覽器的地址欄中。如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時,可以使用這個方法。但是對於傳遞數組或對象的話,就不能用這個方法了。下面是一個例子:
a.aspx的C#代碼
private void Button1_Click(object sender, System.EventArgs e)
{
string s_url;
s_url = "b.aspx?name=" + Label1.Text;
Response.Redirect(s_url);
}
b.aspx中C#代碼
private void Page_Load(object sender, EventArgs e)
{
Label2.Text = Request.QueryString["name"];
}
2. 使用Application 對象變量
Application對象的作用范圍是整個全局,也就是說對所有用戶都有效。其常用的方法用Lock和UnLock。
a.aspx的C#代碼
private void Button1_Click(object sender, System.EventArgs e)
{
Application["name"] = Label1.Text;
Server.Transfer("b.aspx");
}
b.aspx中C#代碼
private void Page_Load(object sender, EventArgs e)
{
string name;
Application.Lock();
name = Application["name"].ToString();
Application.UnLock();
}
3. 使用Session變量
想必這個肯定是大家使用中最常見的用法了,其操作與Application類似,作用於用戶個人,所以,過量的存儲會導致服務器內存資源的耗盡。
a.aspx的C#代碼
private void Button1_Click(object sender, System.EventArgs e)
{
Session["name"] = Label.Text;
}
b.aspx中C#代碼
private void Page_Load(object sender, EventArgs e)
{
string name;
name = Session["name"].ToString();
}
4. 使用Cookie對象變量
這個也是大家常使用的方法,與Session一樣,其是什對每一個用戶而言的,但是有個本質的區別,即Cookie是存放在客戶端的,而session是存放在服務器端的。而且Cookie的使用要配合ASP.NET內置對象Request來使用。
a.aspx的C#代碼
private void Button1_Click(object sender, System.EventArgs e)
{
HttpCookie cookie_name = new HttpCookie("name");
cookie_name.Value = Label1.Text;
Reponse.AppendCookie(cookie_name);
Server.Transfer("b.aspx");
}
b.aspx中C#代碼
private void Page_Load(object sender, EventArgs e)
{
string name;
name = Request.Cookie["name"].Value.ToString();
}
5. 使用Server.Transfer方法
這個才可以說是面象對象開發所使用的方法,其使用Server.Transfer方法把流程從當前頁面引導到另一個頁面中,新的頁面使用前一個頁面的應答流,所以這個方法是完全面象對象的,簡潔有效。
a.aspx的C#代碼
public string Name
{
get{ return Label1.Text;}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Server.Transfer("b.aspx");
}
b.aspx中C#代碼
private void Page_Load(object sender, EventArgs e)
{
a newWeb; //實例a窗體
newWeb = (source)Context.Handler;
string name;
name = newWeb.Name;
}
4.經典遞歸算法:兔子繁殖問題。。。
class Program
{
public static int tuzi(int n)
//靜態函數才可以調用
{
if (n ==1|n==2)
{
return 1;
}
return (n - 2) + (n - 1);
}
static void Main(string[] args)
{
int b;
Console.WriteLine("請輸入幾個月后的兔子:");
int a = int.Parse(Console.ReadLine());
b = tuzi(a);
Console.WriteLine("兔子為{0}", b);
}
}
5.經典排序—冒泡排序法
public static void bubble_sort(int[] x)
{
for (int i = 0; i < x.Length; i++)
{
for (int j = i; j < x.Length; j++)
{
if (x[i] < x[j]) //從大到小排序
{
int temp;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
}
static void Main(string[] args)
{
int[] huage = { 1, 5, 2, 9, 3, 7, 6,4,8,0};
bubble_sort(huage);
foreach (var a in huage)
{
Console.WriteLine(a );
}
}
6.C#中的委托是什么?事件是委托嗎?
委托是將一種方法作為參數代入到另一種方法。
是,事件是一種特殊的委托。 //比如:onclick事件中的參數就是一種方法。
7.委托聲明的關鍵字是__delegate__.
8.根據委托(delegate)的知識,請完成以下用戶控件中代碼片段的填寫:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//請在以下補齊代碼用來調用OnDBOperate委托簽名的OnNew事件。
}
}
}
答:if( OnNew != null )
OnNew( this, e );
9.c#中的三元運算符是__?:_(條件運算符)_
10.在C#中,string str = null 與 string str = “” 請盡量使用文字或圖象說明其中的區別。
答:string str = null 是不給他分配內存空間,而string str = "" 給它分配長度為空字符串的內存空間。
11.overload與override的區別。
overload是方法的名稱相同。參數或參數類型不同,進行多次重載以適應不同的需要, overloaded的方法是可以改變返回值的類型
override 是進行基類中函數的重寫。實現多態。
12.構造器(構造函數)Constructor是否可被override?
答:構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。
13.下面的代碼中有什么錯誤嗎?____abstract override是不可以一起修飾______
using System;
class A
{
public virtual void F(){
Console.WriteLine(“A.F“);
}
}
abstract class B:A
{
public abstract override void F();
}
14.請編程遍歷頁面上所有TextBox控件並給它賦值為string.Empty?
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}
15.用.net做B/S結構的系統,您是用幾層結構來開發,每一層之間的關系以及為什么要這樣分層?
使用三層架構模式分層
一般為3層
數據訪問層,業務層,表示層。
數據訪問層對數據庫進行增刪查改。
業務層一般分為二層,業務表觀層實現與表示層的溝通,業務規則層實現用戶密碼的安全等。
表示層為了與用戶交互例如用戶添加表單。
優點: 分工明確,條理清晰,易於調試,而且具有可擴展性。
缺點: 增加成本。
16.net中讀寫數據庫需要用到那些類?他們的作用?
DataSet:數據集。
DataCommand:執行語句命令。
DataAdapter:數據的集合,用語填充。
DataReader:數據只讀器
17.ADO.net中常用的對象有哪些?分別描述一下。
Connection 數據庫連接對象
Command 數據庫命令
DataReader 數據讀取器
DataSet 數據集
DataAdaprer數據適配器
18.DataReader與Dataset有什么區別?
一個是只能向前的只讀游標,一個是內存中的表。
19.在.net中,配件的意思是?
程序集。(中間語言,源數據,資源,裝配清單)
20.請詳述在.net中類(class)與結構(struct)的異同?
class屬於引用類型,是分配在內存的堆上的,class可以被實例化,可以實現接口和單繼承其他類,還可以作為基類型
struct屬於值類型,是分配在內存的棧上的,不能作為基類型,但是可以實現接口.
21.ASP.net的身份驗證方式有哪些?分別是什么原理?
Windwos(默認)用IIS控制
From(窗體)用帳戶
Passport(密鑰)
22.net Remoting 的工作原理是什么?
服務器端向客戶端發送一個進程編號,一個程序域編號,以確定對象的位置。
23.簡要談一下您對微軟.NET 構架下remoting和webservice兩項技術的理解以及實際中的應用。
webservice主要是可利用HTTP,穿透防火牆。而Remoting可以利用TCP/IP,二進制傳送提高效率。
24.什么是ASP.net中的用戶控件?
用戶控件一般用在內容多為靜態,或者少許會改變的情況下..用的比較大..類似ASP中的include..但是功能要強大的多
25.在Asp.net中所有的自定義用戶控件都必須繼承自__Control___?
26.在.Net中,類System.Web.UI.Page 可以被繼承么?_可以___(可以or不可以)
27.大概描述一下ASP.NET服務器控件的生命周期
答:初始化 加載視圖狀態 處理回發數據 加載 發送回發更改通知 處理回發事件 預呈現 保存狀態 呈現 處置 卸載
28.net的錯誤處理機制是什么?
答:.net錯誤處理機制采用try->catch->finally結構,發生錯誤時,層層上拋,直到找到匹配的Catch為止。
29.在.Net托管代碼中我們不用擔心內存漏洞,這是因為有了__GC__(內存回收機制)___?
30.C#可否對內存進行直接的操作?
在.net下,.net引用了垃圾回收(GC)功能,它替代了程序員 不過在C#中,不能直接實現Finalize方法,而是在析構函數中調用基類的Finalize()方法
31.在.Net中所有可序列化的類都被標記為__[Serializable]_______?
32.大概描述一下ASP。NET服務器控件的生命周期
33.什么是裝箱與拆箱?
裝箱是將值類型轉換為引用類型 ;拆箱是將引用類型轉換為值類型
利用裝箱和拆箱功能,可通過允許值類型的任何值與Object 類型的值相互轉換,將值類型與引用類型鏈接起來
例如:
int val = 100;
object obj = val;
Console.WriteLine (“對象的值 = {0}", obj);
這是一個裝箱的過程,是將值類型轉換為引用類型的過程
int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine ("num: {0}", num);
這是一個拆箱的過程,是將值類型轉換為引用類型,再由引用類型轉換為值類型的過程
34.堆和棧的區別?
棧:由編譯器自動分配、釋放。在函數體中定義的變量通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內存函數分配得到的就是在堆上。
35.寫出一條Sql語句: 取出表A中第31到第40記錄(SQLServer, 以自動增長的ID作為主鍵, 注意:ID可能不是連續的。)
select top 10 * from A where id not in (select top 30 id from A)
select top 10 * from A where id 〉 (select max(id) from (select top 30 id from A )as A)
36.SQLSERVER服務器中,給定表 table1 中有兩個字段 ID、LastUpdateDate,ID表示更新的事務號, LastUpdateDate表示更新時的服務器時間,請使用一句SQL語句獲得最后更新的事務號
Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)
37.什么叫做SQL注入,如何防止?請舉例說明。
答:利用sql關鍵字對網站進行攻擊。過濾關鍵字'等
38.如何處理幾十萬條並發數據?
答:用存儲過程或事務。取得最大標識的時候同時更新..注意主鍵不是自增量方式這種方法並發的時候是不會有重復主鍵的..取得最大標識要有一個存儲過程來獲取.
39.請將字符串"I am a student"按單詞逆序輸出 如"student a am I"
string S = "I am a student";
char[] C = new char[] { ' '};
string[] n =S.Split(C);
int length = S.Length;
for (int i =length-1 ; i >=0; i--)
{
Console.Write(n[i]);
if (i != 0)
{
Console.Write(" ");
}
}
40.兩個數組 [n] [m] n>m 第一個數組的數字無序排列 第二個數組為空 取出第一個數組的最小值 放到第二個數組中第一個位置, 依次類推. 不能改變A數組,不能對之進行排序,也不可以倒到別的數組中。
int[] a = { -20, 9, 7, 37, 38, 69, 89, -1, 59, 29, 0, -25, 39, 900, 22, 13, 55 };
int[] b = new int[10];
int intTmp = a[0], intMaxNum;
for (int i = 0; i < a.Length; i++)
{
intTmp = a[i] > intTmp ? a[i] : intTmp;
}
intMaxNum = intTmp;
for (int j = 0; j < b.Length; j++)
{
for (int i = 0; i < a.Length; i++)
{
if (j == 0)
intTmp = a[i] < intTmp ? a[i] : intTmp;
else
{
if (a[i] > b[j - 1])
intTmp = a[i] < intTmp ? a[i] : intTmp;
}
}
b[j] = intTmp;
intTmp = intMaxNum;
}
foreach (int bb in b)
{
Console.WriteLine(bb);
}
Console.ReadLine();
41.在下面的例子里
using System;
class A
{
public A(){
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B(){
y=-1;
}
public override void PrintFields(){
Console.WriteLine(“x={0},y={1}“,x,y);
}
當使用new B()創建B的實例時,產生什么輸出?X=1,Y=0
答:X=1,Y=0
42.下面的例子中
using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine(“X={0},Y={1}“,A.X,B.Y);
}
}
產生的輸出結果是什么?x=1,y=2
答:x=1,y=2
43.下面這段代碼有錯誤么?
switch (i){
case(): 答://case()條件不能為空
CaseZero();
break;
case 1:
CaseOne();
break;
case 2:
dufault; 答://wrong,格式不正確
CaseTwo();
break;
}
44.abstract class和interface有什么區別?
聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。
接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成 員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以 在實現了該接口的類的任何對象上調用接口的方法。由於有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從 接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。
45.接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
接口可以繼承接口。
抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。
46.能用foreach遍歷訪問的對象需要實現 ___IEnumerable___接口或聲明_GetEnumerator___方法的類型。
47.請問: String類與StringBuilder類有什么區別?為什么在.Net類庫中要同時存在這2個類?(簡答)
String類是密封類故不可以繼承。
49.C#中 property 與 attribute的區別,他們各有什么用處,這種機制的好處在哪里?
attribute:自定義屬性的基類;property :類中的屬性
50.軟件開發過程一般有幾個階段?每個階段的作用?
1.問題的定義及規划
此階段是軟件開發與需求放共同討論,主要確定軟件的開發目標及其可行性。
2.需求分析在確定軟件開發可行性的情況下,對軟件需要實現的各個功能進行詳細需求分析。需求分析階段是一個很重要的階段,這一階段做的好,將為整個軟件項目的開發打下良好的基礎。“唯一不變的是變化本身”,同樣軟件需求也是在軟件愛你開發過程中不斷變化和深入的,因此,我們必須定制需求變更計划來應付這種變化,以保護整個項目的正常進行。
3.軟件設計此階段中偶要根據需求分析的結果,對整個軟件系統進行設計,如系統框架設計、數據庫設計等。軟件設計一般分為總體設計和詳細設計。還的軟件設計將為軟件程序編寫打下良好的基礎。
4.程序編碼此階段是將軟件設計的結果轉化為計算機可運行的程序代碼。在程序編碼中必定要制定統一、符合標准的編寫規范。以保證程序的可讀性、易維護性。提高程序的運行效率。
5.軟件測試在軟件設計完成之后要進行嚴密的測試,一發現軟件在整個軟件設計過程中存在的問題並加以糾正。整個測試階段分為單元測試、組裝測試、系統測試三個階段進行。測試方法主要有白盒測試和黑盒測試。
這些是C#,ASP.NET,數據庫面試題,全部從網上收集而來,經整理而發表,希望給大家帶來幫助,有錯誤的地方還請各位高手指出,在下傾聽指教。