下面的題目是我從網上搜集來的一下面試題,我自己寫的答案,有什麼錯誤的地方請大家也幫我糾正一下。
1. C#中 property 與 attribute的區別,他們各有什麼用處,這種機制的好處在哪裡?
property用法
get/set方法。主要用於類與外部程式之間的資料互動使用。增加了對類內部資料訪問的安全性和方便性,在編譯期就可以進行類型檢查和存取權限檢查。
attribute用法
[STAThread]
public void Thrd(){...}
attribute是一個派生自System.Attribute基類的類。attribute可在反射中被枚舉,查詢。(當編譯器看到一個屬性被附著給一個類型或成員時,它會搜尋
具有指定屬性名稱的System.Attribute衍生類別。如果編譯器沒有找到匹配的類,它就在指定的屬性名稱後面加上Attribute,然後再進行搜尋。因此,常見的使
用做法是將屬性類名定義為以Attribute結尾,在使用時忽略名稱的這一部分。)使用Attribute可以讓使用者把自訂的資訊附屬到實體上,還可以在運行時
動態查詢,這些資訊不僅可以被使用者取出來作為一種類型的標註,它更可以被編譯器所識別,作為編譯時間的一種附屬條件參加程式的編譯。舉例如
[STAThread]和[MTAThread]線程模式屬性,通過這兩個屬性可以指定線程是單線程模式還是多線程模式。(執行緒模式隻影響使用COM interop的應用程
序,將這個屬性應用於不使用COM interop的程式將不會產生任何效果。)
幾個常用的屬性:
AttributeUsage | Class | 指定另一個屬性類的有效使用方式
CLSCompliant | 全部 | 指出程式元素是否與CLS相容
Conditional | Method | 指出如果沒有定義相關聯的字串,編譯器就可以忽略對這個方法的任何調用
DllImport | Method | 指定包含外部方法的實現的DLL位置
STAThread | Method(Main) | 指出程式的預設執行緒模式為STA
MTAThread | Method(Main) | 指出程式的預設模型為多線程(MTA)
Obsolete | 除了Assembly、Module、Parameter和Return | 將一個元素標示為不可用,通知使用者此元素將被從未來的產品
ParamArray| Parameter |允許單個參數被隱式地當作params(數組)參數對待
Serializable| Class、Struct、enum、delegate |指定這種類型的所有公用和私人欄位可以被序列化
NonSerialized |Field| 應用於被標示為可序列化的類的欄位,指出這些欄位將不可被序列化
StructLayout| Class、struct |指定類或結構的資料布局的性質,比如Auto、Explicit或sequential
ThreadStatic |Field(靜態) |實現線程局部儲存(TLS)。不能跨多個線程共用給定的靜態欄位,每個線程擁有這個靜態欄位的副本
2. 講一講你理解的web service,在dot net framework中,怎麼很好的結合xml?
我個人理解web service是跨網路提供服務的一項技術的集合,主要通過各種不同的協議來實現一個服務的支援,比如http(Hypertext Transfer Protocol) 協議,xml(eXtensible Markup Language),soap(Simple Object Access Protocol)協議,WSDL (Web Services Description Language),UDDI (Universal Description, Discovery and Integration)。.net framework中提出了xml web service的概念。這個概念主要闡述了,將xml web service作為一個英特網上進行分散式運算的基礎構架。開放標準和通訊,實現通過人與應用程式的協作,通過xml web service整合應用程式來建立一個平台。應用程式從不同的源中經過xml web service來整合實現。以下是.net關於xml web service的定義:
. xml web service通過一個標準的協議向web使用者公布實用功能。大多數情況下這個協議是SOAP協議。
. xml web service通過一種方法去描述介面,這些資訊必須足夠詳細以便使用者能根據這些資訊去實現一個客戶應用程式。這個描述通常是以一個xml文檔(Web Services Description Language)呈現。
.一旦xml web service被註冊,那麼潛在的使用者可以很容易的通過Universal Discovery Description and Integration 找到這些服務。
3. C#, Java 和 c++的特點,有什麼相同的地方,不同的地方,C#分別從c++和java中吸取了他們那些優點?
(1)文法比較相似
(2)都是物件導向程式設計語言,C#和Java是純物件導向,而c++包含多種編程模式。
(3)C#, Java都有記憶體回收機制,而c++的記憶體釋放需要程式員自己控制。
(4)C#, Java都是被編譯一種中繼語言的模式,然後在運行時由運行環境進行生產機器語言。而c++是直接編譯到機器語言。
(5)C#, Java支援類單繼承和介面多重繼承,而C++支援類多重繼承。
(6)C#從java中吸取了垃圾自動回收,類單繼承和介面多繼承,基於一個運行時環境便於平台移植,
(7)C#,Java沒有指標,C++有
(8)C#加強了Java的屬性概念,並在編譯器進行安全類型檢查和存取控制檢查。C++沒有
(9)C#, Java吸收了C++泛型程式設計的思想,和介面的思想並使其成為語言的一種特性。
(10)C#還支援對象索引機制。
(11)沒有全域變數,都是從一個基類開始,具有自己的類體繫結構,沒有標頭檔概念,都是用層次名稱空間來控制體系。
4. C#可否對記憶體進行直接的操作?
可以直接操作,只不過需要一下系統的API,如OpenMapingFile等。由於在Managed 程式碼中我們不能使用指標,那麼需要使用unsafe標記來聲明來使用指標對記憶體進行操作。如果是關於c#的記憶體配置問題,這個內容比較長,我將在另一篇文章裡進行討論。
5. 用Visual C++ 6.0編寫的代碼(unmanaged code),如何在CLR下和其他dot net component結合?
將unmanaged code 編譯成dll, 然後通過DllImport屬性的方式匯入公開的方法到framework.
6. C#中的委託是什嗎?事件是不是一種委託?
可以把委託看作是經過.net封裝的託管指標,使用委託先要定義委託,然後聲明委託變數,事件是一種委託。
7. 描述一下C#中索引器的實現過程,是否只能根據數字進行索引?
C#中的索引器是通過一個特殊的屬性this[]來實現的,也可以通過其他的類型來進行索引,如字串。
8. C#中要使一個類支援FOREACH遍曆,實現過程怎樣?
類要實現IEnumerable介面, 並通過IEnumerable介面的GetEnumerator();返回一個IEnumerator對象。
class CountryList : IEnumerable {
private ArrayList m_list;
public CountryList () {
m_list = new ArrayList();
m_list.Add("China");
m_list.Add("America");
m_list.Add("England");
}
public IEnumerator GetEnumerator () {
return m_list.GetEnumerator();
}
}
9. 你對XMLHTTP、WEBSERVICE 瞭解嗎?簡單描述其特點、作用?
XMLHTTP是一組API函數集,可被JavaScript、JScript、VBScript以及其它web瀏覽器內嵌的指令碼語言調用,通過HTTP在瀏覽器和web伺服器之間收發XML或其它資料。XMLHTTP最大的好處在於可以動態地更新網頁,它無需重新從伺服器讀取整個網頁,也不需要安裝額外的外掛程式。該技術被許多網站使用,以實現快速響應的動態網頁應用。例如:Google的Gmail服務、Google Suggest動態尋找介面以及Google Map地理資訊服務。
XMLHTTP是AJAX網頁開發技術的重要組成部分。
除XML之外,XMLHTTP還能用於擷取其它格式的資料,如JSON或者甚至純文字。
WebService是由W3C組織定義的“一個軟體系統被設計為支援跨網路實現機器到機器共同操作”。WebService經常使用諸如Web APIs來跨網路訪問並執行遠端系統上的服務。
10. 介面和抽象類別有什麼區別?你選擇使用介面和抽象類別的依據是什嗎?
介面是一個規範和比抽象類別約束更強的類,介面不能擁有實體,而抽象類別可以有實體。在定義規範的時候使用介面,在設計類體系是使用抽象類別。
11. net的錯誤處理機制是什麼
異常處理,通過拋出一個異常,在代碼塊中使用try... catch ... finally關鍵字來實現異常捕獲和處理。.net的所有異常類都是從System.Exception類繼承而來。
12. 您瞭解設計模式嗎?請列出您所知道的設計模式的名稱。
用來在特定環境下解決問題的一個較優方法。
單件模式、橋接模式、原廠模式、抽象原廠模式、構建者模式、適配器模式、觀察者模式、組合模式。
13. 什麼是Application Pool?
應用程式集區是將一個或多個應用程式連結到一個或多個背景工作處理序集合的配置。應用程式集區中的應用程式與其他應用程式被背景工作處理序邊界分隔,所以某個應用程式集區中的應用程式不會受到其他應用程式集區中應用程式所產生的問題的影響。
14. Remoting在用戶端伺服器怎麼實現 ?
15. .什麼叫應用程式定義域?什麼是受管制的代碼?什麼是強型別系統?什麼是裝箱和拆箱?什麼是重載?CTS、CLS和CLR分別作何解釋?
應用程式定義域是一個.net framework提供的執行Managed 程式碼的環境。這個環境是提供了一個隔絕的不可卸載的安全邊界。你可以在一個應用程式定義域裡載入裝配件或可執行程式。並且一個應用程式定義域運行出錯了,可以卸載掉而不用擔心影響其他應用程式定義域的工作。
Managed 程式碼是為面向公用語言運行庫的服務編寫的代碼。
強型別系統是對資料類型有嚴格的要求和限制,每一個變數和每一個運算式都有類型,在使用一個變數前系統都會進行類型檢查。
簡單的說裝箱就是將實值型別轉換成參考型別,而拆箱剛好是相反的過程。
重載就是對於同名函數賦予不同的參數列表,以適應同的訪問需求:如
void Output(string name) {}
void Output(string name, int start) {}
CTS:公用類型系統.主要是為了語言之間的進行標準化處理.
CLS:Common Language Specification.主要是確保代碼可以在任何語言中訪問的最小標準集體
CLR:通用語言執行平台.主要是管理代碼..處理,載入代碼,以及所有服務的代碼