.NET面試題總結(一)


個人面試題總結 + 基礎知識點的整理。。。不斷更新中。。。

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、一列數的規則如下: 112358132134......  求第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、配置文件


免責聲明!

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



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