.Net常見筆試題


1簡述 private protected public internal 修飾符的訪問權限。

 答:private:私有成員,在類的內部才可以訪問;

       protected:保護成員,該類內部和繼承類中可以訪問;

       public:公共成員,完全公開,沒有訪問限制;

       internal:當前程序集內可以訪問。

2、面向對象的三個特性?

繼承性:就是讓一個類型的對象擁有另一個類型的對象的屬性的方法。繼承后,子類擁有父類的屬性和方法。

封裝性:就是將數據和代碼捆綁在一起,防止外界干擾。

多態性:就是一個事物擁有不同形式的能力。

3.C#中的委托是什么?事件是不是一種委托?

 答:委托可以把一個方法作為參數代入另一個方法。委托可以理解為指向函數的指針。事件不是委托,因為委托是類型,事件是對象。如果非要說事件和委托的關系,就是事件的內部是用委托實現的。

4.override與重載(overload)的區別

答:重載是方法的名稱相同,參數或者參數類型不同,進行多次重載以適應不同的需要。重載是面向過程的;override是進行基類函數的重寫,override是面向對象的。

5..net中類(class)與結構(struct)的異同?

答:class可以被實例化,屬於引用類型,是分配在內存的堆上的,class可以實現接口和單繼承其他類,還可以作為基類型;struct屬於值類型,是分配在內存的棧上的,不能作為基類型,但是可以實現接口。

6.CTSCLSCLR分別作何解釋?

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

7.什么是裝箱和拆箱?

答:從值類型接口轉換到引用類型裝箱。從引用類型轉換到值類型拆箱。

8.什么是受管制(托管)的代碼?

答:托管代碼是運行.NET 公共語言運行時CLR的代碼;unsafe:非托管代碼,不經過CLR運行。程序員自行分配和釋放內存空間。

9.在C#中,string str = null  string str = “” 請盡量使用文字或圖象說明其中的區別。

答:string str = null 是不給他分配內存空間,而string str = "" 給它分配長度為空字符串的內存空間。

10、StringBuilder String 的區別?

String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。所以在大量字符串拼接或頻繁對某一字符串進行操作時最好使用 StringBuilder,不要使用 String

如果要操作一個不斷增長的字符串,盡量不用String類,改用StringBuilder類。兩個類的工作原理不同:String類是一種傳統的修改字符串的方式,它確實可以完成把一個字符串添加到另一個字符串上的工作沒錯,但是在.NET框架下,這個操作實在是划不來。因為系統先是把兩個字符串寫入內存,接着刪除原來的String對象,然后創建一個String對象,並讀取內存中的數據賦給該對象。這一來二去的,耗了不少時間。而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,能夠在已有對象的原地進行字符串的修改,簡單而且直接。當然,一般情況下覺察不到這二者效率的差異,但如果你要對某個字符串進行大量的添加操作,那么StringBuilder類所耗費的時間和String類簡直不是一個數量級的

11、GC是什么? 為什么要有GC?

C/C++中由程序員進行對象的回收像學校食堂中由學生收盤子,.Net中由GC進行垃圾回收像餐館中店員去回收。

GC是垃圾收集器(Garbage Collection)。程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。GC只能處理托管內存資源的釋放,對於非托管資源則不能使用GC進行回收,必須由程序員手工回收,一個例子就是FileStream或者SqlConnection需要程序員調用Dispose進行資源的回收。

12、值類型和引用類型的區別?

1.將一個值類型變量賦給另一個值類型變量時,將復制包含的值。引用類型變量的賦值只復制對對象的引用,而不復制對象本身。

2.值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也可以實現接口。

3.值類型不可能包含 null 值:然而,可空類型功能允許將 null 賦給值類型6

4.每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。

要請求垃圾收集,可以調用下面的方法:GC.Collect()一般不需要手動調用GC.Collect()。當一個對象沒有任何變量指向(不再能使用)的時候就可以被回收了。

13、abstract classinterface有什么區別?

相同點:

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

不同點:

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

接口只能定義行為;抽象類既可以定義行為,還可能提供實現。

接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;

抽象類可以定義字段、屬性、包含有實現的方法。 

接口可以作用於值類型(Struct)和引用類型(Class);抽象類只能作用於引用類型。例如,Struct就可以繼承接口,而不能繼承類

14、能用foreach遍歷訪問的對象的要求?

需要實現IEnumerable接口或聲明GetEnumerator方法的類型。

15、在c#中using和new這兩個關鍵字有什么意義,請寫出你所知道的意義?

using 引入名稱空間或者使用非托管資源,使用完對象后自動執行實現了IDisposable接口的類的Dispose方法。

new 新建實例或者隱藏父類方法。

16、什么是反射?

程序集包含模塊,而模塊又包括類型,類型下有成員,反射就是管理程序集,模塊,類型的對象,它能夠動態的創建類型的實例,設置現有對象的類型或者獲取現有對象的類型,能調用類型的方法和訪問類型的字段屬性。它是在運行時創建和使用類型實例。

17、進程和線程的區別?

進程是系統進行資源分配和調度的單位;線程是CPU調度和分派的單位,一個進程可以有多個線程,這些線程共享這個進程的資源

18、堆和棧的區別?

棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數等都在棧內存中。

堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。

19、ADO.net中常用的對象有哪些?分別描述一下

Connection 數據庫連接對象
Command數據庫命令
DataReader數據讀取器
DataSet數據集

20、Application 、Cookie和 Session 有什么不同?

Application是用來存取整個網站全局的信息,而Session是用來存取與具體某個訪問者關聯的信息。Cookie是保存在客戶端的,機密信息不能保存在Cookie中,只能放小數據;Session是保存在服務器端的,比較安全,可以放大數據。

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

1.使用QueryString, 如....?id=1; response. Redirect()....

2.使用Session變量

3.使用Server.Transfer

4.Cookie傳值

22、談談你對三層架構的理解

通常意義上的三層架構就是將整個業務應用划分為:表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。

區分層次的目的即為了“高內聚,低耦合”的思想。

表現層(UI):通俗講就是展現給用戶的界面,即用戶在使用一個系統的時候的所見所得。

業務邏輯層(BLL):針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。

數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、更新、查找等每層之間是一種垂直的關系。

三層結構是N層結構的一種,一般來說,層次之間是向下依賴的,下層代碼未確定其接口(契約)前,上層代碼是無法開發的,下層代碼接口(契約)的變化將使上層的代碼一起變化。

優點: 分工明確,條理清晰,易於調試,而且具有可擴展性。

缺點: 增加成本。

23、編寫一個單例(Singleton)類?

把構造函數設置為private,設置一個public、static的對象實例

public FileManager

{

    private FileManager(){}

    public readonly static FileManager Instance = new FileManager();

}

24、談談你對MVC和三層架構的理解?

MVC即模型、視圖、控制器,模型表示業務數據及業務處理,用來封裝數據及行為;視圖是用戶看到並與之交互的界面;控制器接受用戶輸入並調用模型和視圖去完成用戶的請求。使用MVC有利於關注點分離,自動化UI測試成為了可能。

三層架構即表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。區分層次的目的即為了“高內聚,低耦合”的思想。表現層通俗講就是展現給用戶的界面,業務邏輯層即針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。數據訪問層:該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、更新、查找等。

25、列舉ASP.Net MVC中,從Action傳值到View(不是從客戶端傳值到Action),有幾種方式?

1、Viewdata  2、Viewbag  3、Model

26、在MVC中如何保持Sessions?

可使用tempdata、viewdata、viewbag三種方式。

其中tempdata:在不同的控制器或動作間轉換時保持數據。另外,進行頁面轉向時,tempdata可以保持數據,它是一個內部的Session變量。

Viewdata:可以在控制器和視圖間保持數據。

Viewbag:它是視圖數據的動態包裝,使用viewbag不需要類型轉換,它使用的是內部動態關鍵詞。

27、MVC中如何做輸入驗證?

在M層使用數據模型的屬性標簽形如[Required],在C層使用ModelState.IsValid屬性檢查數據是否正確,也可在C層使用JavaScript進行數據驗證。

28、MVC有多少種不同類型的結果類型,請詳細描述?

有12種,最主要的是ActionResult類,它是一個基礎類,它有11個子類型。

ViewResult  - 給響應流渲染指定的視圖

PartialViewResult  - 給響應流渲染指定的局部視圖

EmptyResult  - 返回空的響應結果。

RedirectResult  - 執行一個HTTP轉向到指定的URL。

RedirectToRouteResult  -執行一個HTTP轉向到一個URL,這個URL由基於路由數據的路由引擎來決定

JsonResult  - 序列化一個ViewData對像到JSON格式。

JavaScriptResult  - 返回一段javascript代碼,它可以在客戶端執行。

ContentResult  - 寫內容到響應流,不需要視圖支持。

FileContentResult  - 返回一個文件到客戶端。

FileStreamResult  - 返回一個文件到客戶端,它提供的是流。

FilePathResult  - 返回一個文件到客戶端

29、JavaScript中的“==“和”===”區別?

==:判斷兩個變量是否相同,僅限於值,如果值相同而類型不同,那么JavaScript引擎會在內部做類型轉換;

===:判斷兩個變量是否相同,無論是值還是類型,如果類型不同而值相同,也會返回false,而引擎不會在內部進行轉換。

30、JavaScript中的“undefined、null”區別?

通俗地講,undefined出現的原因是JavaScript引擎不知道這是個什么東西,而對於null,JavaScript引擎識別了它,但是沒有被分配內存空間。

undefined的類型就是undefined,而null的類型是object。

31、簡述javascript的作用域和閉包?

js變量的作用域是指:函數內定義的局部變量只在此函數內有效,而全局變量可以全局有效。

閉包的作用就在於能夠改變局部變量的作用域,將值保存下來,但是如果使用不當會造成無法回收變量,引起性能問題,甚至崩潰。

32、不用中間變量交換兩個變量?

int i = 10;

int j = 20;

Console.WriteLine("i={0},j={1}", i, j);

i = i + j;//i=30

j = i - j;//j=10;

i = i - j;//i=20;

Console.WriteLine("i={0},j={1}", i, j);

33.請編程實現一個冒泡排序算法?

答:

      public static void BubbleSort(int[] array)
        {
            if (array == null || array.Length == 0) return;
            for (int i = 0; i < array.Length; i++)
            {  
                for (int j = 0; j < array.Length - 1 - i; j++)
                {
                    if(array[j]>array[j+1])
                    {
                        int temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
        }

34. 一列數的規則如下: 1、1、2、3、5、8、13、21、34......  求第30位數是多少, 用遞歸算法實現。

答:    

      static void Main(string[] args)
        {
            Foo(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); } }

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

       static void Main(string[] args)
        {
            int[] array = GenerateNums(100);
        }
        public static int[] GenerateNums(int length)
        {
            int[] array = new int[length];

            ArrayList list = new ArrayList();
            Random random = new Random();
            while(list.Count < length)
            {
              int num = random.Next(1, length + 1);
                if(!list.Contains(num))
                {
                    list.Add(num);
                }
            }
            for (int i = 0; i < length; i++)
            {
                array[i] = (int)list[i];
            }
            return array;

        }

36.寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer,以自動增長的ID作為主鍵,注意:ID可能不是連續的)

答:解1:  select top 10 * from A where id not in (select top 30 id from A)

      解2:  select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

37、索引的作用?和它的優點缺點是什么?

索引就一種特殊的查詢表,數據庫的搜索引擎可以利用它加速對數據的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的數據。索引可以是唯一的,創建索引允許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增加了數據庫的尺寸大小。

38、什么是事務?什么是鎖?

事務就是被綁定在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上有個節點。為了確保要么執行,要么不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和持久性。

鎖:鎖是實現事務的關鍵,鎖可以保證事務的完整性和並發性。與現實生活中鎖一樣,它可以使某些數據的擁有者,在某段時間內不能使用某些數據或數據結構。當然鎖還分級別的。

39、什么叫視圖?游標是什么?

視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。

游標:是對查詢出來的結果集作為一個單元來有效的處理。游標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用游標,但是需要逐條處理數據的時候,游標顯得十分重要

40、觸發器的作用?

觸發器是一中特殊的存儲過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護數據的完整性和一致性,可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如,某表上的觸發器上包含對另一個表的數據操作,而該操作又會導致該表觸發器被觸發。

41、什么是SQL注入式攻擊?

所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。

42、橫表、縱表轉換

 

縱表結構 TableA 

 

Name

Course

Grade

張三

語文

75

張三

數學

80

張三

英語

90

李四

語文

95

李四

數學

55

 

 橫表結構 TableB

 

Name

語文

數學

英語

張三

75

80

90

李四

95

55

0

 

先理解:

select Name

 (case Course when ‘語文‘ then Grade else 0 end) as 語文,

 (case Course when ‘數學‘ then Grade else 0 end) as 數學,

 (case Course when ‘英語‘ then Grade else 0 end) as 英語

from TableA

然后理解標准答案:

select Name

sum(case Course when ‘語文‘ then Grade else 0 end) as 語文,

sum(case Course when ‘數學‘ then Grade else 0 end) as 數學,

sum(case Course when ‘英語‘ then Grade else 0 end) as 英語

from TableA

group by Name

橫表轉縱表的"SQL"示例

橫表結構: TEST_H2Z

      ID      姓名    語文        數學       英語     

      1       張三     80         90         70           

      2       李四     90         85         95         

      3       王五     88         75         90         

轉換后的表結構

      ID     姓名     科目     成績 

      1       張三     語文     80 

      2       張三     數學     90 

      3       張三     英語     70 

      4       李四     語文     90 

      5       李四     數學     80   

      6       李四     英語     99 

      7       王五     語文     85 

      8       王五     數學     96 

      9       王五     英語     88  

橫表轉縱表SQL示例:
SELECT   姓名,'語文'   AS     科目,語文   AS   成績   FROM   TEST_H2Z   UNION   ALL 
SELECT   姓名,'數學'   AS     科目,數學   AS   成績   FROM   TEST_H2Z   UNION   ALL 
SELECT   姓名,'英語'   AS     科目,英語   AS   成績   FROM   TEST_H2Z
ORDER BY 姓名,科目 DESC; 

43、刪除姓名、年齡重復的記錄

Id  name  age  salary

1   yzk    80  1000

2   yzk    80  2000

3   tom    20  20000

4   tom    20  20000

5   im     20  20000

//取得不重復的數據

select * from Persons where Id in(SELECT     MAX(Id) AS Expr1 FROM         PersonsGROUP BY Name, Age) 

根據姓名、年齡分組,取出每組的Id最大值,然后將Id最大值之外的排除。

刪除重復的數據:

delete from Persons where Id not in(SELECT  MAX(Id) AS Expr1 FROM  Persons GROUP BY Name, Age)

44.假設數據庫中有UserIncome兩張表如下,請仔細分析下方的示例數據,然后寫出SQL,得到右方的查詢結果。

答:select Name,Year,Month,Income from(select UserId,Year,Month,Sum(Amount) Income from Income group by UserId,Year,Month)A join [User] on A.UserId = [User].Id

45.現有如下實體類:

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public class Income
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public decimal Amount { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }    
   }
   public class UserIncomeDto
    {
        public string Name { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }
        public decimal Income { get; set; }
   }

    請用LINQ的方式得到上一題的查詢結果。

public List<UserIncomeDto> GetUserIncomeDtos(List<User> users, List<Income> incomes)
        {
            var query1 = from income in incomes
                         group income by new { income.UserId, income.Year, income.Month } into g
                         select new { g.Key.UserId, g.Key.Year, g.Key.Month, Income = g.Sum(s => s.Amount) };
            var query2 = from income in query1
                         join user in users on income.UserId equals user.Id
                         select new UserIncomeDto() { Name = user.Name, Year = income.Year, Month = income.Month, Income = income.Income };

            return query2.ToList();
        }

 


免責聲明!

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



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