1、簡述 private、 protected、 public、 internal 修飾符的訪問許可權。
private : 私有成員, 在類的內部才可以訪問。
protected : 保護成員,該類內部和繼承類中可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
internal: 在同一名稱空間內可以訪問。
2、C#中的委託是什麼?事件是不是一種委託?
簡單的說:委託是一種方法容器,裡面可以裝載若干個具有相同簽名的方法引用地址,那麼呼叫委託,就相當於同時呼叫了該容器內的所有方法。
委託可以看做一種新的物件型別,具有物件導向的特點,定義時可簽名接收引數,委託例項化時,可以把方法名作為一個引數傳遞給委託物件,
委託可以理解為指向函式的引用。生成的委託物件可以代理所傳遞的方法,可以接收方法的引數。也就是定義了委託,可以在不用呼叫原方法的情況下,呼叫那個方法。
委託可以把一個方法作為引數代入另一個方法。
委託可以理解為指向一個函式的引用。
委託是一種安全的函式指標,事件是一種訊息機制,是一種特殊的委託。
3、override(重寫)與overload(過載)的區別
過載是方法的名稱相同。引數或引數型別不同,進行多次過載以適應不同的需要。
重寫是進行基類中函式的重寫,名稱、引數和引數型別都相同,為了適應需要。
4、在C#中,string str = null 與 string str = “”的區別。
string str = null 是不給他分配記憶體空間,
而string str = “” 給它分配長度為空字串的記憶體空間。
5、物件導向的語言具有________性、_________性、________性
封裝、繼承、多型。
封裝:每個物件都包含有它能進行操作的所有資訊,這個特性稱為封裝。這樣的方法包含在類中,通過類的例項來實現。
好處:
A.良好的封裝能夠減少耦合(比如實現介面和邏輯分離)
B.可以讓類對外介面不變,內部可以實現自由的修改
C.類具有清晰的對外介面,使用者只需呼叫,無需關心內部
D.因為封裝的類功能相對獨立,因此能更好的實現程式碼複用
E.可保護程式碼不被無意中破壞,通過私有欄位等實現內部。注意:這裡的程式碼保護不是指程式碼本身的加密,而是對不想外部更改的程式碼通過私有實現。
要點:
1.封裝,就是把一個物件所能操作的所有資訊放在一起
2.封裝能減少耦合,保持統一的對外介面,內部修改不影響外部呼叫
繼承:
(1) 當一個類A能夠獲取另一個類B中所有非私有的資料和操作的定義作為自己的部分或全部成分時,就稱這兩個類之間具有繼承關係。
(2) 被繼承的類B稱為父類或基類,繼承了父類的類A稱為子類或派生類.
缺點:
缺點一:父類變化,子類不得不變;
缺點二:繼承破壞了包裝,父類的細節暴露給了子類。
要點:
1:父類中的私有成員,派生類是絕不能訪問;
2:C#要求一個類只能有一個直接基類;
3:被“sealed”關鍵字修飾的類將不能被繼承;
4:被“protected”修飾的成員或者資料可以直接被派生類訪問,屬於“可以在家族裡分享的祕密”。
5:善用“base”關鍵字,顯示呼叫合適的自定義基類建構函式而不是使用預設建構函式。
6:繼承需要合理使用才能發揮最佳效果,一般情況下適用於“is a”關係,不適用“has a”關係。
多型:同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。這就是多型,這種特性稱為多型性。
多型的分類:多型性分為兩種,一種是編譯時的多型性,一種是執行時的多型性。
編譯時的多型性:編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的引數、返回的型別等資訊決定實現何種操作。
執行時的多型性:執行時的多型性就是指直到系統執行時,才根據實際情況決定實現何種操作。C#中執行時的多型性是通過覆寫虛成員實現。
要點:
a.多型是物件導向的重要特性之一,指同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。
b.多型分為兩種:一種是編譯時多型,使用過載實現;另一種是執行時多型,使用重寫實現;
c.重寫有兩種,一種使用override關鍵詞,另一種使用new關鍵詞
d.new重寫實際上是對父類方法的隱藏,被覆蓋的父類方法可以呼叫得到。因此new可以重寫(或說是隱藏)的父類方法不一定要定義為虛方法或抽象方法。只是如果父類方法 是虛方法或抽象方法時會覆蓋父類方法,如果不是,則隱藏。
e.過載和覆蓋的發生條件:
過載,必然發生在一個類中,函式名相同,引數型別或者順序不同構成過載,與返回型別無關
重寫,必然發生在基類和派生類中,其類函式用virtual修飾,派生類用override修飾
覆蓋,在子類中寫一個和基類一樣名字(引數不同也算)的非虛擬函式,會讓基類中的函式被隱藏,編譯後會提示要求使用New關鍵字 new 修飾
隱藏,在子類中可以通過new 隱藏父類的方法
f.new覆蓋與重寫、過載的區別:
當子類與父類的引數不同時
當基類函式不是虛擬函式時,基類函式將被隱藏。(因為子類和基類不在同一範圍內,所以不是過載)
當基類函式是虛擬函式時,基類函式將被隱藏。(因為子類和基類不在同一範圍內,所以不是過載;因為引數不同,所以不是重寫)
當子類與父類的引數相同時
當基類函式不是虛擬函式時,基類函式將被隱藏。(因為子類和基類不在同一範圍內,所以不是過載,因為基類不是虛擬函式,所以是隱藏不是重寫)
當基類函式是虛擬函式時,基類函式將被覆蓋。(因為子類和基類不在同一範圍內,所以不是過載)
6、GC是什麼? 為什麼要有GC?
GC是垃圾收集器。程式設計師不用擔心記憶體管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以呼叫下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
7、C#中結構和類有什麼異同?
類是引用型別,可以繼承類、介面和被繼承,有預設的建構函式,有解構函式,可以使用abstract和sealed,有protected修飾符,必須使用new初始化。
結構是值型別,只能繼承介面,不能被繼承,沒有預設的建構函式,可以建立,沒有解構函式,不可以用abstract和sealed,沒有protected修飾符,可以不用new初始化。
8、抽象類(abstract class)和介面(interface)有什麼異同?
抽象類:
(1) 抽象方法只作宣告,而不包含實現,可以看成是沒有實現體的虛方法
(2) 抽象類不能被例項化
(3) 抽象類可以但不是必須有抽象屬性和抽象方法,但是一旦有了抽象方法,就一定要把這個類宣告為抽象類
(4) 具體派生類必須覆蓋基類的抽象方法
(5) 抽象派生類可以覆蓋基類的抽象方法,也可以不覆蓋。如果不覆蓋,則其具體派生類必須覆蓋它們。
介面:
(1) 介面不能被例項化
(2) 介面只能包含方法宣告
(3) 介面的成員包括方法、屬性、索引器、事件
(4) 介面中不能包含常量、欄位(域)、建構函式、解構函式、靜態成員。
(5) 介面中的所有成員預設為public,因此介面中不能有private修飾符
(6) 派生類必須實現介面的所有成員
(7) 一個類可以直接實現多個介面,介面之間用逗號隔開
(8) 一個介面可以有多個父介面,實現該介面的類必須實現所有父介面中的所有成員
相同點:
(1) 都可以被繼承
(2) 都不能被例項化
(3) 都可以包含方法宣告
(4) 派生類必須實現未實現的方法
區 別:
(1) 抽象基類可以定義欄位、屬性、方法實現。介面只能定義屬性、索引器、事件、和方法宣告,不能包含欄位。
(2) 抽象類是一個不完整的類,需要進一步細化,而介面是一個行為規範。微軟的自定義介面總是後帶able欄位,證明其是表述一類“我能做。。。”
(3) 介面可以被多重實現,抽象類只能被單一繼承
(4) 抽象類更多的是定義在一系列緊密相關的類間,而介面大多數是關係疏鬆但都實現某一功能的類中
(5) 抽象類是從一系列相關物件中抽象出來的概念, 因此反映的是事物的內部共性;介面是為了滿足外部呼叫而定義的一個功能約定, 因此反映的是事物的外部特性
(6) 介面基本上不具備繼承的任何具體特點,它僅僅承諾了能夠呼叫的方法
(7) 介面可以用於支援回撥,而繼承並不具備這個特點
(8) 抽象類實現的具體方法預設為虛的,但實現介面的類中的介面方法卻預設為非虛的,當然您也可以宣告為虛的
(9) 如果抽象類實現介面,則可以把介面中方法對映到抽象類中作為抽象方法而不必實現,而在抽象類的子類中實現介面中方法
9、.NET的錯誤處理機制是什麼?
try{可能要出錯的程式碼}
catch{撲捉到錯誤後的處理}
finally{不論程式碼是否出錯都要執行}
10、事務是什麼?
在許多大型、關鍵的應用程式中,計算機每秒鐘都在執行大量的任務。更為經常的不是這些任務本身,而是將這些任務結合在一起完成一個業務要求,稱為事務。
當某一個任務失敗時,就恢復到指定的恢復點,這個叫回滾。
11、什麼是資料庫事務
(1) 事務的三個特性:一致性,原子性,隔離性
(2) 幾個SQL語句,要麼全部執行成功,要麼全部執行失敗,事務的三個操作:Begin,Commit,RollBack。
(3) 取剛插入資料的ID值,就要用事務來隔離。
12、資料庫建立索引的優缺點
優點:使用索引可以加快資料的查詢速度
缺點:由於資料插入過程中會建索引,所以會降低資料的插入,更新速度,索引還會佔用磁碟空間。
13、介面是否可繼承介面? 抽像類是否可實現(implements)介面? 抽像類是否可繼承實體類(concrete class)?
介面可以繼承介面。抽像類可以實現(implements)介面,抽像類是否可繼承實體類,但前提是實體類必須有明確的建構函式。
14、sleep()和wait() 有什麼區別?
sleep()方法是將當前執行緒掛起指定的時間。
wait()釋放物件上的鎖並阻塞當前執行緒,直到它重新獲取該鎖。
.net是一種平臺和框架, .net 不是單純的語言也不是單純的工具,它是從底層平臺開始構建起來的一個整體框架
16、概述反射和序列化?
反射:要給發射下一個定義還是比較難的。反射提供了封裝程式集,模組和型別物件,可以用反射動態地建立型別的例項,將型別繫結到現有物件,或者從現有物件型別裡獲取 型別,然後呼叫型別的方法或訪問欄位和屬性。動態獲取程式集資訊
序列化:將物件轉換為另一種媒介傳輸的格式過程。如,序列化一個物件,用Http通過internet在客戶端和伺服器之間傳遞該物件,在另一端用反序列化從該流中重新得到物件。
17、什麼是虛擬函式?什麼是抽像函式?
虛擬函式:可由子類繼承並重寫的函式。抽像函式:規定其非虛子類必須實現的函式,必須被重寫。
18、什麼是XML?
XML即可擴充套件標記語言。eXtensible Markup Language.標記是指計算機所能理解的資訊符號,通過此種標記,計算機之間可以處理包含各種資訊的文章等。如何定義這些標記,即 可以選擇國際通用的標記語言,比如HTML,也可以使用象XML這樣由相關人士自由決定的標記語言,這就是語言的可擴充套件性。XML是從SGML中簡化修改出來的。它主要用到的有 XML、XSL和XPath等。
19、XML與HTML 的主要區別
1 XML是區分大小寫字母的,HTML不區分。
2 在HTML中,如果上下文清楚地顯示出段落或者列表鍵在何處結尾,那麼你可以省略或者之類的結束標記。在XML中,絕對不能省略掉結束標記。
3 在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個 / 字元作為結尾。這樣分析器就知道不用查詢結束標記了。
4 在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。
5 在HTML中,可以擁有不帶值的屬性名。在XML中,所有的屬性都必須帶有相應的值。
20、error和exception有什麼區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。不可能指望程式能處理這樣的情況。
exception 表示一種設計或實現問題。也就是說,它表示如果程式執行正常,從不會發生的情況。
21、向伺服器傳送請求有幾種方式?
get,post。
get一般為連結方式,post一般為按鈕方式。
22、<%# %>和<% %>的區別?
<%# %>表示繫結的資料來源
<% %>是伺服器端程式碼塊
23、程式和執行緒分別該怎麼理解?
程式是比執行緒大的程式執行單元,都是由作業系統所體會的系統執行單元,一個程式中至少要有一個程式,有一個程式中,至少要有一個執行緒,
執行緒的劃分尺度要比程式要小,程式擁有獨立的記憶體單元,執行緒是共享記憶體,從而極大的提高了程式的執行效率同一個程式中的多個執行緒可以併發執行。
24、如何處理幾十萬條併發資料?
用儲存過程或事務。取得最大標識的時候同時更新..注意主鍵不是自增量方式這種方法併發的時候是不會有重複主鍵的..取得最大標識要有一個儲存過程來獲取.
25、陣列有沒有length()這個方法? String有沒有length()這個方法?
爸爸 王小二=new 大兒子();
爸爸 王小二=new 小兒子();
那我現在叫大兒子過來,王小二可以過來,我叫小兒子過來,王小二也可以過來方便吧。
在做專案的時候, 爸爸 王小二; 這步是我寫的;後面 王小二=new 小兒子();或者new 大兒子()不一定是我寫,那我怎麼知道他到底要的是大兒子還是小兒子,
就算那兩步都是你自己寫,我專案做完了,我如果要修改的話,那我至少宣告的那部分可以不動了吧。也就是說擴充套件了程式的 移植性和可維護性。
UDP—使用者資料包協議,是一個簡單的面向資料包的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料包傳送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料包前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快。