C#面試基礎題1

一、簡述 private、 protected、 public、 internal 修飾符的訪問權限。(C++中沒有internal)javascript

    private : 私有成員, 在類的內部才能夠訪問 ,也就是類內部的函數等成員能夠訪問。html

    protected : 保護成員,該類內部和繼承類中能夠訪問。前端

    public : 公共成員,徹底公開,沒有訪問限制。java

    internal: 當前程序集內能夠訪問。c++

二、C#中的委託是什麼?事件是否是一種委託?事件和委託的關係。程序員

    委託能夠把一個方法做爲參數代入另外一個方法。委託能夠理解爲指向一個函數的指針。web

    委託和事件沒有可比性,由於委託是類型,事件是對象,下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別事件的內部是用委託實現的。 由於對於事件來說,外部只能「註冊本身+=、註銷本身-=」,外界不能夠註銷其餘的註冊者,外界不能夠主動觸發事件,所以若是用Delegate就無法進 行上面的控制,所以誕生了事件這種語法。事件是用來閹割委託實例的,類比用一個自定義類閹割List。事件只能add、remove本身,不能賦值。事件 只能+=、-=,不能= 。加分的補充回答:事件內部就是一個private的委託和add、remove兩個方法。正則表達式

三、override與重載(overload)的區別數據庫

重載是方法的名稱相同。參數或參數類型不一樣,進行屢次重載以適應不一樣的須要。重載(overload)是面向過程的概念。編程

public void test (String name){
    ......}
public void test (String name,String sex){
    ......}

Override 是進行基類中函數的重寫。Override是面向對象的概念

Class Base
{
   virtual  public void fun();
}

Class A: public Base
{
   public void fun();
}

Class B: public Base
{
 public void fun();
}

四、在dotnet中類(class)與結構(struct)的異同?

Class能夠被實例化,屬於引用類型,是分配在內存的堆上的。類是引用傳遞的。

Struct屬於值類型,是分配在內存的棧上的。結構體是複製傳遞的。加分的回答:Int3二、Boolean等都屬於結構體。

五、堆和棧的區別?

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

堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。

六、C#中的接口(interface)和類(class)、抽象類(abstract class)有什麼異同。

interface與class不一樣點:

       不能直接實例化接口。

       接口不包含方法的實現。

       接口能夠多繼承,類只能單繼承。

       類定義可在不一樣的源文件之間進行拆分。(這句話不知道怎麼理解?考慮1,partial關鍵字中描述C# 2.0 引入了局部類型的概念。局部類型容許咱們將一個類、結構或接口分紅幾個部分,分別實如今幾個不一樣的.cs文件中。

interface與abstract class相同點:

      接口、類和結構均可以從多個接口繼承。

      接口相似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的全部成員。

      接口和類均可以包含事件、索引器、方法和屬性。

interface與abstract class相同點:

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

interface與abstract class不一樣點:

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

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

      接口能夠用於支持回調(CallBack);抽象類不能實現回調,由於繼承不支持。

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

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

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

七、GC是什麼? 爲何要有GC? 

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

八、什麼叫應用程序域?什麼是受管制的代碼?什麼是託管代碼?什麼是強類型系統?什麼是裝箱和拆箱?什麼是重載?CTS、CLS和CLR分別做何解釋?

     應用程序域爲安全性、可靠性、版本控制以及卸載程序集提供了隔離邊界。應用程序域一般由運行庫宿主建立,運行庫宿主負責在運行應用程序以前引導公共語言運行庫。應用程序域提供了一個更安全、用途更廣的處理單元,公共語言運行庫可以使用該單元提供應用程序之間的隔離。

     受管制的代碼:在.Net環境中運行的任何代碼都是受管制的代碼(managed code),.Net外部的代碼也運行在windows上,這些代碼稱爲未受管制的代碼(unmanaged code)。

     使用基於公共語言運行庫的語言編譯器開發的代碼稱爲託管代碼;託管代碼具備許多優勢,例如:跨語言集成、跨語言異常處理、加強的安全性、版本控制和部署支持、簡化的組件交互模型、調試和分析服務等。

      強類型語言是可以禁止任何違反類型系統的代碼的語言,或者說是可以捕獲全部違反類型系統的錯誤的語言。咱們說C++相對於C是強類型的,是由於C++禁止了一些C中的隱式轉換,好比將void*轉換爲任意的指針類型。

      裝箱和拆箱使值類型可以被視爲對象。對值類型裝箱將把該值類型打包到 Object 引用類型的一個實例中。這使得值類型能夠存儲於垃圾回收堆中。拆箱將從對象中提取值類型。

object obj = null;                //引用類型
obj = 1;                         //裝箱,boxing。把值類型包裝爲引用類型。
int i1 = (int)obj;               //拆箱。unboxing(須要使用強制轉換)

     每一個類型成員都有一個惟一的簽名。方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成。只要簽名不一樣,就能夠在一種類型內定義具備相同名稱的多種方法。當定義兩種或多種具備相同名稱的方法時,就稱做重載

public void test (String name){
    ......}
public void test (String name,String sex){
    ......}

CTS通用類型系統 (common type system)

一種肯定公共語言運行庫如何定義、使用和管理類型的規範。

CLR公共語言運行庫

.NET Framework 提供了一個稱爲公共語言運行庫的運行時環境,它運行代碼並提供使開發過程更輕鬆的服務。

CLS公共語言規範

要和其餘對象徹底交互,而無論這些對象是以何種語言實現的,對象必須只向調用方公開那些它們必須與之互用的全部語言的通用功能。爲此定義了公共語言規範 (CLS),它是許多應用程序所需的一套基本語言功能。

9.正則表達式的使用

  9.1 電話

public bool IsTelephone(string str_telephone)
   {
            return System.Text.RegularExpressions.Regex.IsMatch(str_telephone, @"^(\d{3,4}-)?\d{6,8}$");
   }

9.2 手機號碼

public bool IsHandset(string str_handset)
{
    return System.Text.RegularExpressions.Regex.IsMatch(str_handset,@"^[1]+[3,5]+\d{9}");
}

9.3 身份證號碼

public bool IsIDcard(string str_idcard)
{
  return System.Text.RegularExpression.Regex.IsMath(str_idcard,@"(^\d{18}$)|(^\d{15}$)");
}

9.4 驗證數字

public bool IsNumber(string str_number)
 {
   return System.Text.RegularExpressions.Regex.IsMatch(str_number, @"^[0-9]*$");
 }

9.5 驗證郵編

public bool IsPostalcode(string str_postalcode)
{
     return System.Text.RegularExpressions.Regex.IsMatch(str_postalcode, @"^\d{6}$");
}

9.6 驗證郵箱

public bool IsEmail(string str_Email)
{
    return System.Text.RegularExpressions.Regex.IsMatch(str_Email, @"\\w{1,}@\\w{1,}\\.\\w{1,}");
}

十、.Net、ASP.Net、C#、VisualStudio之間的關係是什麼?(傳智播客.Net培訓班原創模擬題)

答:.Net通常指的是.Net Framework,提供了基礎的.Net類,這些類能夠被任何一種.Net編程語言調用,.Net Framework還提供了CLR、JIT、GC等基礎功能。基於.Net語言有C#、VB.Net、F#、PowerShell、IronPython、J#、Ruby.Net。

     ASP.Net是.Net中用來進行Web開發的一種技術,ASP.Net的頁面部分寫在aspx 文件中,邏輯代碼一般經過Code-behind的方式用C#、VB.Net等支持.Net的語言編寫。

     C#是使用最普遍的支持.Net的編程語言。除了C#還有VB.Net、IronPython等。

     VisualStudio是微軟提供的用來進行.Net開發的集成開發環境(IDE),使用 VisualStudio能夠簡化不少工做,不用程序員直接調用csc.exe等命令行進行程序的編譯,並且VisualStudio提供了代碼自動完 成、代碼高亮等功能方便開發。除了VisualStudio,還有SharpDevelop、MonoDevelop等免費、開源的 IDE,VisualStudio Express版這個免費版本。

十一、Http默認的端口號是(80)、Ftp默認的端口號是(21)、SQLServer的默認端口號是(1433)

十二、談談你對設計模式的理解(須要豐富一下

世界上本沒有模式,用的人多了,也就有了模式。不用刻意記每種模式的名字,手中無模式,心中有模式。

大部分設計模式就是接口、抽象類的一個組合。ADO.Net基於接口編程,SafeDbCommand、SafeConnection。SettingsProvider。不必記模式的名字。

1三、BS與CS的聯繫與區別。

C/S是Client/Server的縮寫。客戶端須要安裝專用的客戶端軟件。

B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器。在這種結構下,用戶界面徹底經過WWW瀏覽器實現,一部分事務邏輯在前端實現,可是主要邏輯在服務器端實現。瀏覽器經過Web Server 同數據庫進行數據交互。

C/S 與 B/S 區別:

1).硬件環境不一樣:

  C/S 通常創建在專用的網絡上, 小範圍裏的網絡環境, 局域網之間再經過專門服務器提供鏈接和數據交換服務. 

  B/S 創建在廣域網之上的, 沒必要是專門的網絡硬件環境,例與電話上網, 租用設備. 信息本身管理. 有比C/S更強的適應範圍, 通常只要有操做系統和瀏覽器就行

2).對安全要求不一樣

  C/S 通常面向相對固定的用戶羣, 對信息安全的控制能力很強. 通常高度機密的信息系統採用C/S 結構適宜. 能夠經過B/S發佈部分可公開信息.

  B/S 創建在廣域網之上, 對安全的控制能力相對弱, 可能面向不可知的用戶。

3).處理問題不一樣

  C/S 程序能夠處理用戶面固定, 而且在相同區域, 安全要求高需求, 與操做系統相關. 應該都是相同的系統。C/S的客戶端因爲是本地程序,所以和本地硬件、程序的交互性很強,好比能夠控制本機的其餘程序、能夠讀寫本地磁盤文件、能夠與硬件交互。

  B/S 創建在廣域網上, 面向不一樣的用戶羣, 分散地域, 這是C/S沒法做到的. 與操做系統平臺關係最小,正應爲如此B/S很難和本地硬件、程序、文件進行交互,好比很難控制本機的其餘程序、很難讀寫本地磁盤文件、很難與硬件交互,固然能夠用ActiveX技術解決,好比網銀等就是這麼解決的,這樣作的問題就是可能會被客戶拒絕,並且只侷限於Windows操做系統。

C/S也分爲兩層架構和三層架構。兩層架構:客戶端程序程序直連數據庫;三層架構:客戶端訪問服務端的服務,主要邏輯代碼寫在服務端的服務中,而後服務端服務再去訪問數據庫,Oracle版分佈式呼叫中心,WCF。

14 說出一些經常使用的類、接口,請各舉5個

要讓人家感受你對.Net開發很熟,因此,不能僅僅只列誰都能想到的那些東西,要多列你在作項目中涉及的那些東西。就寫你最近寫的那些程序中涉及的那些類。

經常使用的類:StreamReader、WebClient、Dictionary<K,V>、StringBuilder、SqlConnection、FileStream、File、Regex、List<T>

經常使用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary

要出乎意料!不要僅僅完成任務!

1五、.Net中會存在內存泄漏嗎,請簡單描述。 (*)

所謂內存泄露就是指一個再也不被程序使用的對象或變量一直被佔據在內存中。.Net中有垃圾回收 機制,它能夠保證一對象再也不被引用的時候,即對象編程了孤兒的時候,對象將自動被垃圾回收器從內存中清除掉。雖然.Net能夠回收無用的對象,但 是.Net仍然存在因爲使用不當致使的內存泄露問題。.Net中的內存泄露的狀況:長生命週期的對象持有短生命週期對象的引用就極可能發生內存泄露,儘管 短生命週期對象已經再也不須要,可是由於長生命週期對象持有它的引用而致使不能被回收,這就是.Net中內存泄露的發生場景,通俗地說,就是程序員可能建立 了一個對象,之後一直再也不使用這個對象,這個對象卻一直被引用,即這個對象無用可是卻沒法被垃圾回收器回收的,這就是.Net中可能出現內存泄露的狀況, 例如,緩存系統,咱們加載了一個對象放在緩存中(例如放在一個全局Dictionary對象中),而後一直再也不使用它,這個對象一直被緩存引用,但卻再也不 被使用。使用弱引用那麼及時被引用也能夠被回收。

formManager
{
  public static IList<Form> forms = new .....; 
}

1六、是否能夠從一個static方法內部發出對非static方法的調用?

不能夠。由於非static方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象 上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是 從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方 法內部不能發出對非static方法的調用。

1七、不是說字符串是不可變的嗎?string s="abc";s="123"不就是變了嗎?StringBuilder與String的區別?

String是不可變的在這段代碼中,s原先指向一個String對象,內容是 "abc", 而後咱們將s指向"123",那麼s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另外一個 String對象, 內容爲"123",原來那個對象還存在於內存之中,只是s這個引用變量再也不指向它了。

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

    若是要操做一個不斷增加的字符串,儘可能不用String類,改用StringBuilder 類。兩個類的工做原理不一樣:String類是一種傳統的修改字符串的方式,它確實能夠完成把一個字符串添加到另外一個字符串上的工做沒錯,可是在.NET框 架下,這個操做實在是划不來。由於系統先是把兩個字符串寫入內存,接着刪除原來的String對象,而後建立一個String對象,並讀取內存中的數據賦 給該對象。這一來二去的,耗了很多時間。而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方 法,可以在已有對象的原地進行字符串的修改,簡單並且直接。固然,通常狀況下覺察不到這兩者效率的差別,但若是你要對某個字符串進行大量的添加操做,那麼 StringBuilder類所耗費的時間和String類簡直不是一個數量級的。

1八、Server.Transfer和Response.Redirect的區別是什麼?(不明白)

答: Server.Transfer僅是服務器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;Response.Redirect則是徹底的跳轉,瀏覽器將會獲得跳轉的地址,並從新發送請求連接。這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。

Server.Transfer是服務器請求資源,服務器直接訪問目標地址的URL,把那個 URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。 這個過程當中 瀏覽器和Web服務器之間通過了一次交互。

   Response.Redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求。這個過程當中瀏覽器和Web服務器之間通過了兩次交互。

1九、DataReader和DataSet的異同?

DataReader使用時始終佔用SqlConnection,在線操做數據庫

每次只在內存中加載一條數據,因此佔用的內存是很小的

是隻進的、 只讀的

DataSet則是將數據一次性加載在內存中.拋棄數據庫鏈接..讀取完畢即放棄數據庫鏈接(非鏈接模式)

DataSet將數據所有加載在內存中.因此比較消耗內存...可是確比DataReader要靈活..能夠動態的添加行,列,數據.對數據庫進行 回傳更新操做(動態操做讀入到內存的數據)

20.請敘述const與readonly的區別。(*)

        const 關鍵字用於修改字段或局部變量的聲明。它指定字段或局部變量的值不能被修改。常數聲明引入給定類型的一個或多個常數。

        const數據成員的聲明式必須包含初值,且初值必須是一個常量表達式。由於它是在編譯時就須要徹底評估。

        const成員可使用另外一個const成員來初始化,前提是二者之間沒有循環依賴。

        readonly在運行期評估賦值,使咱們得以在確保「只讀訪問」的前提下,把object的初始化動做推遲到運行期進行。

        readonly 關鍵字與 const 關鍵字不一樣: const 字段只能在該字段的聲明中初始化。readonly 字段能夠在聲明或構造函數中初 始化。所以,根據所使用的構造函數,readonly 字段可能具備不一樣的值。另外,const 字段是編譯時常數,而 readonly 字段可用於運 行時常數。

  readonly 只能在聲明時或者構造函數裏面初始化,而且不能在 static 修飾的構造函數裏面。

2一、什麼是code-Behind技術。

就是代碼隱藏,在ASP.NET中經過ASPX頁面指向CS文件的方法實現顯示邏輯和處理邏輯的分離,這樣有助於web應用程序的建立。好比分工,美工和編程的能夠個幹各的,不用再像之前asp那樣都代碼和html代碼混在一塊兒,難以維護。

一個ASP.NET頁面通常都對應一個隱藏類,通常都在ASP.NET頁面的聲明中指定了隱藏類例如一個頁面Tst1.aspx的頁面聲明以下

<%@ Page language="c#" Codebehind="Tst1.aspx.cs" AutoEventWireup="false" Inherits="T1.Tst1" %>

Codebehind="Tst1.aspx.cs" 代表經編譯此頁面時使用哪個代碼文件

Inherits="T1.Tst1" 表用運行時使用哪個隱藏類

22.寫出一條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)

解答3:ROW_NUMBER(推薦)

 

2五、描述線程與進程的區別?(*)

 

1.線程(Thread)與進程(Process)兩者都定義了某種邊界,不一樣的是進程定義的是應用程序與應用程序之間的邊界,不一樣的進程之間不能共享代碼和數據空間,而線程定義的是代碼執行堆棧和執行上下文的邊界。

 

2.一個進程能夠包括若干個線程,同時建立多個線程來完成某項任務,即是多線程。而同一進程中 的不一樣線程共享代碼和數據空間。用一個比喻來講,若是一個家庭表明一個進程,在家庭內部,各個成員就是線程,家庭中的每一個成員都有義務對家庭的財富進行積 累,同時也有權利對家庭財富進行消費,當面對一個任務的時候,家庭也能夠派出幾個成員來協同完成,而家庭以外的人則沒有辦法直接消費不屬於本身家庭的財 產。

 

加分的回答:舉例,傳智播客的.Net培訓中用多線程(ThreadPool)實現網站蜘蛛的案例。

 

 加分的回答。

 

談談多線程:多線程不必定比單線程快,尤爲是在進行I/O操做的時候,由於浪費了多線程切換的時間。多線程只是爲了充分利用空閒的CPU,提升計算效率。

 

另外,多線程雖然不必定可以提升執行速度,可是至少能夠避免界面卡死的問題,尤爲對於Winform這類程序。

 

2六、什麼是強類型,什麼是弱類型?哪一種更好些?爲何? 
C#中

 

int i=3;

 

i="a";

 

不能夠

 

JavaScript中

 

var i=3;

 

i="a";

 

能夠

 

強類型是在編譯的時候就肯定類型的數據,在執行時類型不能更改,而弱類型在執行的時候纔會肯定類型。

 

沒有好很差,兩者各有好處,強類型安全,由於它事先已經肯定好了,並且效率高。弱類型更靈活,可是效率低,並且出錯機率高

 

通常用於編譯型編程語言,如c++,java,c#,pascal等,弱類型相比而言不安全,在運行的時候容易出現錯誤,但它靈活,多用於解釋型編程語言,如javascript,vb等

 

加分的補充回答:引用傳智播客.net培訓呼叫中心項目中用強類型DataSet的例子,侃一通用強類型DataSet是多麼方便。

 

 

 

2七、什麼是反射?

 

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

 

加分的補充回答:聊用反射實現編輯器動態插件和如鵬網項目中插件體系實現第三方支付和定時任務的案例。

 

 

 

2八、int、DateTime、string是否能夠爲null?

 

int、DateTime不能,由於其爲Struct類型,而結構屬於值類型,值類型不能爲null,只有引用類型才能被賦值null。string能夠爲null。

 

 

 

2九、using關鍵字有什麼用?什麼是IDisposable?

 

using能夠聲明namespace的引入,還能夠實現非託管資源的釋放,實現了IDisposiable的類在using中建立,using結束後會自動調用該對象的Dispose方法,釋放資源。加分的補充回答:using其實等價於try……finally,用起來更方便。

 

int?→Nullable<int>

 

 

 

30、Assembly.Load("foo.dll"); 這句話是否正確?(*)

 

錯誤,正確的應該是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll");

 

 

 

3一、XML 與 HTML 的主要區別

 

1. XML是區分大小寫字母的,HTML不區分。

 

2. 在HTML中,若是上下文清楚地顯示出段落或者列表鍵在何處結尾,那麼你能夠省略</p>或者</li>之類的結束 標記。在XML中,絕對不能省略掉結束標記。

 

HTML:<img src="1.jpg"><br><br>

 

XML:<img src="1.jpg"></img><br/><br/>

 

3. 在XML中,擁有單個標記而沒有匹配的結束標記的元素必須用一個 / 字符做爲結尾。這樣分析器就知道不用 查找結束標記了。

 

4. 在XML中,屬性值必須分裝在引號中。在HTML中,引號是可用可不用的。

 

5. 在HTML中,能夠擁有不帶值的屬性名。在XML中,全部的屬性都必須帶有相應的值。

 

 

 

XML是用來存儲和傳輸數據的

 

HTML是用來顯示數據的

相關文章
相關標籤/搜索