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.CTS、CLS、CLR分別作何解釋?
答: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 class和interface有什么區別?
相同點:
都不能被直接實例化,都可以通過繼承實現其抽象方法。
不同點:
接口支持多繼承;抽象類不能實現多繼承。
接口只能定義行為;抽象類既可以定義行為,還可能提供實現。
接口只包含方法(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
可使用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)
索引就一種特殊的查詢表,數據庫的搜索引擎可以利用它加速對數據的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的數據。索引可以是唯一的,創建索引允許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增加了數據庫的尺寸大小。
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.假設數據庫中有User和Income兩張表如下,請仔細分析下方的示例數據,然后寫出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(); }