個人面試題總結 + 基礎知識點的整理。。。不斷更新中。。。
1、請編程遍歷頁面上所有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;
}
}
能用foreach遍歷訪問的對象需要實現 IEnumerable 接口或聲明 GetEnumerator 方法的類型。
JS方法遍歷:
function BianLi()
{
var t=document.getElementsByTagName("input");
for(var i=0;i<t.length && t[i];++i)
{
if(t[i].type=="text")
{
t[i].value="";
}
}
}
3、值類型,引用類型;
(1)、值類型:
a.值類型變量包含賦予的數據,如:當聲明(int)整型變量並賦值時,該變量直接包含賦予的值。將一個值類型變量賦予另一個值類型變量時,則是建立該變量的副本。
int num1,num2;
num1=5;num2=num1;=>num1=5,num2=5;
num2=3; =>num1=5,num2=3;
b.所有的值類型在聲明的時候都有默認值。如:
Boolean shang; 默認值為false;
int age;默認值為0;
可以使用default關鍵字獲取值類型的默認值:
object x;
x=default(bool); x=false;
x=default(int); x=0;
c.如果沒有明確地初始化變量,C#就禁止使用該變量。為了使用該變量,需要使用某個值對該變量進行初始化。如:
Boolean shang;
Console.WriteLine(shang); 報錯
Boolean shang=false;
Console.WriteLine(shang); OK
d..NET Framework 帶有一組預先定義的C#和.NET 值類型:bool,byte,sbyte,char,decimal,double,float,int,uint,long,ulong,short,ushort;
(2)、引用類型
對於引用類型,變量存儲數據的引用而非實際數據,C#支持兩種預定義的引用類型:Object和string;
數組是引用類型,但是數組中的元素可以是任意類型的。
(3)、值類型和引用類型的區別:
a.將一個值類型變量賦給另一個值類型變量時,將復制包含的值。引用類型變量的賦值只復制對對象的引用,而不復制對象本身。
b.值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也可以實現接口。
c.值類型不可能包含 null 值:然而,可空類型功能允許將 null 賦給值類型。
d.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
4、裝箱,拆箱
裝箱:從值類型轉換為引用類型;
拆箱:從引用類型轉換為值類型;
object obj = null;//引用類型
obj = 1;//裝箱,boxing。把值類型包裝為引用類型。
int i1 = (int)obj;//拆箱。unboxing
5、受管制(托管)的代碼
托管代碼(safe):使用CLR編譯語言編輯器開發編寫的代碼,由公共語言運行庫環境執行的代碼;
非托管代碼(unsafe):在公共語言運行庫環境外部,由操作系統直接執行的代碼。
6、CTL,CTS,CLS
CLR:公共語言運行庫(Common Language Runtime);
CTS:通用類型系統(Commom Type System);
CLS:通用語言規范(Common Language Specification);
7、應用程序域,程序集
應用程序域:
就是為安全性,可靠性,隔離性,和版本控制,及卸載程序提供的隔離邊界。它通常由運行庫宿主創建,應用程序域提供了一個更安全,用途更廣的處理單元。它由公
共語言運行庫圍繞同一個應用程序范圍內創建的對象建立。應用程序域可以理解為一種輕量級進程。起到安全的作用。占用資源小。
程序集:
在.NET中可部署的基本單元成為程序集。是一個或多個托管模塊,以及一些資源文件(EXE文件的過程程序集或DLL文件的庫程序集)的邏輯組合。
強命名程序集:
程序集需要經過加密簽名,強命名程序集可以部署到全局程序集緩存中,成為公共程序集。
8、Static 和 非Static的區別:
(1)、用Static聲明的方法和變量,不需要實例化該類,通過類調用(static表示“靜態”或者“全局”,被static修飾的方法或者變量獨立於該類的任何對象);
(2)、非Static的,就一定要用實例化的對象來調用,即用new來實例化。
View Code
class Program { private static int _numberA = 5;//靜態字段 private int _numberB = 3;//非靜態字段 static void Main(string[] args) { //靜態方法,字段直接通過類來調用(對於Program.Add()或Program._numberB,Program.可以省略); Program p = new Program();//對於非static的方法,字段要通過類的實例化對象來調用; //注意對於調用不同類型方法,不同類型字段的寫法 Console.WriteLine(Program.Add(Program._numberA,p._numberB)); Console.WriteLine(Add(Program._numberA, p._numberB)); int sub=p.Subtract(_numberA,p._numberB); Console.WriteLine(sub); Console.ReadKey(); } //靜態方法 public static int Add(int a,int b) { return a + b; } //非靜態方法 public int Subtract(int a,int b) { return a - b; } }
9、面向對象的思想
繼承、封裝,多態。
10、接口,抽象類
(1)、接口(命名規范:以大寫字母I作為接口名稱的開始)
(2)、抽象類
(3)、接口和抽象類的區別:
a.抽象類可以同時包含具體方法(已經的實現的方法)和抽象的方法(每個抽象類中至少有一個抽象方法);接口不包含任何方法的實現,必須由實現該接口的類提供所有的實現;
b.抽象類可以包含構造函數和析構函數;接口不可以。
c.一個類可以實現多個接口,但是只可以從一個抽象類繼承。
d.接口中的方法不能有訪問修飾符。
11、類和結構的區別
Class可以被實例化,屬於引用類型,是分配在內存的堆上的。類是引用傳遞的。
Struct屬於值類型,是分配在內存的棧上的。結構體是復制傳遞的。如:Int32、Boolean等都屬於結構體
12、重載(overload),重寫(override),擴展方法(C#3.0新增)
(1)、重載方法:類中包含多個具有相同名稱和不同簽名(形參)的方法。
(2)、重寫:提供了子類中改變父類方法行為的實現(是進行基類中函數的重寫)。
13、訪問修飾符
private:關鍵字指示成員在類的外部不可見;
public:關鍵字指示成員在類的外部可見,並對所有派生類可見(在整個項目中都可見);
protected:關鍵字指示成員在類的外部不可見,對所有派生類可見;
internal:關鍵字指示成員在類的外部可見,並對所有的派生類可見;
protected internal:關鍵字組合指示成員在類的外部可見,並對所有的派生類可見
14、委托和事件
(1)、委托:
a.在C#中,委托是包含方法引用的引用類型。我們可以將委托認為是指向函數的指針。不是直接的調用該函數,而是通過使用委托來指向該函數,然后通過調用委托來調用該方法。
b.使用delegate關鍵字來定義委托的類型,委托類型的聲明類似於函數的聲明,但是委托沒有函數主體。為了使委托對象指向函數,可以創建委托類型的對象,並且使用希望指向的方法實例化該對象。
未使用委托的代碼:
View Code
class Program { static void Main(string[] args) { int num1 = 5; int num2 = 3; Console.WriteLine(Add(num1,num2).ToString());//調用Add()方法 Console.WriteLine(Subtract(num1, num2).ToString()); Console.ReadLine(); } static int Add(int num1,int num2) { return (num1+num2); } static int Subtract(int num1, int num2) { return (num1 - num2); } }
使用委托的代碼:
View Code
class Program { delegate int MethodDelegate(int num1,int num2);// static void Main(string[] args) { int num1 = 5; int num2 = 3; MethodDelegate method = new MethodDelegate(Add);//創建委托的對象,聲明mehod為指向Add()方法的委托。此處還不能直接調用Add()方法 //或者 MethodDelegate method=Add; //使用Method委托調用調用Add()方法 Console.WriteLine(method(num1,num2).ToString());//調用Add()方法 Console.ReadLine(); } static int Add(int num1,int num2) { return (num1+num2); } static int Subtract(int num1, int num2) { return (num1 - num2); } }
c.委托的優點就在於可以使用委托來調用它所指向的任何函數,並且在調用之前都不需要確切的了解它所調用的函數,委托可以指向任何函數(前提是該函數的簽名必須和委托的簽名相匹配)。使用委托可以幫助改善應用程序的響應靈敏性。
char Operation='A';
MehtodDelegate method=null;
switch (Operation)
{
case 'A': method=new MehtodDelegate(Add);
break;
case 'B': method=new MehtodDelegate(Subtract);
break;
}
if(method!=null)
Console.WriteLine(method(num1,num2).ToString());
d.委托也可以作為形參傳遞給方法。
e.委托鏈接。
(2)、事件:(是一種特殊的委托)
在.NET中,使用委托來實現事件。具有事件的對象稱為”發布者“,處理事件的對象稱為”訂閱者“。當對象提供事件時,它會定義一個委托,希望處理該事件的對象必須為這個委托提供函數。該委托稱為事件。處理該委托的函數稱為事件處理程序。
(3)、事件和委托的區別:
事件不可以使用=運算符將委托直接賦給事件,而是必須使用+=運算符。
15、泛型
16、線程和進程
17、棧和堆
棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。
堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小
18、對象的序列化和反序列化
19、WebService的調用方法
(1)、使用WSDL.exe命令行工具。
(2)、使用VS.NET中的Add Web Reference菜單選項。
20、net Remoting 的工作原理:
服務器端向客戶端發送一個進程編號,一個程序域編號,以確定對象的位置
21、簡要談一下您對微軟.NET 構架下remoting和webservice兩項技術的理解以及實際中的應用。
答:WS主要是可利用HTTP,穿透防火牆。而Remoting可以利用TCP/IP,二進制傳送提高效率。
22、用戶控件
23、關鍵字:
(1)、this關鍵字
用於引用類的當前實例,也包括繼承而來的方法,通常可以隱藏this:
a.顯得被相似的名稱隱藏的成員;
b.將對象作為參數傳遞到其它方法;
c.聲明索引器;
(2)、base
用於從派生類中訪問基類的成員(例如特性和變量),也可以使用base關鍵字范圍來自基類的方法,功能:
a.調用基類上已被其他方法重寫的方法;
b.制定創建派生類實例時應調用的基類構造函數。
(3)、new
a.實例化如:New Class() ,對象必須使用New關鍵字來分配內存。
b.public new 隱藏基類的方法
c.在泛型類申明中的任何類型參數都必須有公共的無參構造函數。
(4)、using
在C#中,使用using關鍵字自動調用Dispose()方法,如:conn對象只在using塊中有效,並且在該塊執行之后自動釋放。
using System.Data.SqlClient;
...
using (SqlConnection conn=new SqlConnection())
{
conn.ConnectionString="...";
...
}
使用using關鍵字是為了確保執行如下操作的優秀方法:當不再需要某些資源(特別是COM對象和非托管代碼,CLR中國的垃圾收集器不會自動卸載這些資源)時適當地釋放這些資源。
(5)、參數修飾符 ref,out,params關鍵字
如果一個參數沒有參數修飾符,則認為該參數是按值傳遞,也就是說被調用的方法所接收的數據是原始數據的一個副本。
ref:
調用者賦初值,並且可由被調用的方法可選地重新給參數賦值,參數是按引用傳遞的。如果被調用的方法沒有給輸出參數賦值,則不會出現編譯錯誤。
out:
輸出參數由被調用的方法賦值,按照引用傳遞,如果被調用的方法沒有給輸出參數賦值,則會出現編譯錯誤。
params:
(6)、Const和ReadOnly的區別
static readonly:
a.在運行期間解析常量。b.即可在申明時初始化,也可在構造器中初始化。c.只可用來修飾類中的成員。
(用 static readonly 修飾符聲明的成員依然是變量,只不過具有和常量類似的使用方法:通過類進行訪問、初始化后不可以修改。但與常量不同的是這種變量是在運行期初始化)
const:
a.在編譯期間解析常量。b.必須在申明時就初始化。c.即可用來修飾類中的成員,也可用來修飾函數中的局部變量。(用 const 修飾符聲明的成員叫常量,是在編譯期初始化並嵌入到客戶端程序 )。c.const是static所以不必使用static關鍵字修飾,否則會報錯。
24、是否可以繼承String類?
String類是sealed類故不可以繼承。
25、把一個Array復制到Arraylist中
string[] s={"111","222"};
1、ArrayList list=new ArrayList();
list.AddRange(s);
2、Array list=new ArrayList(s);
3、foreach( object o in s )arrayList.Add(o)
26、Asp.Net在頁面上的傳值方式
(1)、使用QueryString, 如....?id=1; response. Redirect()....
(2)、使用Session變量
(3)、使用Server.Transfer
(4)、使Cookie傳值
QueryString 傳遞一個或多個安全性要求不高或是結構簡單的數值。但是對於傳遞數組或對象的話,就不能用這個方法了
session(viewstate) 簡單,但易丟失 作用於用戶個人,過量的存儲會導致服務器內存資源的耗盡。
application 對象的作用范圍是整個全局,也就是說對所有用戶都有效。其常用的方法用Lock和UnLock
cookie 簡單,但可能不支持,可能被偽造 Cookie是存放在客戶端的,而session是存放在服務器端的。而且Cookie的使用要配合ASP.NET內置對象Request來使用
input type="hidden" 簡單,可能被偽造
url參數簡單,顯示於地址欄,長度有限
Server.Transfer 把流程從當前頁面引導到另一個頁面中,新的頁面使用前一個頁面的應答流
數據庫穩定,安全,但性能相對弱
27、什么是Viewstate?它有什么作用?
ViewState用來保存頁面狀態,就是說提交之后我們還可以看到文本框里面的內容就是ViewState保存的功勞。
ViewState只維護當前頁面的狀態,不同頁面之間不能共享,Session可以。
ViewState你可以理解為一個隱藏控件。
28、ASP.Net頁面生命周期
每個頁面的生命周期為用戶的每一次訪問,也就是說每一次客戶端與服務器之間的一個往返過程.全局變量的生命周期在此之間.
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;
29、ADO.net中常用的對象有哪些?分別描述一下。
Connection 打開數據庫連接
Command 執行數據庫命令
DataAdapter 連接數據,執行數據庫命令,填充DataSet
DataSet 數據在內存中的緩存,數據結構
DataReader 只讀向前的讀取數據庫
30、DataReader和DataSet的異同
DataReader使用時始終占用SqlConnection,在線操作數據庫..任何對SqlConnection的操作都會引發DataReader的異常..因為DataReader每次只在內存中加載一條數據,所以占用的內存是很小的..因為DataReader的特殊性和高性能.所以DataReader是只進的..你讀了第一條后就不能再去讀取第一條了..
DataSet則是將數據一次性加載在內存中.拋棄數據庫連接..讀取完畢即放棄數據庫連接..因為DataSet將數據全部加載在內存中.所以比較消耗內存...但是確比DataReader要靈活..可以動態的添加行,列,數據.對數據庫進行回傳更新操作...
31、.Net讀取數據庫用到的類:
DataSet:數據集。
DataCommand:執行語句命令。
DataAdapter:數據的集合,用於填充。
DataReader:數據只讀器
32、ASP.Net的身份驗證方式:
Windows(默認)用IIS控制
From(窗體)用帳戶
Passport(密鑰)
33、Code-Behind技術:
代碼后置
34、&和&&的區別。
&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and).
35、<%# %>,<% %>,<%-- --%>區別:
<%# %>表示綁定的數據源,<% %>是服務器端代碼塊,<%--注釋--%>注釋
36、在C#中,string str = null 與 string str = " " 請盡量使用文字或圖象說明其中的區別。
null:表示不占內存空間, " " 表示分配了一個長度為空字符串的內存空間。
37、GET與POST的區別
在FORM提交的時候,如果不指定Method,則默認為GET請求,Form中提交的數據將會附加在url之后,以?分開與url分開。字母數字字符原樣發送,但空格轉換為“+“號,其它符號轉換為%XX,其中XX為該符號以16進制表示的ASCII(或ISO Latin-1)值。GET請求請提交的數據放置在HTTP請求協議頭中,而POST提交的數據則放在實體數據中;
在使用 POST 方法的情況下,傳輸數據時不會將數據作為 URL 的一部分;它們會作為一個獨立的實體來傳輸。因此,POST 方法更安全,你也可以用這個方法傳輸更多的數據。而且用 POST 傳輸的數據不一定要是文本,用 GET 方法傳輸的卻一定要是文本。
(1)get是從服務器上獲取數據,post是向服務器傳送數據。
(1)在客戶端,Get方式在通過URL提交數據,數據在URL中可以看到;POST方式,數據放置在HTML HEADER內提交。
(2)對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
(2)GET方式提交的數據最多只能有1024字節,而POST則沒有此限制。
(3)安全性問題。正如在(1)中提到,使用 Get 的時候,參數會顯示在地址欄上,而 Post 不會。所以,如果這些數據是中文數據而且是非敏感數據,那么使用 get;如果用戶輸入的數據不是中文字符而且包含敏感數據,那么還是使用 post為好。
38、分析以下代碼,完成填空
string strTmp = "abcdefg某某某";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j= strTmp.Length;
以上代碼執行完后,i,j的值?
i=14,j=10
39、分頁
40、冒泡排序
int[] array = { 1, 2, 3, 4, 6, 8, 12, 5,9};//定義一個數組
int temp = 0;
for (int i = 0; i < array.Length - 1; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[j] < array[i])
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
//輸出新數組中的每一個元素的值
foreach (int a in array)
{
Console.WriteLine(a);
}
41、一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少, 用遞歸算法實現。
public static int Foo(int i)
{
if (i <= 0)
return 0;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
42、請將字符串"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 = n.Length;//n的長度;
for (int i =length-1 ; i >=0; i--)
{
Console.Write(n[i]);
if (i != 0)
{
Console.Write(" ");
}
}
C#字符串倒序輸出的多種寫法:
View Code
class Program { static void Main(string[] args) { string str = Console.ReadLine(); Console.WriteLine(ReverseA(str)); Console.WriteLine(ReverseB(str)); Console.WriteLine(ReverseC(str)); Console.WriteLine(ReverseD(str)); Console.WriteLine(ReverseE(str)); Console.ReadKey(); } //方法一: public static string ReverseA(string zfc) { char[] cArray = zfc.ToCharArray(); string reverse = String.Empty; for (int i = cArray.Length - 1; i > -1; i--) { reverse += cArray[i]; } return reverse; } //方法二: public static string ReverseB(string zfc) { char[] cArray = zfc.ToCharArray(); Array.Reverse(cArray);//Reverse 翻轉整個一位數組的順序 return new string(cArray); } //方法三:Push/Pop Stack<> public static string ReverseC(string zfc) { Stack resultStack = new Stack();//Stack表示對象的后進先出的非泛型集合 foreach (char c in zfc) { resultStack.Push(c); } StringBuilder sb = new StringBuilder(); while (resultStack.Count > 0) { sb.Append(resultStack.Pop()); } return sb.ToString(); } //方法四:LINQ public static string ReverseD(string zfc) { return new string(zfc.ToCharArray().Reverse().ToArray()); } //方法五:StringBuilder public static string ReverseE(string zfc) { char[] cArray = zfc.ToCharArray(); StringBuilder sb = new StringBuilder(); for (int i = cArray.Length - 1; i > -1; i--) { sb.Append(cArray[i]); } return sb.ToString(); } }
43、Visual Studio 和.NET Framework的關系
Visual Studio 是微軟提供的編程(開發)工具,是一種集成開發環境。
.NET Framwork 是C#編程語言提供的類庫,目的是為了方便快捷的開發,也是一些軟件所必須安裝的系統組件(一些軟件只有安裝了.NET Framwork 才能正常的安裝)。
.NET Framwork 是以一種采用虛擬機運行的編程平台,以通用的語言運行庫CLR為基礎,支持多種語言(如C#、VB、C++、Python等)的開發。同時.NET也為應用程序開發接口(API)提供了新功能和開發工具。
C#是在.NET平台上使用的一種編程語言。ASP.NET是.NET的一種,ADO.NET又是ASP.NET里邊訪問數據庫的一種技術。
44、WinForm之間的傳值方式
45、Session,Cookie
46、foreach 和 for
47、Response, Request
48、單例模式
49、Javascript,Ajax,Json,XML優點缺點
50、配置文件
