.NET面試題目

基礎知識javascript

什麼是面向對象

        面向對象OO =面向對象的分析OOA +面向對象的設計OOD +面向對象的編程OOPhtml

        通俗的解釋就是萬物皆對象,把全部的事物都看做一個個能夠獨立的對象(單元),它們能夠本身完成本身的功能,而不是像C那樣分紅一個個函數;java

        如今純正的OO語言主要是javaC#C++也支持OOC是面向過程的。c++

闡述面向接口、面向對象、面向方面編程的區別

面向對象很差解釋,能夠理解爲以一切元素都是對象,在設計時以對象爲單位,考慮它的屬性及方法。設計中採用了封裝、繼承、抽象的手法git

面向接口自己就是面向對象的,無所謂區別,只不過面向接口的好處是耦合性低程序員

面向方面Aspect-Oriented Programming (AOP)就是大名鼎鼎的AOP。其實有點象struts裏的攔截。web

        舉例:假設有在一個應用系統中,有一個共享的數據必須被併發同時訪問,首先,將這個數據封裝在數據對象中,稱爲Data Class,同時,將有多個訪問類,專門用於在同一時刻訪問這同一個數據對象。ajax

爲了完成上述併發訪問同一資源的功能,須要引入鎖Lock的概念,也就是說,某個時刻,當有一個訪問類訪問這個數據對象時,這個數據對象必須上鎖Locked,用完後就當即解鎖unLocked,再供其它訪問類訪問。正則表達式

面向對象的思想主要包括什麼?

繼承:子類擁有父類的全部數據和操做。算法

封裝:用抽象的數據類型將數據和基於數據的操做封裝在一塊兒,數據被保護在抽象數據類型內。

多態:一個程序中同名的不一樣方法共存的狀況。有兩種形式的多態–重載與重寫。

抽象類是否能夠繼承實體類?

抽象類能夠繼承實體類,可是有個條件,條件是,實體類必需要有明確的構造函數。

當類T只聲明瞭私有實例構造函數時,則在T的程序文本外部,是否能夠從T派生出新的類,是否能夠直接建立T的任何實例。

不能夠,不能夠

C#中有沒有靜態構造函數,若是有是作什麼用的?

   .靜態構造函數用於初始化類。在建立第一個實例或引用任何靜態成員以前,將自動調用靜態構造函數來初始化類。靜態構造函數既沒有訪問修飾符,也沒有參數。在建立第一個實例或引用任何靜態成員以前,將自動調用靜態構造函數來初始化類。沒法直接調用靜態構造函數。在程序中,用戶沒法控制什麼時候執行靜態構造函數。靜態構造函數的典型用途是:當類使用日誌文件時,將使用這種構造函數向日志文件中寫入項。

什麼是.net?

    .net是一種平臺和框架, .net不是單純的語言也不是單純的工具,它是從底層平臺開始構建起來的一個總體框架

請以圖示方式解釋.net framework?

VB

 

C++

 

C#

 

Jscript

 

 

 

Common Language Specification

 

 

XML Web

services

 

Web Forms

 

Windows Forms

 

 

 

Data and XML

 

 

Base Class Library

 

CLR

 

CLI

 

 

 

 

 

 

Visual Studio .NET

 

程序集與命名空間有什麼不一樣?

        命名空間是用於避免命名衝突,專用於組織代碼,當代碼要在其餘某個應用程序中重用時,能夠下降複雜性。

        程序集是重用代碼的一種方式 驗證控件

不一樣:能夠將相同命名空間中的類部署到不一樣的程序集中,也能夠命名空間中的類部署到一個程序集中 

命名空間

程序集

邏輯編譯時機制

物理編譯時機制

不是運行時實體

是運行時實體

爲源代碼元素的名稱提供邏輯結構

爲可執行文件的運行時提供物理結構

 

 

什麼是WEB控件?使用WEB控件有那些優點?

        WEB控件是能拖放在WEB頁面上的控件

        WEB控件分爲:內部控件,列表控件,複雜控件,

WEB控件優點:

Web控件是對象,與對象同樣,Web控件擁有方法和屬性,而且響應事件

一旦將 Web控件包括在 Web頁中,就能夠設置其屬性並調用其方法

能夠爲 Web控件編寫服務器端代碼以響應在客戶端上發生的事件

ASPNET中共有幾種類型的控件?各有什麼區別?

        WEB控件分爲:內部控件,列表控件,複雜控件,驗證控件

        內部控件:內部控件的使用方法與 HTML控件相同,它們映射到 HTML 元素並經過使用 runat = "server"屬性在服務器上執行

        列表控件:用於在 Web頁中建立數據列表

        複雜控件:當但願控件擁有複雜的功能或使用 HTML元素沒法建立的功能豐富的用戶界面時,能夠使用複雜控件

        驗證控件:輸入控件的數據須要進行準確性和取值範圍方面的檢查

WEB控件能夠激發服務端事件,請談談服務端事件是怎麼發生並解釋其原理?自動傳回是什麼?爲何要使用自動傳回。

   因爲ASP。NET是Web頁面和服務端分離的,所以要產生了服務端事件.

        使用_doPostBack函數可以自動地把客戶端的javascript事件轉變爲一個服務器端的事件

Asp.net框架自動爲咱們處理有關的細節簡化工做。

 

    使用自動傳回的特性:在檢測到一個特定用戶動做時,自動傳回可以將這個頁面傳回服務器以處理

事件.

   在web控件發生事件時,客戶端採用提交的形式將數據交回服務端,服務端先調用Page_Load事件,而後根據傳回的狀態信息自動調用服務端事件自動傳回是當咱們在點擊客戶端控件時,採用提交表單的形式將數據直接傳回到務端。只有經過自動傳回才能實現服務端事件的機制,若是沒有自動回傳機制就只能調用客戶端事件,而不能調用服務端事件

請解釋ASP.NET中以什麼方式進行數據驗證。

   Aps.net中有非空驗證,比較驗證,取值範圍驗證,正則表達式驗證及客戶自定義驗證五大控件,另還有一個集中驗證信息處理控件

什麼是ASP.Net中的用戶控件

用戶控件是可以在其中放置標記和 Web服務器控件的容器。而後,能夠將用戶控件做爲一個單元對待,爲其定義屬性和方法。

用戶控件以ascx擴展名能夠拖到不一樣的頁面中調用以節省代碼好比登錄可能在多個頁面上有就能夠作成用戶控件可是有一個問題就是用戶控件拖到不一樣級別的目錄下后里面的圖片等的相對路徑會變得不許確須要自已寫方法調整

問這樣的問題通常是迷惑你由於新手仍是分不清楚用戶控件和服務器控件(也稱自定義控件)用戶控件通常用在內容多爲靜態或者少量會改變的狀況下,用的比較大,相似ASP中的include。。可是功能要強大的多

WEB控件及HTML服務端控件可否調用客戶端方法?若是能,請解釋如何調用?

能夠調用

例如:<asp:TextBox id="TextBox1" onclick="clientfunction();" runat="server"></asp:TextBox>

<INPUT id="Button2" value="Button" name="Button2"runat="server" onclick="clientfunction();">

C#, Java c++的特色,有什麼相同的地方,不一樣的地方, C#分別從c++java中吸收了他們那些優勢?

C#看起來與Java有着驚人的類似;它包括了諸如單一繼承,界面,Java幾乎一樣的語法,和編譯成中間代碼再運行的過程.可是C#Java有着明顯的不一樣,它借鑑了Delphi的一個特色,COM(組件對象模型)是直接集成。

微軟c#語言定義主要是從CC++繼承而來的,並且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要普遍一些(好比說 structs),它還增長了本身新的特色(比方說源代碼版本定義).

C#Java繼承而來的特色

類:在C#中類的聲明與Java很類似。特色看起來與Java相比沒有變化.

布爾運算:條件表達式的結果是布爾數據類型,布爾數據類型是這種語言中獨立的一種數據類型.從布爾類型到其餘類型沒有直接的轉換過程.布爾常量truefalseC#中的關鍵字.

錯誤處理:如Java中那樣,經過拋出和捕捉異常對象來管理錯誤處理過程.

內存管理:由底層.NET框架進行自動內存垃圾回收.

C#CC++繼承的特色

編譯:程序直接編譯成標準的二進制可執行形式.

結構體:一個C#的結構體與C++的結構體是類似的,由於它可以包含數據聲明和方法.可是,不象C++,C#結構體與類是不一樣的並且不支持繼承.可是,Java相同的是,一個結構體能夠實現界面.

預編譯:C#中存在預編譯指令支持條件編譯,警告,錯誤報告和編譯行控制. #error

C#獨有的特色

中間代碼:微軟在用戶選擇什麼時候MSIL應該編譯成機器碼的時候是留了很大的餘地.微軟公司很當心的聲稱MSIL不是解釋性的,而是被編譯成了機器碼.它也明白許多--若是不是大多數的話--程序員認爲Java程序要不可避免的比C編寫的任何東西都要慢.而這種實現方式決定了基於MSIL的程序(指的是用 C#,Visual Basic,"Managed C++"--C++的一個符合CLS的版本--等語言編寫的程序)將在性能上超過"解釋性的"Java代碼.固然,這一點還須要獲得事實證實,由於C#和其餘生成MSIL的編譯器尚未發佈.可是Java JIT編譯器的廣泛存在使得JavaC#在性能上相對相同."C#是編譯語言而Java是解釋性的,"之類的聲明只是商業技巧.Java的中間代碼和 MSIL都是中間的彙編形式的語言,它們在運行時或其它的時候被編譯成機器代碼.

命名空間中的聲明:當你建立一個程序的時候,你在一個命名空間裏建立了一個或多個類.同在這個命名空間裏(在類的外面)你還有可能聲明界面,枚舉類型和結構體.必須使用using關鍵字來引用其餘命名空間的內容.

基本的數據類型:C#擁有比C,C++或者Java更普遍的數據類型.這些類型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,decimal.Java同樣,全部這些類型都有一個固定的大小.又象CC++同樣,每一個數據類型都有有符號和無符號兩種類型. Java相同的是,一個字符變量包含的是一個16位的Unicode字符.C#新的數據類型是decimal數據類型,對於貨幣數據,它能存放2810進制數字.

兩個基本類:一個名叫object的類是全部其餘類的基類.而一個名叫string的類也象object同樣是這個語言的一部分.做爲語言的一部分存在乎味着編譯器有可能使用它--不管什麼時候你在程序中寫入一句帶引號的字符串,編譯器會建立一個string對象來保存它.

參數傳遞:方法能夠被聲明接受可變數目的參數.缺省的參數傳遞方法是對基本數據類型進行值傳遞.ref關鍵字能夠用來強迫一個變量經過引用傳遞,這使得一個變量能夠接受一個返回值.out關鍵字也能聲明引用傳遞過程,ref不一樣的地方是,它指明這個參數並不須要初始值.

COM的集成:C#Windows程序最大的賣點可能就是它與COM的無縫集成了,COM就是微軟的Win32組件技術.實際上,最終有可能在任何.NET語言裏編寫COM客戶和服務器端.C#編寫的類能夠子類化一個以存在的COM組件;生成的類也能被做爲一個COM組件使用,而後又能使用,比方說, JScript語言子類化它從而獲得第三個COM組件.這種現象的結果是致使了一個運行環境的產生,在這個環境裏的組件是網絡服務,可用用任何.NET語言子類化.

索引下標:一個索引與屬性除了不使用屬性名來引用類成員而是用一個方括號中的數字來匿名引用(就象用數組下標同樣)之外是類似的.

代理和反饋:一個代理對象包括了訪問一個特定對象的特定方法所需的信息.只要把它當成一個聰明的方法指針就好了.代理對象能夠被移動到另外一個地方,而後能夠經過訪問它來對已存在的方法進行類型安全的調用.一個反饋方法是代理的特例.event關鍵字用在將在事件發生的時候被當成代理調用的方法聲明中.

C#中,string str = nullstring str = 「」的區別。

string str = null是不給他分配內存空間string str = ""給它分配長度爲空字符串的內存空

怎樣理解靜態變量?靜態成員和非靜態成員的區別?

靜態變量屬於類,而不屬於對象;並對全部對象所享;靜態成員在加類的時候就被加載

靜態成員和非靜態成員的區別?

   靜態變量使用 static修飾符進行聲明,靜態成員在加類的時候就被加載(在類被實例化時建立,哪一個對),經過類進行訪問

   不帶有static修飾符聲明的變量稱作非靜態變量,在對象被實例化時建立,經過對象進行訪問

   一個類的全部實例的同一靜態變量都是同一個值,同一個類的不一樣實例的同一非靜態變量能夠是不一樣的值

 

   靜態函數的實現裏不能使用非靜態成員,如非靜態變量、非靜態函數等

DataReaderDataSet的異同

DataReader和DataSet最大的區別在於,DataReader使用時始終佔用SqlConnection,在線操做數據庫,任何對SqlConnection的操做都會引起DataReader的異常,由於DataReader每次只在內存中加載一條數據,因此佔用的內存是很小的,由於DataReader的特殊性和高性能。因此DataReader是只進的,你讀了第一條後就不能再去讀取第一條了。

DataSet則是將數據一次性加載在內存中。拋棄數據庫鏈接,讀取完畢即放棄數據庫鏈接,由於DataSet將數據所有加載在內存中。因此比較消耗內存,可是確比DataReader要靈活,能夠動態的添加行,列,數據。對數據庫進行回傳更新操做。

簡述靜態類和靜態成員

        靜態類中的成員都必須是靜態的。靜態類無構造方法,而且是密封類沒法被繼承。

        靜態成員訪問時只能經過類名來訪問,不能經過對象訪問(和JAVA有區別),this也沒法訪問靜態成員。

描述接口的做用

充當類的功能界面,接口裏的成員屬於抽象描述,必須經過類的實現才能使用。如:某個項目有多個模塊組成,每一個模塊由一個開發者完成,開發者只需編寫完模塊功能實現後,留下的接口供其餘人使用。其餘人在程序中,使用接口時,只需知道接口的功能,不瞭解如何實現。

當功能模塊沒法知足須要或功能模塊的需求變動時,程序員只需將該功能模塊的實現代碼進行修改和擴充,而其餘調用接口的程序無須改動。接口的這種應用模式成爲brige模式(即意圖和實現分離

接口反映了面向對象的多態特徵,即經過相同方法獲得不一樣實現。接口也反映了面向對象的封裝特徵,使用者能夠不清楚接口成員的實現細節。

注意:由於接口成員默認的訪問權限是public,因此在實現接口時,類的成員必須爲public,且方法名和參數必須一致。

描述抽象類

        abstract修飾的類。抽象類能夠包含實現的成員。未實現的成員隱含的是virtual屬性,子類實現時必須用override關鍵字。

請解釋接口的顯式實現有什麼意義?

    接口是其餘類型爲確保它們支持某些操做而實現的引用類型。接口從不直接建立並且沒有實際的表示形式,其餘類型必須轉換爲接口類型。一個接口定義一個協定。實現接口的類或結構必須遵照其協定。接口能夠包含方法、屬性、索引器和事件做爲成員。

 

在項目中爲何使用接口?接口的好處是什麼?什麼是面向接口開發?

        接口只是一種約束。使用 interface去定義某些特定的功能,爲的是不要將代碼寫死在自定義類裏,以便在系統開發、過後維護、功能擴充上更有擴展性。

        接口用於描述一組類的公共方法/公共屬性.它不實現任何的方法或屬性,只是告訴繼承它的類至少要實現哪些功能,繼承它的類能夠增長本身的方法.使用接口能夠使繼承它的類:命名統一/規範,易於維護。提供永遠的接口。當類增長時,現有接口方法可以知足繼承類中的大多數方法,不必從新給新類設計一組方法,也節省了代碼,提升了開發效率。

        面向接口開發的好處有結構清晰類間通訊簡單易懂擴展性好提升複用性等等。

        面向接口開發就是指面向抽象協議編程,實現者在實現時要嚴格按協議來辦。

接口和類有什麼異同。

不一樣點:

1、不能直接實例化接口。

2、接口只包含方法或屬性的聲明不包含方法的實現。

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

4、類有分部類的概念,定義可在不一樣的源文件之間進行拆分。

5、表達的含義不一樣,接口主要定義一種規範,統一調用方法,也就是規範類,約束類,類是方法功能的實現和集合

相同點:

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

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

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

您在什麼狀況下會用到虛方法或抽象類,接口?

        若是某個方法可能性在派生類中會被重寫。這時就將該方法寫爲虛方法。

        抽象類:是一個類型,與派生類之間的關係是一個「ISA」的關係。用來作基類,抽象類不能建立對象,類中包括抽象方法和實例方法。

        接口:是設計一個規範,描述了Can do;與實現類之間是中」LINE A的關係,C#中接口不能包含字段訪問修飾符。

對比抽象基類和接口的使用 

        抽象類能有具體實現,而接口只定義行爲規範,不能有具體實現。一個類只能繼承一個父類,但能實現多個接口。 

C#中的接口和抽象類有什麼異同。你選擇使用接口和抽象類的依據是什麼?

        1、繼承:接口支持多繼承;抽象類不能實現多繼承

        2、表達的概念:接口用於規範,抽象類用於共性抽象類是一類事物的高度聚合,那麼對於繼承抽象類的子類來講,對於抽象類來講,屬於""的關係;而接口是定義行爲規範,所以對於實現接口的子類來講,相對於接口來講,是"行爲須要按照接口來完成"

        3、方法實現:對抽象類中的方法,便可以給出實現部分,也能夠不給出;而接口的方法(抽象規則)都不能給出實現部分,接口中方法不能加修飾符

        4、子類重寫:繼承類對於二者所涉及方法的實現是不一樣的。繼承類對於抽象類所定義的抽象方法,能夠不用重寫,也就是說,能夠延用抽象類的方法;而對於接口類所定義的方法或者屬性來講,在繼承類中必須重寫,給出相應的方法和屬性實現。

        5、新增方法的影響:在抽象類中,新增一個方法的話,繼承類中能夠不用做任何處理;而對於接口來講,則須要修改繼承類,提供新定義的方法。

        6、接口能夠做用於值類型(枚舉能夠實現接口)和引用類型;抽象類只能做用於引用類型。

        7、接口不能包含字段和已實現的方法,接口只包含方法、屬性、索引器、事件的簽名;抽象類能夠定義字段、屬性、包含有實現的方法。

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

以下給出二者的簡單對比表格。

 

 接口

 抽象類

多繼承

支持

不支持

類型限制

沒有

有,只能是引用類型

方法實現

繼承類型中必須給出方法實現

繼承類中能夠不給出

擴展性

比較麻煩

相對比較靈活

多層繼承

比較麻煩,須要藉助虛函數

比較靈活

如何選擇:

1、看是否須要多繼承,若是須要就只能使用接口

2、看你在累裏定義的方法是否須要有實現的代碼,若是要,就使用抽象類

3、使不一樣的類型有共同的特性的時候使用接口,由於它支持多繼承,只想從一個類型繼承出不一樣的行爲的子類的時候使用抽象類,能夠在基類裏有代碼實現。
從實現接口和現實抽象類的方法來看,接口是死的,抽象類是活的,固然實現接口的類是活的。

結構和類的區別

簡單的說成class能夠被實例化,屬於引用類型struct屬於值類型,

1)、類型,空間分配。結構是值類型,是分配在內存的棧上的.類時引用類型,,是分配在內存的堆上的。結構實例化能夠不用new,即便用new操做也不會在堆裏分配內存。做參數是按值傳遞,類時引用傳遞,變量用完自動解除內存分配,類須要垃圾回收期

2)、基類。結構繼承自System.ValueType類,所以不具多態性。可是注意,System.ValueType是個引用類型。類繼承自System.Object類;

3)、職能。struct經常使用於存儲數據;而class表現爲行爲

4)、結構沒有類的特性,不支持繼承。但能夠實現接口。

5)、結構沒法聲明無參的構造函數,但能夠聲明有參的構造函數

6)、結構的實例成員不能直接賦初值必須經過構造函數來賦值,但靜態成員能夠直接賦初值

7)、無抽象結構,但有抽象類(abstract

8)、class能夠聲明protected成員、virtual成員、sealed成員和override成員;而struct不能夠,可是值得注意的是,struct能夠重載System.Object3個虛方法,Equals()ToString()GetHashTable()

 

接口與繼承的區別?何時使用接口,何時使用繼承?

(1) 接口定義一個類型須要實現的方法,屬性,索引和事件,包括可能的參數類型和返回值類型,而把具體的實現交由相應的類或結構來作,從而爲組件提供多態能力

(2) 繼承經常使用於在一個現有父類的基礎上的功能擴展,每每是咱們將幾個類中相同的成員提取出來放在父類中實現,而後在各自的子類中加以繼承。

(3) 接口能夠實現多接口繼承,而繼承只能實現單繼承

(4) 實現繼承可繼承父類型的實現,因爲接口中沒有定義方法的實現,所以必須實現繼承後該接口的全部方法。

(5) 爲父類型添加方法可能不影響使用繼承自該類型實現的用戶,而爲接口添加方法致使用戶必須爲新方法添加實現。

(6) 當派生類和基類是is-a的關係是使用"繼承",典型案例"蘋果 is-a 水果",存在can-do的關係時使用"接口"

重載(Overload )和覆寫(Override)的區別

   簡單的說,一個是同一個函數的幾種形式,一個是重寫父類函數,

        重載:當類包含兩個名稱相同但簽名不一樣(方法名相同,參數列表不相同)的方法時發生方法重載。用方法重載來提供在語義上完成相同而功能不一樣的方法。

        覆寫:在類的繼承中使用,經過覆寫子類方法能夠改變父類虛方法的實現。

區別:

        1、方法的覆蓋是子類和父類之間的關係,是垂直關係;方法的重載是同一個類中方法之間的關係,是水平關係。

   2、覆蓋只能由一個方法,或只能由一對方法產生關係;方法的重載是多個方法之間的關係。

   3、覆蓋要求參數列表相同;重載要求參數列表不同。

   4、覆蓋關係中,調用那個方法體,是根據對象的類型(對象對應存儲空間類型)來決定;重載關係,是根據調用時的實參表與形參表來選擇方法體的。

<%# %> <% %>有什麼區別?

<%# %>表示綁定的數據源

<% %>是服務器端代碼塊

值類型和引用類型的區別?寫出C#的樣例代碼。

值類型包括簡單類型、結構體類型和枚舉類型,引用類型包括自定義類、數組、接口、委託等

1、賦值方式:將一個值類型變量賦給另外一個值類型變量時,將複製包含的值。這與引用類型變量的賦值不一樣,引用類型變量的賦值只複製對象的引用,而不復制對象自己。

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

3null:與引用類型不一樣,值類型不可能包含 null值。然而,可空類型功能容許將 null賦給值類型。

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

值類型主要由兩類組成:結構、枚舉

結構分爲如下幾類:Numeric(數值)類型、整型、浮點型、decimalbool、用戶定義的結構。

引用類型的變量又稱爲對象,可存儲對實際數據的引用。聲明引用類型的關鍵字:classinterfacedelegate、內置引用類型: objectstring

5、值類型存貯在中,而引用類型存貯在動態的堆中,棧是先進先出的有系統管理的空間,而堆是由應用程序控制的可隨時申請和釋放該空間,在Donnet中通常狀況下有垃圾收集器處理,他們的不一樣致使在編程上的不一樣。

例:

"a=null"的意思是:a的引用置爲空但此時StringBuilder的堆空間並無被釋放,所以在此以後,輸出b時,仍然能夠輸出mxh

using System;

using System.Text;

classEventDel

{

    staticvoid Main(string[] args)

    {

       StringBuilder a=newStringBuilder();//將StringBuilder的一個首地址傳給a

       StringBuilder b=a;                 //將StringBuilder的一個首地址傳給b

       b.Append("mxh");

       Console.WriteLine(a);

       a=null;

       Console.WriteLine(b);

    }

}

輸出結果:

mxh

mxh

請按任意鍵繼續. . .

 

C#中的委託是什麼?如何理解委託?

簡單的說:委託是一種方法容器,裏面能夠裝載若干個具備相同簽名的方法引用地址,那麼調用委託,就至關於同時調用了該容器內的全部方法。

委託能夠看作一種新的對象類型,具備面向對象的特色,定義時可簽名接收參數,委託實例化時,能夠把方法名做爲一個參數傳遞給委託對象,委託能夠理解爲指向函數的引用。生成的委託對象能夠代理所傳遞的方法,能夠接收方法的參數。也就是定義了委託,能夠在不用調用原方法的狀況下,調用那個方法

 

例:

例:

    publicdelegatestring MyDel(string nm,string pwd);//定義委託簽名接收兩個參數

    staticvoid Main(string[] args)

    {

      MyDel md=newMyDel(方法名)      //定義委託對象,其引用變量指向參數中的方法

      string result=md("張三""1234");//調用委託對象,傳遞所指方法的參數

    }

委託相似於CC++中的函數指針。但不一樣的是委託是面向對象、類型安全的。

委託容許將方法做爲參數進行傳遞。

委託可用於定義回調方法。

委託能夠連接在一塊兒;建立多個對象,使用「+=」累加到同一個委託對象上的引用上,例如,能夠對一個事件調用多個方法。

publicdelegatestringMyDel(string nm,string pwd);//定義委託簽名接收兩個參數

staticvoid Main(string[] args)

{

    MyDel md=new MyDel(方法1);        //委託對象,其引用變量指向參數中的方法

    md+=new MyDel(方法2);

    md+=new MyDel(方法3);

    string result=md("張三""1234");  //調用委託對象,傳遞所指方法的參數

}

方法不須要與委託簽名精確匹配。有關更多信息,請參見協變和逆變。

C# 2。0版引入了匿名方法的概念,此類方法容許將代碼塊做爲參數傳遞,以代替單獨定義的方法。如:

using System;

className

{

    privatestring pName;

    //定義委託類型

    publicdelegate voidmyEventHandler(object sender,NameEventArgs e);

    //定義Get事件

    publicevent myEventHandler Get;

    internalstring Text

    {

       get {returnthis.pName; }

       set{

           //-----------------------------------------------------------2

           this.pName=value;

           this.OnGet(newNameEventArgs("Text屬性被更改了"));

       }

    }

    void OnGet(NameEventArgs e)//----------------------------------------3

    {

       this.Get(this, e); //觸發事件

    }

    publicoverride string ToString()

    {

       return"Name類的對象";

    }

    publicclass NameEventArgs :EventArgs //自定義事件信息類

    {

       string pArgs;

       public NameEventArgs(string s)

       {

           pArgs = s;

       }

       publicoverridestring ToString()

       {return pArgs; }

    }

}

classEventDel

{

    staticvoid Main(string[] args)

    {

       Name myname =newName();

       myname.Get +=newName.myEventHandler(myname_get);//--------------4

       myname.Text ="張三";//--------------------------------------------1

    }

    //用於訂閱事件的myname_get()方法

    staticvoid myname_get(object sender,Name.NameEventArgs e)//---------5

    {

       //輸出事件信息,和事件發佈者的屬性

       Console.WriteLine("事件信息:{0}", e.ToString());

       Console.WriteLine("事件發佈者:{0}", sender.ToString());

       Console.WriteLine("你輸入的名字是:{0}",((Name)sender).Text);

    }

}

結果:

事件信息:Text屬性被更改了

事件發佈者:Name類的對象

你輸入的名字是:張三

請按任意鍵繼續. . .

使用匿名方法,直接將方法體的代碼和委託對象關聯而不須要單獨定義此方法

classEventDel

{

     staticvoid Main(string[] args)

    {

        Name myname=newName();

        myname.Get +=delegate(object sender,Name.NameEventArgs e)

        {

        };

    }

}

也能夠用Lambda表達式把delegate隱藏

classEventDel

{

     staticvoid Main(string[] args)

    {

        Name myname=newName();

        myname.Get += (object sender,Name.NameEventArgs e) =>

        {

        };

    }

}

 

 

事件是否是一種委託?

委託是一種安全的函數指針,事件是一種消息機制

委託與事件是什麼關係?爲何要使用委託

        委託提供了封裝方法的方式,事件是某動做已發生的說明,事件是創建於委託之上

        程序運行時同一個委託可以用來調用不一樣的方法,只要改變它的引用方法便可,所以委託調節器用的方法不是在編譯時決定的,而是在運行時肯定的.

請解釋這種語法現象Session[「name」]=20;

   給類的索引器賦值.

ASP.Net的身份驗證方式有哪些?分別是什麼原理?

Asp.net的身份驗證有有三種,分別是"Windows | Forms | Passport"

window驗證: ASP.NET會結合信息服務 (IIS),爲每一個用戶開啓window賬號驗證其身份安全性較高

forms驗證:爲每一個登錄用戶寫入一個身份驗證票據,在web使用最廣的驗證方式,靈活方便

passport驗證: Microsoft提供的集中身份驗證服務,該服務爲成員站點提供單一登陸和核心配置

什麼是code-Behind技術。

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

新建一個VS.Net下的項目。。看到ASPXRESXCS三個後綴的文件,這個就是代碼分離實現了HTML代碼和服務器代碼分離方便代碼編寫和整理

活動目錄。

活動目錄是window2000的最重要的功能能夠將用戶信息所有集成起來登錄之後能夠訪問多個不一樣的網絡服務。。

活動目錄包括兩個方面:目錄和與目錄相關的服務。安裝了活動目錄的計算機稱爲域控制器,對於用戶而言,只要加入並接受域控制器的管理就能夠在一次登陸以後全網使用,方便地訪問活動目錄提供的網絡資源。對於管理員,則能夠經過對活動目錄的集中管理就可以管理全網的資源。

.Net中讀寫XML的類都歸屬於哪些命名空間?

System.XML命名空間,任何類型的項目均可以經過System.XML命名空間進行XML處理。使用System.Xml命名空間中的XmlDocument類來操做xml的數據

C# Socket所在的命名空間是?

System.Net.Sockets。 Socket類爲網絡通訊提供了一套豐富的方法和屬性。Socket類容許您使用 ProtocolType枚舉中所列出的任何一種協議執行異步和同步數據傳輸。

什麼是SOAP,有哪些應用。

SOAPSimple Object Access Protocol)簡單對象訪問協議是在分散或分佈式的環境中交換信息並執行遠程過程調用的協議,是一個基於XML的協議。使用SOAP不用考慮任何特定的傳輸協議(最經常使用的仍是HTTP協議),能夠容許任何類型的對象或代碼,在任何平臺上,以任何一直語言相互通訊。這種相互通訊採用的是XML格式的消息。

SOAP是一種輕量級協議,用於在分散型、分佈式環境中交換結構化信息。 SOAP利用 XML技術定義一種可擴展的消息處理框架,它提供了一種可經過多種底層協議進行交換的消息結構。這種框架的設計思想是要獨立於任何一種特定的編程模型和其餘特定實現的語義。

如何理解.Net中的垃圾回收機制。

垃圾回收器每次進行垃圾回收時,對堆上的對象進行檢查,把沒有被任何變量引用的對象銷燬。但並非檢查堆上的每一個對象,而是將對象進行分類,將全部對象分類三代(generation)。生命週期越短(新建立的對象)代數越小,反之越大。

在堆空間不夠用時,垃圾回收器回收垃圾,檢查第0代對象,若是發現沒有被引用的對象,則標記這些爲「垃圾」,並銷燬。而倖存的部分的第0代對象將升級爲第1代對象,某些標記爲「垃圾」的對象也會倖存而升級。這時若是堆空間仍然不夠用(如建立比較大的新對象),垃圾收集器將會檢查第1代對象,將沒有引用的對象進行銷燬。倖存部分升級爲第2代對象,當內存堆空間仍然不夠用時,檢查第2代對象,不過第2代對象檢查後仍然是第2代對象,不會繼續升級。

 

若是發現內存不夠則垃圾回收器將所有對象做爲無效對象(被回收對象)而後先將全局變量static處於活動中的局部變量以及當前CG指針指向的對象放入一個表中而後會搜索新列表中的對象所引用的對象加入列表中其餘沒有被加入列表的對象都會被回收

垃圾回收器優化引擎根據正在進行的分配狀況肯定執行回收的最佳時間。當垃圾回收器執行回收時,它檢查託管堆中再也不被應用程序使用的對象並執行必要的操做來回收它們佔用的內存。

   三個generation,當每一個generation內存滿了的時候檢查引用,無引用就回收內存

經常使用的調用webservice方法有哪些?

1.使用WSDL.exe命令行工具。

2.使用VS.NET中的Add Web Reference菜單選項

什麼是XML?列舉一下你所瞭解的XML技術及其應用

   XML便可擴展標記語言。eXtensible Markup Language.標記是指計算機所能理解的信息符號,經過此種標記,計算機之間能夠處理包含各類信息的文章等。如何定義這些標記,便可以選擇國際通用的標記語言,好比HTML,也能夠使用象XML這樣由相關人士自由決定的標記語言,這就是語言的可擴展性。XML是從SGML中簡化修改出來的。它主要用到的有XMLXSLXPath等。

   xml能夠用來作網頁(xslt)xml能夠看成數據庫xml能夠用來保存對象的系列化xml用於配置用於保存靜態數據類型接觸XML最多的是web Servicesconfig

XML HTML的主要區別

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

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

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

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

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

C#propertyattribute的區別,他們各有什麼用處,這種機制的好處在哪裏?

   property和attribute漢語都稱之爲屬性。

   property一個是屬性,用於存取類的字段,類向外提供的數據區域,

        attribute一個是特性,用來標識類,方法等的附加性質,描述對象在編譯時或運行時屬性的.

C#能否對內存進行直接的操做?

        這個問題比較難回答,也是個很大的問題。可是能夠這樣問答。C#是能夠對內存進行直接操做的,雖然不多用到指針,可是C#是能夠使用指針的,在用的時候須要在前邊加unsafe,,在.net中使用了垃圾回收機制(GC)功能,它替代了程序員,不過在C#中不能夠直接使用finalize方法,而是在析構函數中調用基類的finalize()方法。

用最有效的方法算出23次方8等於幾?

2<<3.

維護數據庫的完整性、一致性、你喜歡用觸發器仍是自寫業務邏輯?爲何

觸發器,性能好,事務性

ADO.NET相對於ADO等主要有什麼改進?

   簡單的說,ADO.NET新增dataset等,不須要隨時保持鏈接,性能提升.

1:ADO.Net不依賴於ole db提供程序,而是使用.net託管提供的程序,

2:不使用com

3:不在支持動態遊標和服務器端遊

4:,能夠斷開connection而保留當前數據集可用

5:強類型轉換

6:xml支持

        您能夠經過將 ADO.NET的各項功能與 ActiveX數據對象 (ADO)的特定功能進行比較來理解 ADO.NET的功能。

        1、數據的內存中表示形式

         ADO中,數據的內存中表示形式爲記錄集。在 ADO.NET中,它爲數據集。它們之間有重要的差別。

        2、表的個數

        記錄集看起來像單個表。若是記錄集將包含來自多個數據庫表的數據,則它必須使用 JOIN查詢,未來自各個數據庫表的數據組合到單個結果表中。相反,數據集是一個或多個表的集合。數據集內的表稱爲數據表;明確地說,它們是 DataTable對象。若是數據集包含來自多個數據庫表的數據,它一般將包含多個 DataTable對象。即,每一個 DataTable對象一般對應於單個數據庫表或視圖。這樣,數據集能夠模仿基礎數據庫的結構。

        數據集一般還包含關係。數據集內的關係相似於數據庫中的外鍵關係,即它使多個表中的行彼此關聯。例如,若是數據集包含一個有關投資者的表和另外一個有關每一個投資者的股票購買狀況的表,則數據集可能還包含一個關係來鏈接投資者表的各個行和購買表的對應行。

        因爲數據集能夠保存多個獨立的表並維護有關表之間關係的信息,所以它能夠保存比記錄集豐富得多的數據結構,包括自關聯的表和具備多對多關係的表。

        3、數據導航和遊標

         ADO中,您使用 ADO MoveNext方法順序掃描記錄集的行。在 ADO.NET中,行表示爲集合,所以您能夠像依次經過任何集合那樣依次經過表,或經過序號索引或主鍵索引訪問特定行。DataRelation對象維護有關主記錄和詳細資料記錄的信息,並提供方法使您能夠獲取與正在操做的記錄相關的記錄。例如,從 Investor表的"Nate Sun"的行開始,能夠定位到 Purchase表中描述其購買狀況的那組行。

        "遊標"是數據庫元素,它控制記錄導航、更新數據的能力和其餘用戶對數據庫所作更改的可見性。ADO.NET不具備固有的遊標對象,而是包含提供傳統遊標功能的數據類。例如,在 ADO.NET DataReader對象中提供只進、只讀遊標的功能。有關遊標功能的更多信息,請參見數據訪問技術。

        4、將打開鏈接的時間降至最低

         ADO.NET中,打開鏈接的時間僅足夠執行數據庫操做,例如"選擇"(Select)"更新"(Update)。您能夠將行讀入數據集中,而後在不保持與數據源的鏈接的狀況下使用它們。

         ADO中,記錄集能夠提供不鏈接的訪問,但 ADO主要是爲鏈接的訪問設計的。

        ADO ADO.NET中的不鏈接處理之間存在一個顯著差別。在 ADO中,經過調用 OLE DB提供程序來與數據庫通訊。但在 ADO.NET中,您經過數據適配器(OleDbDataAdapterSqlDataAdapterOdbcDataAdapter OracleDataAdapter對象)與數據庫通訊,這將調用 OLE DB提供程序或基礎數據源提供的 APIADO ADO.NET之間的主要區別在於:

         ADO.NET中,數據適配器容許您控制將對數據集所作的更改傳輸到數據庫的方式,方法是實現性能優化、執行數據驗證檢查或添加其餘任何額外處理。

        注意:數據適配器、數據鏈接、數據命令和數據讀取器是組成 .NET Framework數據提供程序的組件。Microsoft和第三方供應商可能會提供其它提供程序,這些提供程序也可集成到 Visual Studio中。有關不一樣 .NET數據提供程序的信息,請參見 .NET數據提供程序。

        5、在應用程序間共享數據

        在應用程序間傳輸 ADO.NET數據集比傳輸 ADO不鏈接的記錄集要容易得多。若要將 ADO不鏈接的記錄集從一個組件傳輸到另外一個組件,請使用 COM封送。若要在 ADO.NET中傳輸數據,請使用數據集,它能夠傳輸 XML流。相對於 COM封送,XML文件的傳輸提供如下便利之處:

 

更豐富的數據類型 COM封送提供一組有限的數據類型(由 COM標準定義的那些類型)。因爲 ADO.NET中的數據集傳輸基於 XML格式,因此對數據類型沒有限制。所以,共享數據集的組件能夠使用這些組件通常會使用的任何豐富的數據類型集。

        6、性能

        傳輸大型 ADO記錄集或大型 ADO.NET數據集會使用網絡資源;隨着數據量的增加,施加於網絡的壓力也在增長。ADO ADO.NET都使您能夠最大限度地下降所傳輸的數據。但

        ADO.NET還提供另外一個性能優點:ADO.NET不須要數據類型轉換。而須要 COM封送來在組件間傳輸記錄集的 ADO,則須要將 ADO數據類型轉換爲 COM數據類型。

        7、穿透防火牆

        防火牆能夠影響試圖傳輸不鏈接的 ADO記錄集的兩個組件。請記住,防火牆一般配置爲容許 HTML文本經過,但防止系統級請求(如 COM封送)經過。由於組件使用 XML交換 ADO.NET數據庫,因此防火牆能夠容許數據集經過。

ASP.NetASP相比,主要有哪些進步?

asp解釋型,aspx編譯型,性能提升,有利於保護源碼

ASP的缺點:

VBScriptJavaScript是在ASP中僅可以使用的兩種腳本語言。它們是基本的非類型化語言。在ASP中不能使用強類型語言.

ASP頁面須要解釋,使得它執行速度較慢。

ASP頁面很是凌亂。

在使用ASP建立WEB應用程序時,程序員和設計人員必須在同一文件上一塊兒工做。

ASP中,必須經過編寫代碼來提供所需的任何功能。

ASP中沒有對代碼給予太多的關注。

ASP中沒有調試機制。

ASP中。必須中止WEB服務器才能安裝DLL的新版本,而且在應用程序中使用DLL的新版本以前,必須先在註冊表中註冊它,並且,DLL註冊過程很是複雜。

ASP.NET的優勢:

ASP.Net中支持強類型語言.

ASP.Net頁將被編譯而不是解釋,這樣它們的執行速度就比ASP頁快。

ASP.Net提供聲明性服務器控件。

ASP.Net經過繼承機制來支持代碼的重用。

ASP.Net具備Trace的內置方法,能夠幫助對頁面進行調試。

ASP.Net中,置於應用程序的BIN目錄中的任何組件將自動對應用程序可用.

你對XMLHTTPWEBSERVICE瞭解嗎?簡單描述其特色、做用

xmlhttp能夠主動獲取遠端web代碼,相似HttpWebRequest

存儲過程和函數的區別

存儲過程是編譯好的存儲在數據庫的操做,函數不用說了。

Session,ViewState,Application,cookie的區別?

Session:用於保持狀態的基於 Web服務器的方法。Session容許經過將對象存儲在Web服務器的內存中在整個用戶會話過程當中保持任何對象。主要用於保持代碼隱藏類中對象的狀態。爲每一個用戶建立的,用於存儲單個用戶,由於他是相對每一個用戶的.因此可能來取得在線人數等。

ViewState:主要用於保持 Web頁上控件的狀態。當 Web頁上的控件被綁定到代碼隱藏類中的對象。

Application用於存儲全部用戶均可視的信息.因此它存儲的是要讓全部用戶共享的一些信息.如總訪問數等Cache,頁面緩存。

Cookie:一般咱們都把它放在客戶端,也能夠存儲在服務器端。主要用它存儲用戶的個性設制,和登錄信息。

 

請說明在.Net中經常使用的幾種頁面間傳遞參數的方法,並說出他們的優缺點。

1、queryString url參數 簡單,顯示於地址欄,長度有限

優勢:簡單易用;資源佔用比較少。

缺點:傳遞數據大小有限制,只能傳遞基本類型的數據,安全性差

2、session(viewstate)

優勢:簡單,靈活性強,能傳遞複雜的對象

缺點:但易丟失,資源消耗大

3、cookie

優勢:簡單,

缺點:但可能不支持,可能被僞造,大小有限制不能超過4KB不恩可以存儲複雜對象

4、this.Server.Transfer,

優勢:URL地址不變,安全性高,靈活性強,能傳遞複雜的對象

缺點:資源消耗大

5、hidden control/viewstate 簡單,可能被僞造

6、static member。 

7、cache 

8、application

優勢:全局

缺點:資源消耗大

9、DataBase 數據庫 穩定,安全,但性能相對弱

10、xml or other  Files 

11、XMLHTTP or Hidden iFrame/frame 

12、Context.user.identity 

   我正在作一個通用提示頁面,全部頁面出現問題都要,傳遞幾個變量字符串到同一個頁面hitMsgaspx變量字符串包括提示語言,即將跳轉的頁面,跳轉時間。在上面的種方案中哪一個更好些

  (1)queryString的毛病是沒法傳遞很長字符串,好比系統錯誤信息每每就一整個屏幕。 

  (2)session的毛病是不能過多使用,容易丟失。 

  (3)cookie的毛病是依賴客戶端設置,不可靠。 

  (4)server.transfer的毛病是接收頁面要爲發送頁面準備好,只能定製專門一個頁面接受定製好的頁面。不能是一個頁面接受任何頁面。 

  (5)hidden control/viewstate只能傳遞本頁。除非特殊製做。 

  (6)static member沒法保證線程安全,可能會此處栽瓜他處得豆。 

  (7)cache不適合使用一次就扔的變量。 

  (8)application全局的,開銷大。 

  (9)DataBase全局固化的開銷更大,除非作日誌跟蹤。 

  (10)xml or othe Files全局固化的開銷大,除非作日誌跟蹤。 

  (11)XMLHTTP or Hidden iFrame/frame,作這個過於煩瑣。 

  (12)Context這個佔用了用戶id,不適合作這個。

若是在一個B/S結構的系統中須要傳遞變量值,可是又不能使用SessionCookieApplication,您有幾種方法進行處理?

input type="hidden"簡單,可能被僞造

url參數 簡單,顯示於地址欄,長度有限

數據庫 穩定,安全,但性能相對弱

this.Server.Transfer,在新頁面得到值的代碼以下:

if (Page.PreviousPage != null)

{

   TextBox st =

       (TextBox)Page.PreviousPage.FindControl("TextBox1");

   if (st != null)

   {

       Label1.Text = SourceTextBox.Text;

   }

}

ASP.NET頁面跳轉的幾種方法

超連接跳轉

<a>標籤

1. <a href=」test.aspx」></a>

2.這是最多見的一種轉向方法;

HyperLink控件

1.Asp.net服務器端控件屬性NavigateUrl指定要跳轉到的Url地址

2. NavigateUrl是能夠在服務器端使用代碼修改,這個區別於<a>

3.因爲HyperLink自己沒有事件因此要在服務器端其它事件中設置NavigateUrl

4.代碼示例

<Asp:HyperLink id=」hyperlink」 runat=」server」 NavigatoeUrl=」test.aspx」>

ok</Asp:HyperLink>

Response.Redirect()方法

1.過程:發送一個Http響應到客戶端,通知客戶端跳轉到一個新的頁面,而後客戶端再發送跳轉請求到服務器端。

2.頁面跳轉以後內部控件保存的全部信息丟失,當A跳轉到BB頁面將不能訪問A頁面提交的數據信息。

3.使用這個方法使用這個方法跳轉後瀏覽器地址欄的Url信息改變

4.能夠使用Session Cookies Application等對象進行頁面間的數據傳遞

5.重定向操做發生在客戶端,總共涉及到兩次與Web服務器的通訊:一次是對原始頁面的請求,另外一次是重定向新頁面的請求


Server.Transfer()方法

1.實現頁面跳轉的同時將頁面的控制權進行移交

2.頁面跳轉過程當中Request Session等保存的信息不變,跳轉以後能夠使用上一個頁面提交的數據

3.跳轉以後瀏覽器地址欄的Url不變

4.這種方法的重定向請求是在服務器端的進行的,瀏覽器不知道頁面已經發生了一次跳轉

Server.Execute()方法

1.該方法容許當前頁面執行同一個Web服務器上的另外一個頁面

2.頁面執行完畢以後從新回到原始頁面發出Server.Execute()的位置。

3.這種方式相似針對頁面的一次函數調用被請求的頁面能夠使用原始頁面的表單數據和查詢字符串集合

4.被調用頁面的Page指令的EnableViewStateMac屬性設置爲False

經過超連接怎樣傳遞中文參數?

URLEncode URLDecode

請說出強名的含義

對程序集,進行公鑰/私鑰對簽名,稱爲強名。用名稱,版本,文化,公鑰惟一肯定程序集

具備本身的key,能夠在GAC爲公用

請列出c#中幾種循環的方法,並指出他們的不一樣

For :使用於肯定次數的循環

Foreach:使用於遍歷的元素只讀

While:次數不肯定條件隨機變化

Do…while:次數不肯定條件隨機變化,但至少要保證能被執行一次

請指出.Net中全部類型的基類

Object

C#中有沒有運算符重載?可否使用指針?

        有,重載操做符意味着使該操做符具備不一樣的行爲;使用操做符能夠使方程式簡單易懂;重載運算符使用operator關鍵字來建立一個運算符方法,只能在類或結構中使用 Operator

        例:下面的代碼示例使用 Operator語句定義一個結構的大綱,該結構包括 AndOr運算符的運算符過程。And Or每一個都採用兩個類型爲 abc的操做數,並返回類型 abc。這些定義容許調用代碼經過 abc類型的操做數來使用 AndOr

Public Structure abc

   Public Shared Operator And(ByVal x As abc, ByVal y As abc) As abc

       Dim r As New abc

       ' Insert code to calculate And of x and y.

       Return r

   End Operator

   Public Shared Operator Or(ByVal x As abc, ByVal y As abc) As abc

       Dim r As New abc

       ' Insert code to calculate Or of x and y.

       Return r

   End Operator

End Structure

        能使用指針, C#中不多須要使用指針,但仍有一些須要使用的狀況。例如,在下列狀況中使用容許採用指針的不安全上下文是正確的:

處理磁盤上的現有結構

涉及內部包含指針的結構的高級 COM或平臺調用方案

性能關鍵代碼

        不鼓勵在其餘狀況下使用不安全上下文。具體地說,不該該使用不安全上下文嘗試在 C#中編寫 C代碼。

C#能否對內存進行直接的操做?(這但是個難點哦?要注意!)

        C#unsafe模式下能夠使用指針對內存進行操做,但在託管模式下不能夠使用指針,C#NET默認不運行帶指針的,須要設置下,選擇項目右鍵->屬性->選擇生成->「容許不安全代碼」打勾->保存

using System;

publicclassProgram

{

    publicstatic void Main()

    {

       int n = 123;

       unsafe

       {

           int* p = &n;

           Console.WriteLine("{0:X}", n);

           Console.WriteLine("{0:X}", *p);

           Console.WriteLine("{0}", p->ToString());

       }

    }

}

結果:

7B

7B

123

請按任意鍵繼續. . .

Visual C++ 6.0編寫的代碼(unmanaged code),如何在CLR下和其餘dot net component結合?

 

        net Com互操做.net中能夠經過添加引用的方式將COM加載在CLR下,將原有的COM中的類型相應變化爲.Net下可識別的類型

私有程序集與共享程序集有什麼區別?

        一個私有程序集一般爲單個應用程序所使用,而且存儲於這個應用程序所在的目錄之中,或此目錄下面的一個子目錄中。共享程序集一般存儲在全局程序集緩存(Global Assembly Cache)之中,這是一個由.NET運行時所維護的程序集倉庫。共享程序集一般是對許多應用程序都有用的代碼庫,好比.NET Framework類。

私有程序集:

默認狀況下,C#程序編譯爲私有程序集

須要放在應用程序所在的文件夾中

程序集的名稱在應用程序中應當是惟一的

共享程序集:

能夠被不一樣的應用程序共享

在全部使用程序集的應用程序中,程序集名稱應當是惟一的

放在全局程序集緩存中

什麼是GAC?它解決了什麼問題?

        Gloal Assembly Cache,全局應用程序集緩存。它解決了幾個程序共享某一個程序集的問題。沒必要再將那個被共享的程序集拷貝到應用程序目錄了,其實這道理很簡單,.net應用程序在加載的時候,會首先查看全局應用程序集緩存,若是有就能夠直接使用,沒有再到應用程序目錄進行查找。

請指出GAC的含義

   全局程序集緩存(Global Assembly Cache)可全局使用的程序集的緩存。大多數共享程序集都安裝在這個緩存中,其中也安裝了一些私有程序集。存放共享程序的文件夾,可被任何項目使用

在全局程序集緩存中部署的應用程序必須具備強名稱。.Net提供的命令行工具gacutil.exe用於支持這一功能。gacutil.exe能夠將具備強名稱的程序集添至全局程序集緩存。

怎樣理解靜態變量?

全部實例公用一個的變量

向服務器發送請求有幾種方式?區別?

get postget通常爲連接方式,post通常爲按鈕方式。主要區別以下:

1get從服務器上獲取數據,post向服務器傳送數據

2get把參數隊列加到表單Action所指定的URL地址中,值和表單內的各個字段一一對應,在URL中能夠顯示出來。post把表單中的各個字段及其內容放到HTML Header裏,一塊兒傳送到Action所指定的URL地址中,不會在URL中能夠顯示出來

3、對於get,服務器端用Request.QueryString獲取變量提交的值,對於post服務器端用Request.Form獲取提交的數據。

4、因受到URL長度的限制,get傳輸的數據量少,不能大於2Kpost傳輸的數據量較大,通常默認沒限制。理論上IIS5中爲100K,最大能夠達到2M

5get安全性低,post安全性高

軟件開發過程通常有幾個階段?每一個階段的做用?

需求分析,架構設計,代碼編寫,QA,部署

需求分析,概要設計,詳細設計,軟件編碼,軟件測試

可行性分析需求分析實施和編碼,測試,維護

分析(須要,概要,詳細),開發(編程,單元測試),測試(集成測試),維護。

有哪幾種方法能夠實現一個類存取另一個類的成員函數及屬性,並請舉列來加以說明和分析。

取:類在封裝時將屬性及函數設置成public

存:繼承

同一個名稱控件直接,或者反射

若是需記錄類的實例個數,該如何實現,請寫一個簡單的類於以證實。

const static int classNum=0;

classNum++;

A類是B類的基類,而且都有本身的構造,析構函數,請舉例證實B類從實例化到消亡過程當中構造,析構函數的執行過程。

構造先父後子,析夠反之

須要實現對一個字符串的處理,首先將該字符串首尾的空格去掉,若是字符串中間還有連續空格的話,僅保留一個空格,即容許字符串中間有多個空格,但連續的空格數不可超過一個。

string inputStr=" xx xx ";

inputStr=Regex.Replace(inputStr.Trim()," *"," ");

new有幾種用法

1new運算符,建立對象,調用構造函數

2new修飾符覆蓋方法,隱藏父類的成員public new XXXX(){}

3new約束用於在泛型聲明中,約束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。當泛型類建立類型的新實例時,將此約束應用於類型參數,當與其餘約束一塊兒使用時,new()約束必須最後指定。如:

public class ItemFactory<T> where T : IComparable, new()

{

}

c#usingnew這兩個關鍵字有什麼意義,請寫出你所知道的意義?

using引入名稱空間或者使用非託管資源

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

下面這段代碼輸出什麼?爲何?

   int i=5;

   int j=5;

   if (Object.ReferenceEquals(i,j))

       Console.WriteLine("Equal");

   else

       Console.WriteLine("Not Equal");

輸出Not Equal。不相等,由於比較的是對象。ReferenceEquals(object a,object b),裏面的兩個參數是object對象

寫一個實現對一段字符串翻轉的方法,附加一些條件,如其中包括,對其設計測試用例

inputStr=inputStr.ToCharArray().Reverse().ToString();

Singleton如何寫設計模式

static屬性裏面new,構造函數private

什麼是Application Pool

Web應用,相似Thread Pool,提升併發性能

鏈表和數組的區別,各有什麼優缺點。

一個能夠動態增加,一個固定(VB中能夠Redim),性能數組教好

什麼是友元函數?

friendly聲明,能夠訪問protect級別方法

什麼是虛函數?

能夠被重寫

什麼是抽象函數?

必須被重寫

什麼是內存泄漏,怎樣最簡單的方法判斷內存泄漏 ?

C++,C中忘了釋放內存,內存不會再次分配

C#中有不少類被定義爲public有什麼意義?

        public關鍵字將公共訪問權限授予一個或多個被聲明的編程元素。對公共元素的可訪問性沒有限制。

Internal修飾符有什麼含義?

        internal關鍵字是類型和類型成員的訪問修飾符。內部成員只有在同一程序集中的文件內纔是可訪問的。內部訪問一般用於基於組件的開發,由於它使一組組件可以以私有方式進行合做,而沒必要嚮應用程序代碼的其他部分公開。例如,用於生成圖形用戶界面的框架能夠提供控件類和窗體類,這些類經過使用具備內部訪問能力的成員進行合做。因爲這些成員是內部的,它們不向正在使用框架的代碼公開。在定義具備內部訪問能力的成員的程序集外部引用該成員是錯誤的。

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

private :私有成員, 在類的內部才能夠訪問。

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

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

internal:在同一命名空間內能夠訪問。

JAVA的代碼是半編譯半解釋的C#的代碼是否也是這樣

        C#源碼通過語言編譯器執行第一次編譯,變爲中間語言,而後再由CLR編譯成可執行代碼.

進程和線程的區別

1、單位:進程是系統進行資源分配和調度的單位;線程是CPU調度和分派的單位。

2、一個進程能夠有多個線程,這些線程共享這個進程的資源。

        進程是比線程大的程序運行單元,都是由操做系統所體會的系統運行單元,一個程序中至少要有一個進程,有一個進程中,至少要有一個線程,線程的劃分尺度要比進程要小。

3、進程擁有獨立的內存單元,線程是共享內存,從而極大的提升了程序的運行效率同一個進程中的多個線程能夠併發執行。

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

成員變量和成員函數前加static的做用

   它們被稱爲常成員變量和常成員函數,又稱爲類成員變量類成員函數。分別用來反映類的狀態。好比類成員變量能夠用來統計類實例的數量,類成員函數負責這種統計的動做。

mallocnew的區別

   new是C++的關鍵字。malloc在分配內存時必須按給出的字節分配,new能夠按照對象的大小自動分配,而且能調用構造函數。能夠說new是對象的對象,而malloc不是。本質上new分配內存時,還會在實際內存塊的先後加上附加信息,因此new所使用的內存大小比malloc多。

堆和棧的區別

   棧:編譯期間就分配好的內存空間,是由是操做系統(編譯器)自動分配和釋放的,棧上的空間是有限的。程序在編譯期間變量和函數分配內存都是在棧上進行的,且在運行時函數調用時的參數的傳遞也是在棧上進行的。

   堆:程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。通常由程序員分配釋放。用new、malloc等分配內存函數分配獲得的就是在堆上。

   棧是機器系統提供的數據結構,而堆則是C/C++函數庫提供的。

   棧是系統提供的功能,特色是快速高效,缺點是有限制,數據不靈活;而棧是函數庫提供的功能,特色是靈活方便,數據適應面普遍,可是效率有必定下降。棧是系統數據結構,對於進程/線程是惟一的;堆是函數庫內部數據結構,不必定惟一。不一樣堆分配的內存沒法互相操做。棧空間分靜態分配和動態分配兩種。靜態分配是編譯器完成的,好比自動變量(auto)的分配。動態分配由alloca函數完成。棧的動態分配無需釋放(是自動的),也就沒有釋放函數。爲可移植的程序起見,棧的動態分配操做是不被鼓勵的!堆空間的分配老是動態的,雖然程序結束時全部的數據空間都會被釋放回系統,可是精確的申請內存/釋放內存匹配是良好程序的基本要素。

.Net中,類System.Web.UI.Page能夠被繼承麼?

能夠

你以爲ASP.Net 20VS2005)和你之前使用的開發工具(.Net 10或其餘)有什麼最大的區別?你在之前的平臺上使用的哪些開發思想(pattern / architecture)可

1 ASP.Net 2。0把一些代碼進行了封裝打包,因此相比1。0相同功能減小了不少代碼。

2同時支持代碼分離和頁面嵌入服務器端代碼兩種模式,之前1。0版本,.Net提示幫助只有在分離的代碼文件,沒法在頁面嵌入服務器端代碼得到幫助提示,

3代碼和設計界面切換的時候,2。0支持光標定位。這個我比較喜歡

4在綁定數據,作表的分頁。UPDATE,DELETE,等操做均可以可視化操做,方便了初學者

5, 在ASP.Net中增長了40多個新的控件,減小了工做量

.Net的錯誤處理機制是什麼

   .Net錯誤處理機制採用try->catch->finally結構,發生錯誤時,層層上拋,直到找到匹配的Catch爲止。

如何把一個array複製到arrayList

1foreach( object o in array )

arrayList.Add(o);

2string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s);

3string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(s);

 

DataGrid.Datasouse能夠鏈接什麼數據源

DataTableDataViewDataSetDataViewManager

任何實現IListSourceIList接的組件

概述反射和序列化

反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您能夠使用反射在運行時動態地建立類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。而後,能夠調用類型的方法或訪問其字段和屬性

經過反射命名空間中的類以及 System.Type能夠使用反射在運行時動態地建立類型的實例,而後調用和訪問這些實例。也能夠獲取有關已加載的程序集和在其中定義的類型(如類、接口和值類型)的信息

序列化:序列化是將對象轉換爲容易傳輸的格式的過程。例如,能夠序列化一個對象,而後使用 HTTP 經過 Internet 在客戶端和服務器之間傳輸該對象。在另外一端,反序列化將從該流從新構造對象。

概述o/r mapping的原理

利用反射,配置 將類於數據庫表映射

sealed修飾的類有什麼特色

sealed修飾符用於防止從所修飾的類派生出其它類。若是一個密封類被指定爲其餘類的基類,則會發生編譯時錯誤。

密封類不能同時爲抽象類。

sealed修飾符主要用於防止非有意的派生,可是它還能促使某些運行時優化。具體說來,因爲密封類永遠不會有任何派生類,因此對密封類的實例的虛擬函數成員的調用能夠轉換爲非虛擬調用來處理。

UDP鏈接和TCP鏈接的異同。

        UDP是用戶數據報協議,是一個簡單的面向數據報的傳輸協議,是不可靠的鏈接。

        TCP是傳輸控制協議,提供的是面向鏈接的,是可靠的,字節流服務,當用戶和服務器彼此進行數據交互的時候,必須在他們數據交互前要進行TCP鏈接以後才能傳輸數據。TCP提供超時重撥,檢驗數據功能。

        前者只管傳,無論數據到不到,無須創建鏈接。後者保證傳輸的數據準確,需要連結。

.net中讀寫數據庫須要用到哪些類?列舉ADO.Net中的五個主要對象,他們的做用

        Connection用來建立一個到數據庫的鏈接

        DataAdapter用來將數據填充到DataSet,在數據源和DataSet間起數據傳輸

        DataSet能夠視爲一個暫存區(Cache),把從數據庫中所查詢到的數據保留起來用來無鏈接的儲存多個表的數據,幷包含表與表之間的關聯關係。

   DataTable用來存儲一個表的數據

        DataReader用來順序讀取數據。由於DataReader在讀取數據的時候限制了每次只讀取一筆,並且只能只讀,因此使用起來不但節省資源並且效率很好。使用DataReader對象除了效率較好以外,由於不用把數據所有傳回,故能夠下降網絡的負載。

        Command用來執行SQL語句

是否能夠繼承string

String類是sealed類故不能夠繼承。

.net Remoting的工做原理是什麼?

服務器端向客戶端發送一個進程編號,一個程序域編號,以肯定對象的位置。

Remoting的做用?

        採用分佈式進行編程的一種技術,Remoting主要用於管理跨應用程序域的同步和異步RPC(遠程過程調用協議Remote Procedure Call protocol)會話。在默認狀況下,Remoting使用 HTTP TCP協議,並使用 XML編碼的 SOAP或本機二進制消息格式進行通訊。.NET Remoting提供了很是靈活和可擴展的編程框架,而且他能夠管理對象的狀態。

講一講你理解的web service,dot net framework中,怎麼很好的結合xml?

   從表面上看,Web Service就是一個應用程序,它向外界暴露出一個可以經過Web進行調用的API。這就是說,你可以用編程的方法經過Web調用來實現某個功能的應用程序。從深層次上看,Web Service是一種新的Web應用程序分支,它們是自包含、自描述、模塊化的應用,能夠在網絡(一般爲Web)中被描述、發佈、查找以及經過Web來調用。可擴展的標記語言XML是Web Service平臺中表示數據的基本格式。除了易於創建和易於分析外,XML主要的優勢在於它既與平臺無關,又與廠商無關。XML是由萬維網協會(W3C)建立,W3C制定的XML SchemaXSD定義了一套標準的數據類型,並給出了一種語言來擴展這套數據類型。Web Service平臺是用XSD來做爲數據類型系統的。當你用某種語言如VB.NETC#來構造一個Web Service時,爲了符合Web Service標準,全部你使用的數據類型都必須被轉換爲XSD類型。如想讓它使用在不一樣平臺和不一樣軟件的不一樣組織間傳遞,還須要用某種東西將它包裝起來。這種東西就是一種協議,如 SOAP

remotingwebservice(簡述webservice中概念和原理)

   簡單的說,WS主要是可利用HTTP,穿透防火牆。而Remoting能夠利用TCP/IP,二進制傳送提升效率。 

1Remoting能夠靈活的定義其所基於的協議,若是定義爲HTTP,則與Web Service就沒有什麼區別了,通常都喜歡定義爲TCP,這樣比Web Service稍爲高效一些。

2Remoting不是標準,而Web Service是標準。

3Remoting通常須要經過一個WinForm或是Windows服務進行啓動,而Web Service則須要IIS進行啓動。

4、在VS.net開發環境中,專門對Web Service的調用進行了封裝,用起來比Remoting方便。

我建議仍是採用Web Service好些,對於開發來講更容易控制。Remoting通常用在C/S的系統中,Web Service是用在B/S系統中,後者仍是各語言的通用接口,相同之處就是都基於XML

爲了能清楚地描述Web ServiceRemoting之間得區別,我打算從他們的體系結構上來講起:

Web Service大致上分爲5個層次:

1.HTTP傳輸信道

2.XML數據格式

3.SOAP封裝格式

4.WSDL描述方式

5.UDDI體系框架

整體上來說,.NET下的 Web Service結構比較簡單,也比較容易理解和應用,通常來說在.NET結構下的WebService應用都是基於.net framework以及IIS的架構之下,因此部署(Dispose)起來相對比較容易點。

從實現的角度來說,首先WebService必須把暴露給客戶端的方法所在的類繼承於:System.Web.Services.WebService這個基類;其次所暴露的方法前面必須有[WebMethod]或者[WebMethodAttribute]

WebService的運行機理。首先客戶端從服務器的到WebServiceWSDL,同時在客戶端聲稱一個代理類(Proxy Class)

這個代理類負責與WebService服務器進行RequestResponse,當一個數據(XML格式的)被封裝成SOAP格式的數據流發送到服務器端的時候,就會生成一個進程對象而且把接收到這個RequestSOAP包進行解析,而後對事物進行處理,處理結束之後再對這個計算結果進行SOAP包裝,而後把這個包做爲一個Response發送給客戶端的代理類(Proxy Class),一樣地,這個代理類也對這個SOAP包進行解析處理,繼而進行後續操做。這就是WebService的一個運行過程。

下面對.NET Remoting進行歸納的闡述:

.NET Remoting是在DCOM等基礎上發展起來的一種技術,它的主要目的是實現跨平臺、跨語言、穿透企業防火牆,這也是他的基本特色,與WebService有所不一樣的是,它支持HTTP以及TCP信道,並且它不只能傳輸XML格式的SOAP包,也能夠傳輸傳統意義上的二進制流,這使得它變得效率更高也更加靈活。並且它不依賴於IIS,用戶能夠本身開發(Development)並部署(Dispose)本身喜歡的宿主服務器,因此從這些方面上來說WebService其實上是.NET Remoting的一種特例。

1RemotingMarshByReference的,能夠傳變量的引用,直接對服務器對象操做。速度快,適合Intranet企業內部互聯網)。WebServiceMarshByValue的,必須傳對象的值。速度慢,能夠過FIREWALL,配置比較簡單,適合Internet因特網)。

2、通常來講,Remoting是和平臺相關的不跨平臺的,須要客戶和服務器都是.NET,但可配置特性比較好,能夠自定義協議。WebService能夠作到跨平臺通訊,但必須採用SOAP協議。

3 SOAP消息有RPC和文檔兩種樣式。文檔樣式的body元素中包含一個或多個元素,能夠是任何內容,只要接受者理解就好了。rpc樣式的的body元素中包含調用的方法或遠程過程的名稱,以及表明方法參數的元素。 

web service數據傳輸有什麼限制?爲何?DataTable能夠做爲web service參數傳遞麼?

所傳輸的數據必須是可序列化的。由於須要轉換爲XML格式以能夠穿越防火牆,作到真正的數據共享。由於DataSet處理DataTable的序列化以便進行封送處理,因此沒法傳遞單個DataTable

在 ADO.NET的三個基本數據對象 — DataReader、DataTable和 DataSet中,只有 DataSet 能夠與 Web 服務之間傳遞。這是由於,爲了與 Web服務進行通訊,對象必須是可序列化的。(序列化是一個過程,它用於將對象的公共屬性轉換爲 XML,而且由於 XML只是純文本,因此能夠將其從一個應用程序傳輸到另外一個應用程序,而且能夠穿越防火牆,從而克服了 COM的主要障礙之一。)DataReader 沒法序列化,由於它們須要到服務器的開放鏈接。而且,由於 DataSet處理 DataTable的序列化以便進行封送處理,因此您也沒法傳遞單個 DataTable。讓咱們研究一些示例。

傳遞 DataSet

假設咱們正在運行一個訂閱 Web服務,該服務可返回所請求的有價證券在給定日期的收盤價格。用戶傳入用戶 ID和密碼,以及他/她但願看到的有價證券和收盤價格的 DataTable。Web服務隨後驗證他/她的成員身份並返回一個 DataTable,其中包含股票符號和它們的收盤價格,或者包含錯誤信息。

因爲使用者應用程序(即,「消耗」該 Web服務的應用程序)的開發人員須要知道股票符號和錯誤信息的指望結構,所以 DataSet須要遵照您提供的發佈規範。出於咱們的目的,咱們將假設如下條件:股票符號將存儲在一個 DataTable中,它包含三個列:一個名爲 Symbol、類型爲 varchar(5)的列,一個名爲 ClosingDate、類型爲 datetime的列,以及一個名爲 Price、類型爲 float 的列。若是在此過程當中的任什麼時候候生成錯誤,都將在一個只包含一列的 DataTable中返回錯誤信息 — 該列的名稱爲 ErrorMessage,類型爲 varchar(100),而且包含錯誤信息。經過簡單地引用所返回 DataTable的列 count,開發人員能夠知道該過程是否成功。

經常使用的調用webservice方法有哪些?

能夠從瀏覽器、ASP頁或其餘WEB服務調用能夠使用HTTP-GET  HTTP-POST訪問WEB服務也能夠從ASP頁或其餘WEB服務向其餘WEB服務發出SOAP請求HTTP-GET  HTTP-POST SOAP  使用WEB服務代理

使用ASMXXML Web服務與使用SOAP.NET Remoting的區別?

SOAP是簡單對象訪問協議,Web服務正是經過WSDL來約定服務器和客戶端基於xmlSOAP來通信,而不管客戶端和服務器都不須要知道對方的平臺、編程語言等信息

.NET Remoting本質是爲了交互更爲複雜的對象,甚至須要管理遠程對象的生命週期,因此客戶端必須瞭解服務器對象的詳細信息,雖然.NET Remoting支持使用SOAP,但對於客戶端來講仍是必須瞭解服務器對象的詳細信息。

Web服務使用的消息機制,而Remoting採用的RPC. Web Service能用於不一樣平臺,不一樣語言,Remoting只適用於.Net。效率上Remoting高於Xml Web Service

解釋一下UDDIWSDL的意義及其做用。

        UDDI統一描述、發現和集成協議(UDDI, Universal Description, Discovery and Integration)是一套基於Web的、分佈式的、爲Web服務提供的信息註冊中心的實現標準規範,同時也包含一組使企業能將自身提供的Web服務註冊以使得別的企業可以發現的訪問協議的實現標準。UDDI提供了一組基於標準的規範用於描述和發現服務,還提供了一組基於因特網的實現

        WSDL描述Web服務的公共接口。這是一個基於XML的關於如何與Web服務通信和使用的服務描述。這是一個基於XML,關於如何與Web服務通信和使用的服務描述;

裝箱和拆箱的含義

裝箱:將值類型轉換爲引用類型。拆箱:將引用類型轉換爲值類型。

        裝箱是值類型到 object類型或到該值類型所實現的任何接口類型的隱式轉換。將一個值的值裝箱會分配一個對象實例並將該值複製到新的對象中。

        取消裝箱是從 object類型到值類型或從接口類型到實現該接口的值類型的顯式轉換。取消裝箱操做包括:

檢查對象實例,確保它是給定值類型的一個裝箱值。

將該值從實例複製到值類型變量中。

 

int i=0;

Syste.Object obj=i;

   這個過程就是裝箱!就是將i裝箱!

   拆箱就是將一個引用型對象轉換成任意值型!好比:

int i=0;

System.Object obj=i;

int j=(int)obj;

   這個過程前2句是將i裝箱,後一句是將obj拆箱!再寫個代碼,看看進行了幾回裝拆箱!

int i=0;

System.Object obj=i;

Console.WriteLine(i+","+(int)obj);

   其中共發生了3次裝箱和一次拆箱!^_^,看出來了吧?!第一次是將i裝箱,第2次是輸出的時候將i轉換成string類型,而string類型爲引用類型,即又是裝箱,第三次裝箱就是(int)obj的轉換成string類型,裝箱!拆箱就是(int)obj,將obj拆箱!!

頁面生命週期 (關於如下生命週期這部分,建議你們上網找找更詳細的資料來看)

頁面生命週期執行一系列步驟:頁面的初始化實例化控件還原和維護狀態、運行事件處理程序代碼、呈現。爲了在合適的階段執行所需的代碼,因此要對頁面生命週期很是熟悉。在頁生命週期的各個階段,頁面會逐個引起定義的事件,經過對代碼開發,在頁面的生命事件中執行咱們所須要的程序

頁生命週期階段

1頁請求:發生在頁面生命週期以前,用戶請求頁時,ASP.NET將肯定是否須要分析和編譯頁,從而肯定是否開始頁面的生命週期,或者是否能夠在不運行頁的狀況下發送頁面緩存以進行響應。

2開始:設置頁屬性,如:HttpContext以及其餘屬性;在此階段,頁面須要肯定是回發請求仍是新請求,並設置IsPostBack屬性;設置頁面的UICulture屬性。

3頁面初始化:加載全部主題;控件生成,並設置UniqueID

注:ViewStateControlState中的值還未加載至控件;若是頁面是回發,則回發數據也還未加載;故此時控件能夠訪問,但值可能出錯。

4加載:若是當前請求是回發請求,則爲控件加載ViewStateControlState中的值。

5驗證:調用全部驗證程序控件的Validate方法,此方法將設置驗證程序控件和頁的IsValid屬性。

6回發事件處理:若是請求是回發請求,則調用全部事件處理程序。

7呈現:首先對該頁和全部控件進行保存視圖狀態,而後對每一個控件調用Render方法,它會提供一個文本編寫器,用於將控件的輸入寫入頁的Response屬性的OutputStream中。

8卸載:完成呈現,並已將頁發送至客戶端、準備丟棄該頁後,調用卸載。將卸載屬性如:ResponseRequest等等。

頁生命週期事件:

1PreInit

完成操做:檢查IsPostBack屬性來肯定是否是第一次處理該頁;

   建立或從新建立動態控件

   動態設置主控頁

   動態設置Theme屬性

   讀取或設置配置文件屬性

注:若是請求是回發請求,則控件的值還沒有從視圖狀態恢復,即:不該該在此事件中設置控件屬性。

2Init

完成操做:在全部控件都已經初始化而且應用全部外觀設置後引起。使用該事件來讀取和初始化控件屬性。

3InitComplete

完成操做:由Page對象引起,使用該事件來處理要求完成全部初始化工做的任務。

4PreLoad

完成操做:爲頁和全部控件加載視圖狀態,而後處理Request實例包括的任何回發數據。
注:若是須要在Load以前對頁或控件進行處理,須要該事件。

5Load

完成操做:以遞歸方式加載全部控件。

6、控件事件

完成操做:處理控件引起的事件。

注:在回發請求中,若是頁包含驗證程序控件,請在執行任何處理以前檢查Page和各個驗證控件的IsValid屬性。

7LoadComplete

8PreRender

在控件輸出前最後的修改機會。

注:在該事件發生前的操做:

Page對全部控件遞歸進行EnsureChildControl操做

設置了DataSourceID屬性的數據綁定控件會調用DataBind方法。

9SaveStateComplete

在該事件發生前,已經對控件的ViewState進行了保存。將忽略對頁和控件所做的全部修改。

10Render

方法,便於開發

11UnLoad

大概描述一下ASP.NET服務器控件的生命週期

初始化 加載視圖狀態 處理回發數據 加載 發送回發更改通知 處理回發事件 預呈現 保存狀態 呈現 處置 卸載

應用程序生命週期

在應用程序的生命週期期間,應用程序會引起可處理的事件並調用可重寫的特定方法。若要處理應用程序事件或方法,能夠在應用程序根目錄中建立一個名爲Global.asax的文件。若是建立了Global.asax文件,ASP.NET會將其編譯爲從HttpApplication類派生的類,而後使用該派生類表示應用程序。

HttpApplication進程的一個實例每次只處理一個請求。因爲在訪問應用程序類中的非靜態成員時不須要將其鎖定,這樣能夠簡化應用程序的事件處理過程。這樣還能夠將特定於請求的數據存儲在應用程序類的非靜態成員中。例如,能夠在Global.asax文件中定義一個屬性,而後爲該屬性賦一個特定於請求的值。

Application_StartApplication_End方法是不表示HttpApplication事件的特殊方法。在應用程序域的生命週期期間,ASP.NET僅調用這些方法一次,而不是對每一個HttpApplication實例都調用一次。

asp.net頁面在何時產生?又在何時銷燬?

(1)Page_Init();---初始化對象

這一過程主要是初始化包括頁面自己的全部控件,每次的頁面載入就會執行一次初試過程,而在這裏面訪問到的也是控件的初始值。還有就是能夠經過OnInit()來重載初試化事件

(2) LoadViewState---導入Viewstate數據

在初試化事件後,在loadvireState事件中全部控件將得到他們的第一個屬性ViewState屬性,這個屬性最終將被返回給服務器以判斷這個頁面是已經被用戶訪問完畢仍是仍然在被

用戶所訪問。也可重載loadvireState事件對相應的控件進行值設定。

(3) Load Postback data;---用LoadPostData處理Postback數據

Postback數據也能夠理解成就是服務器頁面提交的表單數據,每一次表單數據的提交都會觸發執行IPostBackDataHandler接口操做的控件。

(4) Page_Load();---導入對象

這個過程就比較熟悉了,也是在頁面的每次載入時必定會執行,可是注意和PageInit()之間的區別,全部的對象第一次被佈置在DOM頁面(在Asp.net中稱控件樹)裏了而且能夠經過代碼或是相關的位置被引用。這樣,對象就能夠很容易的從客戶端得到諸如寬度、高度、值、可見性等在Html中的屬性值。常常會用到的Page.IsPostBack()指示該頁是否正爲響應客戶端回發而加載,或者它是否正被首次加載和訪問.

(5) Handle control events;---具體的控件事件

這個過程執行的是相應具體控件事件,好比按鈕事件..等。

(6) Page_PreRender();---預先呈遞對象

預先呈遞對象能夠改變對象並將改變保存的最後時刻.能夠對控件的屬性、控件樹的結構等作出最後的修改,同時還不用考慮Asp.net對其做出任何改變,由於此時已經脫離了數據庫調用以及viewstate更新了,也能夠經過OnPreRender來重載。

(7) Page_Render();---呈遞對象呈遞頁面

全部對頁面控件的修改完成後viewstate就被保存了。運用Html建立給瀏覽器輸出的頁面的時候Render事件就發生了。在Render事件過程當中,頁面調用其中的對象將它們呈遞給Html。而後,頁面就能夠以Html的形式被用戶的瀏覽器訪問了。當Render事件被重載時,開發者能夠編寫自定義的Html代碼使得原先生成的Html都無效而按照新的Html來組織頁面。

   Render方法將一個HtmlTextWriter對象做爲參數並用它將Html在瀏覽器上以網頁的形式顯示。這時仍然能夠作一些修改動做,不過它們只是客戶端的一些變化而已了。亦能夠重載Render事件。

(8) Unload event;---卸載對象

當想服務器請求一個對象的時候,就會在內存裏生成一個繼承頁面對象,也就是頁面的類,它繼承自System.Web.UI.Page.當頁面對象從內存中卸載時發生,將觸發該事件.

(9) Dispose method called

在呈遞給Html完成後,全部的對象都應被銷燬。在Dispose事件中,你應該銷燬全部在創建這個頁面時建立的對象。這時,全部的處理已經完畢,因此銷燬任何剩下的對象都是不會產生錯誤的,包括頁面對象。你能夠重載Dispose事件。

如何部署一個ASP.net頁面。

        VS 2005VS 2003都有發佈機制。2003能夠發佈而後再複製部署。VS2005基本上能夠直接部署到對應位置。

Session有什麼重大BUG,微軟提出了什麼方法加以解決?

        iis中因爲有進程回收機制,系統繁忙的話Session會丟失,能夠用Sate serverSQL Server數據庫的方式存儲Session不過這種方式比較慢,並且沒法捕獲SessionEND事件。固然這種種狀況是限於MSIISWEB容器,不是每一個容器都有這種問題。

如何處理幾十萬條併發數據?

        用存儲過程或事務。取得最大標識的時候同時更新。注意主鍵不是自增量方式這種方法併發的時候是不會有重複主鍵的,取得最大標識要有一個存儲過程來獲取.

談談final, finally, finalize的區別。

   final(.Net中不存在此修飾符)—修飾符(關鍵字)若是一個類被聲明爲final,意味着它不能再派生出新的子類,不能做爲父類被繼承。所以一個類不能既被聲明爲 abstract的,又被聲明爲final的。將變量或方法聲明爲final,能夠保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在之後的引用中只能讀取,不可修改。被聲明爲final的方法也一樣只能使用,不能重載

   finally—再異常處理時提供 finally塊來執行任何清除操做。若是拋出一個異常,那麼相匹配的 catch子句就會執行,而後控制就會進入 finally塊(若是有的話)。

   finalize—方法名。Java技術容許使用 finalize()方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是在 Object類中定義的,所以全部的類都繼承了它。子類覆蓋 finalize()方法以整理系統資源或者執行其餘清理工做。finalize()方法是在垃圾收集器刪除對象以前對這個對象調用的。

short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

        short s1 = 1; s1 = s1 + 1;有錯,s1short型,s1+1int,不能顯式轉化爲short型。可修改成s1 =(short)(s1 + 1) short s1 = 1; s1 += 1正確。

sleep() wait()有什麼區別?

        sleep():爲當前線程指定掛起的時間,是使線程中止一段時間,在sleep時間間隔期滿後,線程不必定當即恢復執行。這是由於在那個時刻,其它線程可能正在運行並且沒有被調度爲放棄執行,除非(a)"醒來"的線程具備更高的優先級

        wait():釋放對象上的鎖,並阻塞當前線程,直到它從新獲取該鎖。線程交互時,若是線程對一個同步對象x發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。

數組有沒有length()這個方法? String有沒有length()這個方法?

數組和string都沒有Length()方法,只有Length屬性。

Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用==仍是equals()?它們有何區別?

        Set裏的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()是判讀兩個Set是否相等

        equals()==方法決定引用值是否指向同一對象equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值。

List, Set, Map是否繼承自Collection接口?

ListSetMap不是

abstractmethod是否可同時是static,是否可同時是native,是否可同時是synchronized?

        都不能。

當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

        不能,一個對象的一個synchronized方法只能由一個線程訪問。

swtich是否能做用在byte上,是否能做用在long上,是否能做用在String?

        switchexpr1)中,expr1是一個整型,字符或字符串,所以能夠做用在bytelong上,也能夠做用在string上。       

兩個對象值相同(x.equals(y) == true),但卻可有不一樣的hash code,這句話對不對?

        不對,有相同的hash code

try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後?

        會執行,在return前執行。

構造器Constructor是否可被override?

        構造器Constructor不能被繼承,所以不能重寫Overriding,但能夠被重載Overloading

接口是否可繼承接口?抽象類是否可實現(implements)接口?抽象類是否可繼承實體類(concrete class)?

        接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

啓動一個線程是用run()仍是start()?

        啓動一個線程是調用start()方法,使線程所表明的虛擬處理機處於可運行狀態,這意味着它能夠由JVM調度並執行。這並不意味着線程就會當即運行。run()方法能夠產生必須退出的標誌來中止一個線程。

String s = new String("xyz");建立了幾個String Object?

JAVA來講兩個對象,一個是"xyx",一個是指向"xyx"的引用對象s

.NET來講該題是錯誤的,根本就沒這樣的構造函數

        String a="xyz";首先會到常量池中去查找,若是存在就再也不分配,若是不存在就分配,常量池中的數據是在編譯期賦值的,也就是生成class文件時就把它放到常量池裏了。

GC是什麼?爲何要有GC?

        GC是垃圾收集器。程序員不用擔憂內存管理,由於垃圾收集器會自動進行管理。要請求垃圾收集,能夠調用下面的方法之一:

 System.gc()

 Runtime.getRuntime().gc()

能用foreach遍歷訪問的對象須要實現_____接口或聲明_____方法的類型。

IEnumerable GetEnumerator

.net中,配件的意思是?

程序集。(中間語言,源數據,資源,裝配清單)

什麼叫應用程序域

一種邊界,它由公共語言運行庫圍繞同一應用程序範圍內建立的對象創建(即,從應用程序入口點開始,沿着對象激活的序列的任何位置)。

應用程序域有助於將在一個應用程序中建立的對象與在其餘應用程序中建立的對象隔離,以使運行時行爲能夠預知。隔離正在運行的應用程序。

一個單獨的進程中能夠存在多個應用程序域。應用程序域能夠理解爲一種輕量級進程。起到安全的做用。佔用資源小。

就是爲安全性,可靠性,隔離性,和版本控制,及卸載程序提供的隔離邊界。它一般由運行庫宿主建立,應用程序域提供了一個更安全,用途更廣的處理單元。

什麼是強類型,什麼是弱類型?哪一種更好些?爲何?

        強類型是在編譯的時候就肯定類型的數據,在執行時類型不能更改,而弱類型在執行的時候纔會肯定類型。沒有好很差,兩者各有好處,強類型安全,由於它事先已經肯定好了,並且效率高。通常用於編譯型編程語言,如c++,java,c#,pascal,弱類型相比而言不安全,在運行的時候容易出現錯誤,但它靈活,多用於解釋型編程語言,如javascript,vb

什麼是受管制的代碼?什麼是強類型和弱類型系統? CTSCLSCLR分別做何解釋?

1)受管制的代碼:.NET環境中運行的任何代碼都稱爲受管制的代碼(unmanaged code).NET外部的其餘代碼也運行在Windows上,這些代碼稱爲未受管制的代碼(unmanaged code)

2)強類型和弱類型的區別在與,在編碼過程當中是否要指定數據類型,做爲強類型必須指定數據類型,編譯器爲其分配相應的存儲空間(如  c  ,pascal   )不然編譯出錯。而弱類型不必定須要指定數據類型,編譯器會用相同的空間去分配各類類型,除非你指定了(如basic)。做爲強類型語言,在編譯階段的安全性要高於弱語言型。

強類型系統:RTTI:類型識別系統。 

3CLRCommon Language Runtime)的全稱是公共語言運行庫,讀者能夠把CLR理解爲一個包含運行.NET程序的引擎和一堆符合公共語言基礎結構的類庫的集合。CLR是一個規範的實現,咱們開發的幾乎全部的.NET程序都基於CLR的類庫來實現,而且運行在CLR提供的運行引擎之上。所謂.NET框架,指的就是公共語言運行庫。

        公共語言基礎(CLI)是微軟公司向ECMA提交的一份語言和數據格式規範,CLR是目前爲止惟一一個公共語言基礎的實現版本。

        CTSCommon Type System)的全稱是通用類型系統。前文已經介紹了公共語言基礎(CLI)的概念,微軟公司提交的CLI規範,包括了公共類型系統(CTS)、公共中間語言(CIL)、底部文件格式以及元數據格式等。公共類型系統定義了一個可以在CLR上運行的語言規範。儘管有不少語言自己不符合CTS規範,可是經過增強編譯器,改變語言附加規範等手段,使得許多語言可以編寫出能在CLR上運行的程序。

        一種語言編寫的程序編譯可以在CLR上運行,並不表明這種語言自己徹底符合CTS的規範。例如C++語言,仍然保持了其不符合CTS規範的部分,而且在編譯時把這部分不符合CTS的代碼編譯成原始代碼而非中間代碼。  

CLSCommon Language Specification)的全稱是通用語言規範,是CTS的一個子集,它定義了但願編寫在.NET平臺上運行的程序的語言所需符合的最小規範。正由於.NET容許由不一樣語言編寫的程序一塊兒執行,因此才制定出CLS規範,用以免不一樣語言特性產生的錯誤。

.net中哪項技術(CLRCTSCLS)實現跨多語言?

CLR

CLRIL分別是什麼含義?

        CLR(公共語言運行庫):能管理內存,可以輕鬆地設計其對象能夠跨語言互動的組件和應用程序,編譯一次,並能夠在任何支持運行庫的CPU和操做系統上運行,跨語言集成(特別是跨語言繼承)

        公共語言運行時,相似於Java中的JVMJava虛擬機;在.Net環境下,各類編程語言使用一種共同的基礎資源環境,這就是CLRCLR將直接與操做系統進行通訊,而編程語言如C#.NET將盡可能避免直接與操做系統直接通訊,增強了程序代碼的執行安全性,能夠這樣看:CLR就是具體的編程語言如:C#.NET與操做系統之間的翻譯,同時它爲具體的編程語言提供了許多資源。

 

        IL(中間語言):可用於語言互操做性,IL不是字節代碼,但很接近字節代碼,所以執行應用程序時,IL到機器代碼的轉換要快不少。獨立於CPU的指令集。由CLR轉換爲特定於CPU的代碼。

        IL中間語言,也稱MSIL,微軟中間語言,或CIL,通用中間語言;全部.NET源代碼(無論用哪一種語言編寫)在進行編譯時都被編譯成IL。在應用程序運行時被即時(Just-In-TimeJIT)編譯器處理成爲機器碼,被解釋及執行。

對象可否調用靜態方法

對象能調用靜態方法。

PID是什麼?在作系統的故障排除時如何使用它?

        PID是進程編號,在系統發現故障的時候,能夠根據它尋找故障所發生的具體進程,而且可經過visual studio.netide將故障進程附加到進程中進行調試(debug)

單個TCP/IP端口上可以被多少個進程偵聽?

1個

描述一下C#中索引器的實現過程,是否只能根據數字進行索引?

        索引器能夠使客戶程序很方便地訪問類中的集合或數組,相似經過索引訪問數組,而且索引器向客戶程序隱藏了內部的數據結構。

        相似於屬性,訪問類或結構的集合或數組時,能夠用索引器實現,索引器用this關鍵字聲明,聲明方法以下:

數據類型 this[參數列表]

{

        get

{

                  以參數爲索引返回集合或數組數據

}

set

{

                  分配值到參數索引的元素

}

}

例:本身創建一個數組

using System;

classMyArray

{

    privatestring[] str =newstring[5];

    //定義索引器,並有可讀可寫屬性,用this聲明屬性,接收一個整型類型參數

    publicstring this[int i]

    {

       get

       {

           return str[i];

       }

       set

       {

           str[i] =value;

       }

    }

    //得到數組長度

    publicint Length

    {

       get

       {

           return str.Length;

       }

    }

}

publicclassLxIndex

{

    staticvoid Main(string[] args)

    {

       MyArray ma =newMyArray();

       //給數組賦值

       Console.WriteLine("給數組賦值,請輸入數組元素值:");

       for (int i = 0; i < ma.Length; i++)

       {

           ma[i] =Console.ReadLine();

       }

       //輸出數組中的元素

       Console.WriteLine("你輸入的內容是:");

       for (int i = 0; i < ma.Length; i++)

       {

           Console.Write(ma[i] +" ");

       }

    }

}

結果:

給數組賦值,請輸入數組元素值:

78

tom

**

100

23

你輸入的內容是:

78 tom ** 100 23請按任意鍵繼續. . .

        不是。索引器能夠用任意類型進行索引。

MVC模式

MVC(Model View Controller)模型-視圖-控制器

模型負責業務領域的事情,視圖負責顯示的事情,控制器把數據讀取出來填充模型後模型交給視圖去處理。而各類驗證應該是在模型裏處理了。它強制性的使應用程序的輸入、處理和輸出分開。MVC最大的好處是將邏輯和頁面分離。

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

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

DateTime是否能夠爲null?

不能,由於其爲Struct類型,而結構屬於值類型,值類型不能爲null,只有引用類型才能被賦值null

using()語法有用嗎?什麼是IDisposable?它是如何實現肯定性終結的

有用,實現了IDisposiable的類在using中建立,using結束後會自定調用該對象的Dispose方法,釋放資源。不明白什麼是肯定性終結

三層架構,用.NetB/S結構的系統,您是用幾層結構來開發,每一層之間的關係以及爲何要這樣分層?

表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)。目的即爲了「高內聚,低耦合」的思想。

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

        業務邏輯層(BLL):業務層通常分爲二層,業務表觀層實現與表示層的溝通,業務規則層實現用戶密碼的安全等。

表示層:爲了與用戶交互例如用戶添加表單針對具體問題的操做,也能夠說是對數據層的操做,對數據業務邏輯處理。

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

三層結構是N層結構的一種,通常來講,層次之間是向下依賴的,下層代碼未肯定其接口(契約)前,上層代碼是沒法開發的,下層代碼接口(契約)的變化將使上層的代碼一塊兒變化。

優勢:分工明確,條理清晰,易於調試,並且具備可擴展性。

缺點:增長成本。

C#函數中無參數修飾符、out修飾符、params修飾符、ref修飾符的區別

無參數修飾符:表示按值傳遞

out修飾符:表示按引用傳遞,傳遞前不需賦初值,但在傳入的方法內賦值,不然報錯

ref修飾符:表示按引用傳遞,傳遞前必須賦初值,不然報錯

params修飾符:可將不肯定個數的一組相同類型的數據做爲參數傳遞,函數簽名中只能有一個params修飾符,而且應爲最後一個參數。

refout有什麼不一樣?

     方法參數上的 ref方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞迴調用方法時,在方法中對參數所作的任何更改都將反映在該變量中。若要使用 ref參數,必須將參數做爲 ref參數顯式傳遞到方法。ref參數的值被傳遞到 ref參數。傳遞到 ref參數的參數必須最早初始化。將此方法與 out參數相比,後者的參數在傳遞到 out參數以前沒必要顯式初始化。屬性不是變量,不能做爲 ref參數傳遞。若是兩種方法的聲明僅在它們對 ref的使用方面不一樣,則將出現重載。可是,沒法定義僅在 ref out方面不一樣的重載。

    方法參數上的 out方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞迴調用方法時,在方法中對參數所作的任何更改都將反映在該變量中。

        當但願方法返回多個值時,聲明 out方法很是有用。使用 out參數的方法仍然能夠返回一個值。一個方法能夠有一個以上的 out參數。若要使用 out參數,必須將參數做爲 out參數顯式傳遞到方法。out參數的值不會傳遞到 out參數。沒必要初始化做爲 out參數傳遞的變量。然而,必須在方法返回以前爲 out參數賦值。屬性不是變量,不能做爲 out參數傳遞。若是兩個方法的聲明僅在 out的使用方面不一樣,則會發生重載。不過,沒法定義僅在 ref out方面不一樣的重載。

 

extern是什麼意思?

extern修飾符用於聲明由程序集外部實現的成員函數,常常用於系統API函數的調用(經過 DllImport )。注意,和DllImport一塊兒使用時要加上 static修飾符

也能夠用於對於同一程序集不一樣版本組件的調用(用 extern聲明別名)

不能與 abstract修飾符同時使用

using System.Runtime.InteropServices;

using System;

namespace TestExtern

{

    classClassHello

    {

       //extern與DllImport一塊兒使用時必須再加上一個static修飾符

       [DllImport("User32.dll")]

       publicstaticexternint MessageBox(int Handle,string Message,string Caption,int Type);

       staticvoid Main()

       {

           string myString;

           Console.Write("請輸入提示信息: ");

           myString =Console.ReadLine();

           MessageBox(0, myString,"個人測試", 0);

       }

    }

}

結果:

 

對象構造器

        使用對象構造器,能夠使初始化對象像初始化數組同樣簡單,即在構造函數後直接添加多個初始化語句代碼,並用逗號分隔,總體用{}括起來,定義形式以下:

       類型聲明實例名稱 = new類型名稱() {初始化語句1,初始化語句2};

        若是相同成員的不一樣初始化語句,則以最右面的語句爲準。初始化的順序是先執行構造函數的語句,而後執行對象構造器中的語句。以下例:

Snake s = new Snake () {name="眼鏡蛇",length=12,weight=20};

C#匿名類型的的實際應用

經過var和對象構造器,聲明一個沒有名稱(其名稱是由編譯器分配的)的類,同時建立並初始化成員。如:var pc1 = new {cpu="Intel",memory="AMD"};

若是程序僅僅須要臨時一組數據,則用匿名類型比較合適,匿名類型編譯後,仍然是一個普通的密封類,不可派生其餘類,只是名稱是由編譯器分配的,利用對象構造器初始化的成員,具備只讀屬性。匿名內部類一樣有構造函數用於初始化成員,只是建立時不須要顯式調用。以下列:

constreadonly區別

均可以標識一個常量。主要有如下區別:

1、初始化位置不一樣。const必須在聲明的同時賦值;readonly便可以在聲明處賦值,也能夠在靜態構造方法(必須是靜態構造方法,普通構造方法不行裏賦值。

2、修飾對象不一樣。const便可以修飾類的字段,也能夠修飾局部變量;readonly只能修飾類的字段

3const是編譯時常量,在編譯時肯定該值;readonly是運行時常量,在運行時肯定該值。

4const默認是靜態的;而readonly若是設置成靜態須要顯示聲明

5、修飾引用類型時不一樣,const只能修飾string或值爲null的其餘引用類型;readonly能夠是任何類型。

若是類型限制了不能在編譯時肯定它的值,能夠使用static readonly來代替。

請解釋virtual的含義?

    virtual關鍵字用於修改方法或屬性的聲明,在這種狀況下,方法或屬性被稱做虛擬成員。虛擬成員的實現可由派生類中的重寫成員更改。

        調用虛方法時,將爲重寫成員檢查該對象的運行時類型。將調用大部分派生類中的該重寫成員,若是沒有派生類重寫該成員,則它多是原始成員。默認狀況下,方法是非虛擬的。不能重寫非虛方法。不能將 virtual修飾符與如下修飾符一塊兒使用:static   abstract   override除了聲明和調用語法不一樣外,虛擬屬性的行爲與抽象方法同樣。

        在靜態屬性上使用 virtual修飾符是錯誤的。

        經過包括使用 override修飾符的屬性聲明,可在派生類中重寫虛擬繼承屬性

sealednewvirtualabstractoverride關鍵字的區別

sealed修飾類表明密封類,不能被繼承,修飾方法表明密封方法,不能被重寫。一般用於實現第三方類庫時不想被客戶端繼承,或用於沒有必要再繼承的類以防止濫用繼承形成層次結構混亂

new顯式隱藏基類的成員。不用new隱藏基類的成員也能夠,但會給出警告。

virtual爲了子類來重寫的,子類須要override,若是不用會給個警告

abstract能夠修飾類,方法,屬性,索引器及事件。

override子類重寫基類的abstractvirtual成員,。不能重寫非虛擬方法或靜態方法

newoverride相同點和區別

相同點:均可以對基類成員進行隱藏,均可以用base調用基類的成員

不一樣點:

1、用override重寫基類的方法,要求與基類必須有徹底相同的訪問修飾符、返回值類型和方法名稱名稱,參數,異常。new不用

2、用override重寫基類的方法,要求基類的方法必須爲虛擬的,抽象的或重寫的virtualabstract,override),而new沒必要要

3、繼承後,用一個基類的對象調用基類的virtual方法時,override重寫的子類方法會被訪問,而new重寫的子類方法不會被訪問(只訪問基類的virtual方法)

4new做爲運算符時,建立對象,調用構造函數。new用於約束時用於在泛型聲明中,約束指定泛型類聲明中的任何類型參數都必須有公共的無參數構造函數。

using System;

publicclassBaseClass

{

    public BaseClass()

    {

       Console.WriteLine("基類構造");

    }

    //使用virtual才能夠在子類中使用override,而new沒必要要

    publicvirtual void Method()

    {

       Console.WriteLine("基類.Method()");

    }

}

publicclassClassA :BaseClass

{

    public ClassA()

    {

       Console.WriteLine("類A.構造");

    }

    publicoverride void Method()

    {

       //base.Method();

       Console.WriteLine("類A.Method() in override");

    }

}

publicclassClassB :BaseClass

{

    public ClassB()

    {

       Console.WriteLine("類B.構造");

    }

    publicnew void Method()

    {

       //base.Method();

       Console.WriteLine("類B.Method() in new");

    }

}

 

 

classProgram

{

    staticvoid Main(string[] args)

    {

       BaseClass ba1 = (BaseClass)newClassA();//類型轉換

       //用override重寫方法,是基類的一個派生,

       //因此這裏經過基類的虛函數,會訪問到派生類的方法。

       ba1.Method();

      &nfont-size:9.5ptbsp;Console.WriteLine(" =================");

 

       BaseClass bb2 = (BaseClass)newClassB();//類型轉換

       //用new重寫方法,是一個和基類無關的新方法,

       //因此這裏基類調用的時候,訪問基類的方法。

       bb2.Method();

       Console.WriteLine(" =================");

 

       ClassA a1 =newClassA();

       a1.Method();

       Console.WriteLine(" =================");

 

       ClassB b2 =newClassB();

       b2.Method();

       Console.WriteLine(" =================");

       Console.ReadKey();

 

    }

}

 

運行結果:

 基類構造

 A.構造

 A.Method() in override

 =================

 基類構造

 B.構造

 基類.Method()

 =================

 基類構造

 A.構造

 A.Method() in override

 =================

 基類構造

 B.構造

 B.Method() in new

 =================

Web.config配置Windows身份認證

        您須要建立一個ASP.NET應用程序,公司考慮使用Windows身份認證。全部的用戶都存在於AllWin這個域中。您想要使用下列認證規則來配置這個應用程序:1匿名用戶不容許訪問這個應用程序。2全部僱員除了TessKing都容許訪問這個應用程序。請問您應該使用哪個代碼段來配置這個應用程序?

<authorization>

   <allowusers="*">

   <denyusers="allwin\tess, allwin\king">

   <denyusers="?">

</authorization>

Global.asax文件中配置自定義的錯誤

        問:您要建立ASP.NET應用程序用於運行AllWin公司內部的Web站點,這個應用程序包含了50個頁面。您想要配置這個應用程序以便當發生一個HTTP代碼錯誤時它能夠顯示一個自定義的錯誤頁面給用戶。您想要花最小的代價完成這些目標,您應該怎麼作?

        答:在這個應用程序的Global.asax文件中建立一個Application_Error過程去處理ASP.NET代碼錯誤。

DataGrid控件的Footer顯示員工合計數

        問:您要建立一個顯示公司員工列表的應用程序。您使用一個DataGrid控件顯示員工的列表。您打算修改這個控件以便在這個GridFooter顯示員工合計數。請問您應該怎麼作?

        答:重寫OnItemCreated事件,當GridFooter行被建立時顯示合計數。

如何在這個程序中使用Web Service

        問:您爲AllWin公司建立了一個ASP.NET應用程序。這個應用程序調用一個Xml Web Service。這個Xml Web Service將返回一個包含了公司僱員列表的DataSet對象。請問您該如何在這個程序中使用這個Xml Web Service---答:

        答:在「Web引用」對話框中輸入這個XML Web service的地址。

修改程序

        問:您要建立一個ASP.NET應用程序在DataGrid控件中顯示一個通過排序的列表。產品數據被存放於一個名爲PubBaseMicrosoft SQL Server 數據庫。每一個產品的主鍵是ProductIDNumeric型而且每一個產品有一個字母描述字段,名爲ProductName。您使用一個SqlDataAdapter對象和一個SqlCommand對象經過調用一個存儲過程從數據庫中獲取產品數據。您將SqlCommand對象的CommandType屬性設置爲CommandType.StoredProcedure,並將它的CommandText屬性設置爲procProductList。您成功的獲取了一個DataTable對象,其中是已經按ProductID降序排列的產品列表。您打算顯示以相反的字母順序排列的ProductName,請問該怎麼作?

        答:將SqlCommand對象的CommandType屬性修改成CommandType.Text,將CommandText屬性修改成」SELECT * FROM procProductList ORDER BY ProductName DESC」。而後將這個DataTable對象綁定到DataGrid控件。

貨幣的值如何按各個不一樣國家的習慣來輸出

        問:在C#中有一個double型的變量,好比10321.5,好比122235401.21644,做爲貨幣的值如何按各個不一樣國家的習慣來輸出。好比美國用$10,321.50$122235401.22而在英國則爲£10 321.50和£122 235 401.22

using System;

using System.Globalization;

classProgram

{

   staticvoid Main(string[] args)

   {

       //CultureInfo類呈現區域性特定的信息,如關聯的語言、子語言、國家/地區、日曆和區域性約定。

       System.Globalization.CultureInfo myCultureUS =new System.Globalization.CultureInfo("en-US");

       CultureInfo myCultureEN =newCultureInfo("en-GB");

       CultureInfo myCultureCN =newCultureInfo("zh-CN");

       double x = 10321.5, y = 122235401.21644;

 

       string str =String.Format(myCultureUS,"My amount={0:c}(美國)", y);

       Console.WriteLine(str);

 

       str =String.Format(myCultureEN,"My amount={0:c}(英國)", y);

       Console.WriteLine(str);

 

       str =String.Format(myCultureCN,"My amount={0:c}(中國)", y);

       Console.WriteLine(str);

   }

}

結果:

My amount=$122,235,401.22(美國)

My amount=122,235,401.22(英國)

My amount=122,235,401.22(中國)

請按任意鍵繼續. . .

errorexception有什麼區別?

        error表示恢復不是不可能但很困難的狀況下的一種嚴重問題。好比說內存溢出。不可能期望程序能處理這樣的狀況。 exception表示一種設計或實現問題。也就是說,它表示若是程序運行正常,從不會發生的狀況。

要用新浪網上的天氣預報,怎麼辦?

webservice,請求國家氣象局的接口。用ajax把新浪網上的網頁請求過來,而後解析一下。

母板頁與內容頁中怎麼傳參(除SessionCookieApplicationQueryStingthis.Server.Transfer以外)?

獲取母版頁上文本框的值賦給內容頁的文本框

this.TextBox1.Text = (Master.FindControl("textBox1") as TextBox).Text;

獲取內容頁上文本框的值賦給母版頁的文本框

TextBox1.Text = (this.ContentPlaceHolder1.FindControl("textBox1") as TextBox).Text;

兩根分佈不均勻的香,所有燒完需1個小時,如何肯定一段15分鐘的時間?

同時點燃第一根的兩端和第二根的一端,第一根燒完是半個小時,這時點燃第二根的另外一端並開始計時,所有燒完就是15分鐘。

Xml文檔定義的形式?它們的本質區別?解析Xml文檔的方式?

a:兩種形式 dtd schemab:本質區別:schema自己是xml的,能夠被XML解析器解析(這也是從DTD上發展schema的根本目的)c:DOM,SAX,STAX等。

DOM:處理大型文件時其性能降低的很是厲害。這個問題是由DOM的樹結構所形成的,這種結構佔用的內存較多,並且DOM必須在解析文件以前把整個文檔裝入內存,適合對XML的隨機訪問。

SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不須要一次所有裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結束時,它會觸發一個事件,用戶經過在其回調事件中寫入處理代碼來處理XML文件,適合對XML的順序訪問。

STAX:Streaming API for XML(流的APIXML (StAX)。

..netC# or vb.net)中如何取消一個窗體的關閉。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

   e.Cancel = true;

}

.netC# or vb.net)中,Appplication.Exit仍是 Form.Close有什麼不一樣?

一個是退出整個應用程序,一個是關閉其中一個form。

62-63=1等式不成立,請移動一個數字(不能夠移動減號和等於號),使得等式成立,如何移動?

62移動成2的6次方

得到枚舉中的常數名稱和常數值

經過Enum.GetNames(typeof(枚舉))得到枚舉名稱,Enum.GetValues(typeof(枚舉))得到枚舉常數值

例如:對於這樣的一個枚舉類型

using System;

using System.Globalization;

classProgram

{

   enumColor :byte

   {

       Red, Green, Blue, Orange

   }

 

   staticvoid Main(string[] args)

   {

 

       string[] sa =Enum.GetNames(typeof(Color));    // Red, Green, Blue, Orange

       Console.WriteLine("枚舉中的常數名稱:");

       foreach (string sin sa)

           Console.Write(s +"\t");

       Console.WriteLine();

 

       byte[] sb = (byte[])Enum.GetValues(typeof(Color));// 0,1,2,3

       Console.WriteLine("枚舉中的常數值:");

       foreach (byte sin sb)

           Console.Write(s +"\t");

 

       Console.WriteLine();

   }

}

結果:

枚舉中的常數名稱:

Red    Green  Blue    Orange

枚舉中的常數值:

0      1      2       3

請按任意鍵繼續. . .

Anonymous Inner Class (匿名內部類)是否能夠extends(繼承)其它類,是否能夠implements(實現)interface(接口)?            

不能,能夠實現接口

Static Nested Class Inner Class的不一樣,說得越多越好
   Static Nested Class是被聲明爲靜態(static)的內部類,它能夠不依賴於外部類實例被實例化。而一般的內部類須要在外部類實例化後才能實例化。

HashMapHashtable的區別。

        HashMapHashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap容許空(null)鍵值(key,因爲非線程安全,效率上可能高於Hashtable.

分析如下代碼。

    publicstatic void test(string ConnectString)

    {

       System.Data.OleDb.OleDbConnection conn =new System.Data.OleDb.OleDbConnection();

       conn.ConnectionString = ConnectString;

       try

       {

           conn.Open();

           //……

       }

       catch (Exception Ex) {

           MessageBox.Show(Ex.ToString());

       }

       finally {

           if (!conn.State.Equals(ConnectionState.Closed))conn.Close();

       }

}

1)以上代碼能夠正確使用鏈接池嗎?

        若是傳入的connectionString是如出一轍的話,能夠正確使用鏈接池。不過如出一轍的意思是,連字符的空格數,順序徹底一致。

2)以上代碼所使用的異常處理方法,是否全部在test方法內的異常均可以被捕捉並顯示出來?

        只能夠捕捉數據庫鏈接中的異常吧.finally中,catch中,若是有別的可能引起異常的操做,也應該用try,catch。因此理論上並不是全部異常都會被捕捉。)

什麼是WSE?目前最新的版本是多少?

        WSE (Web Service Extension)包來提供最新的WEB服務安全保證,目前最新版本2.0

請談談對正則表達式?

   能將一些比較複雜的驗證邏輯以簡單的驗證表達式驗證.

請解釋web.config文件中的重要節點

動態調試編譯--<compilation/>,自定義錯誤信息--<customErrors/>,身份驗證—<authentication/>,受權--<authorization/>,應用程序級別跟蹤記錄--<trace/>,會話狀態設置--<sessionState/>,全球化--<globalization/>

請解釋ASP.NET中的web頁面與其隱藏類之間的關係?

        一個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"表用運行時使用哪個隱藏類

當發現不能讀取頁面上的輸入的數據時頗有多是什麼緣由形成的?怎麼解決

頗有多是在Page_Load中數據處理時沒有進行PageIsPostBack屬性判斷

請解釋什麼是上下文對象,在什麼狀況下要使用上下文對象

        上下文對象是指HttpContext類的Current屬性,當咱們在一個普通類中要訪問內置對象(Response,Request,Session,Server,Appliction)時就要以使用此對象

某一密碼僅使用KLMNO5個字母,密碼中的單詞從左向右排列,密碼單詞必須遵循以下規則:

(1)密碼單詞的最小長度是兩個字母,能夠相同,也能夠不一樣

(2)K不多是單詞的第一個字母

(3)若是L出現,則出現次數不止一次

(4)M不能使最後一個也不能是倒數第二個字母

(5)K出現,則N就必定出現

(6)O若是是最後一個字母,則L必定出現

問題一:下列哪個字母能夠放在LO中的O後面,造成一個3個字母的密碼單詞?答案:B

        A) K  B)L  C) M    D) N   

  問題二:若是能獲得的字母是K、L、M,那麼可以造成的兩個字母長的密碼單詞的總數是多少?答案:A

        A)1個 B)3個  C)6個  D)9個

問題三:下列哪個是單詞密碼?答案: C

       A) KLLN  B) LOML  C) MLLO   D)NMKO

請解釋流與文件有什麼不一樣?

        文件是一些具備永久存儲及特定順序的字節組成的一個有序的、具備名稱的集合。所以,對於文件,人們常會想到目錄路徑、磁盤存儲、文件和目錄名等方面。相反,流提供一種向後備存儲器寫入字節和從後備存儲器讀取字節的方式,後備存儲器能夠爲多種存儲媒介之一。正如除磁盤外存在多種後備存儲器同樣,除文件流以外也存在多種流。例如,還存在網絡流、內存流和磁帶流等。

類型系統是由XMLSchema表示的嗎?CLSXMLSchema表示的嗎?

問題的翻譯,Are the type system represented by XmlSchema and the CLS isomorphic?我以爲問題是這樣的,XMLSchemaCLS的類型系統類似嗎?

XmlSchema是一個特定的XML文檔,必須知足的一套標準。這些標準可以描述不一樣的數據類型。好比:xs:Boolean

CLS無論值類型仍是引用類型都是一套類型系統,好比System.Boolean.

像不像?你說呢?

從概念上闡述前期綁定(early-binding)和後期綁定(late-binding)的區別?

若是方法在編譯時就肯定就是前期綁定,若是在運行時肯定的叫後期綁定。這個就像是強弱類型的比較類似,前期綁定是在編譯的時候就肯定了要綁定的數據,然後期綁定是在運行的時候才填充數據。因此前期綁定若是失敗,會在編譯時報編譯錯誤,然後期綁定失敗只有在運行時的時候才發生

舉個例子,好比spring在運行時才取類和類的對象,就是後期綁定

調用Assembly.Load算靜態引用仍是動態引用?

我的理解其實應該是一個反射,System.Reflection.Assembly.Load.因此嘛確定動態引用了。由於靜態引用在編譯時就已經引用,並使用

什麼時候使用Assembly.LoadFrom?什麼時候使用Assembly.LoadFile

(聲明如下是抄的,我不太瞭解Assembly.LoadFrom)。區別以下:

1Assembly.LoadFile只載入相應的dll文件,不載入相應dll內引用的其餘dll,好比Assembly.LoadFile("a.dll"),則載入a.dll,假如a.dll中引用了b.dll的話,b.dll並不會被載入。

Assembly.LoadFrom則不同,它會載入相應的dll文件及其引用的其餘dll,好比上面的例子,b.dll也會被載入。

2、用Assembly.LoadFrom載入一個Assembly時,會先檢查前面是否已經載入過相同名字的Assembly,好比a.dll有兩個版本(版本1在目錄1下,版本2放在目錄2),程序一開始時載入了版本1,當使用Assembly.LoadFrom("2\\a.dll")載入版本2時,不能載入,而是返回版本1

Assembly.LoadFile的話則不會作這樣的檢查,好比上面的例子換成Assembly.LoadFile的話,則能正確載入版本2

什麼叫Assembly Qualified Name?它是一個文件名嗎?它有什麼不一樣?

它不是一個文件名,相比文件名,Assembly Qualified Name(程序集限定名稱),更能肯定一個程序集,它包含文件名,但同時包含版本,公鑰,和區域。由於一樣一個名稱的文件可能有不一樣的版本和區域,此時單獨靠文件名稱,可能會形成不能肯定程序集的正確性。

作強簽名的assembly與不作強簽名的assembly有什麼不一樣?

強簽名的程序集能夠確認assembly name是惟一的(由於使用了public key token)。

強簽名的程序集能夠作成com

強簽名程序集能夠安裝到GAC中。

DateTime是否能夠爲null?

不能爲null,包括int什麼的都不能等於null。固然2.0能夠里加可空類型,可是在編譯後你會發現可空類型實際上是假的。

什麼叫JIT?什麼是NGEN?它們分別有什麼限制和好處?

.NET採用中間語言(IL)機制。JIT(Just In Time)即時編譯是指程序第一次運行的時候才進行把中間語言(IL)編譯成機器代碼JIT增長了執行效率

本機映像生成器 (Ngen.exe)是一個提升託管應用程序性能的工具。

Ngen.exe建立本機映像(包含經編譯的特定於處理器的機器代碼的文件),並將它們安裝到本地計算機上的本機映像緩存中。運行庫可從緩存中使用本機映像,而不是使用實時 (JIT)編譯器編譯原始程序集。這是爲何asp.net程序第一次會比較慢,由於他是JIT

.NET CLR中一代的垃圾收集器是如何管理對象的生命週期的?什麼叫非肯定性終結?

垃圾收集器不能管理對象的生命週期吧??我認爲他只能跟蹤對象的生命週期

先看一個對象的生命週期

1. 調用ILnewobj指令,分配必定空間的內存。

2. 初始化內存空間,好比設置爲string類型。

3. 使用對象。

4. 銷燬對象,執行清理

5. 回收內存

垃圾收集是在第4步。有三種方法:FinalizeDisposeClose

但垃圾收集執行的時機不定的,初學者能夠認爲對象銷燬的時機是在垃圾收集器認爲對象須要被銷燬的時候進行的,他對於程序員是透明的,初學者根本不須要知道垃圾收集器的存在。

我的理解的垃圾收集器的執行原理週期性地遍歷被應用當前引用的全部對象的列表。在這個搜索過程當中,凡是沒有發現的對象,都將準備予以銷燬(但不併非立刻就銷燬,只是先標記)。這種算法表示若是對象的最後一個引用也被解除時(意思是該對象不再使用了,便可以銷燬了),這時垃圾收集器並不會當即接到通知,只有下一次對堆(heap)進行清掃時,才能發現這個狀況說明了對象在何時終結是不肯定的,我認爲這就是非肯定性終結。進一步而言,執行垃圾收集清掃次數越少,這類算法工做得越好。一般來講,堆的耗滿是收集清掃的觸發條件。

Finalize()Dispose()之間的區別?

Finalize自動釋放資源,Dispose()用於手動釋放資源。

. Finalize

Finalize很像C++的析構函數,咱們在代碼中的實現形式爲這與C++的析構函數在形式上徹底同樣,但它的調用過程卻大不相同。

~ClassName() {//釋放你的非託管資源}

好比類A中實現了Finalize函數,在A的一個對象a被建立時(準確的說應該是構造函數被調用以前),它的指針被插入到一個finalization鏈表中;在GC運行時,它將查找finalization鏈表中的對象指針,若是此時a已是垃圾對象的話,它會被移入一個freachable隊列中,最後GC會調用一個高優先級線程,這個線程專門負責遍歷freachable隊列並調用隊列中全部對象的Finalize方法,至此,對象a中的非託管資源才獲得了釋放(固然前提是你正確實現了它的Finalize方法),而a所佔用的內存資源則必需等到下一次GC才能獲得釋放,因此一個實現了Finalize方法的對象必需等兩次GC才能被徹底釋放。

因爲Finalize是由GC負責調用,因此能夠說是一種自動的釋放方式。可是這裏面要注意兩個問題:第一,因爲沒法肯定GC什麼時候會運做,所以可能很長的一段時間裏對象的資源都沒有獲得釋放,這對於一些關鍵資源而言是很是要命的。第二,因爲負責調用Finalize的線程並不保證各個對象的Finalize的調用順序,這可能會帶來微妙的依賴性問題。若是你在對象aFinalize中引用了對象b,而ab二者都實現了Finalize,那麼若是bFinalize先被調用的話,隨後在調用aFinalize時就會出現問題,由於它引用了一個已經被釋放的資源。所以,在Finalize方法中應該儘可能避免引用其餘實現了Finalize方法的對象。

可見,這種「自動」釋放資源的方法並不能知足咱們的須要,由於咱們不能顯示的調用它(只能由GC調用),並且會產生依賴型問題。咱們須要更準確的控制資源的釋放。

. Dispose

Dispose是提供給咱們顯示調用的方法。因爲對Dispose的實現很容易出現問題,因此在一些書籍上(如《Effective C#》和《Applied Microsoft.Net Framework Programming》)給出了一個特定的實現模式:

using System;

using System.Globalization;

classDisposePattern :IDisposable

{

    private System.IO.FileStream fs =new System.IO.FileStream("test.txt", System.IO.FileMode.Create);

 

    //析構函數

    ~DisposePattern()

    {

       Dispose(false);

    }

    //IDisposable Members

   #region IDisposable Members

    publicvoid Dispose()

    {

       //告訴GC不須要再調用Finalize方法,

       //由於資源已經被顯示清理

       GC.SuppressFinalize(this);

       Dispose(true);

    }

   #endregion

    protectedvirtualvoid Dispose(bool disposing)

    {

       //因爲Dispose方法可能被多線程調用,

       //因此加鎖以確保線程安全

       lock (this)

       {

           if (disposing)

           {

               //說明對象的Finalize方法並無被執行,

               //在這裏能夠安全的引用其餘實現了Finalize方法的對象

           }

           if (fs !=null)

           {

               fs.Dispose();

               fs =null;//標識資源已經清理,避免屢次釋放

           }

       }

    }

}

 

在註釋中已經有了比較清楚的描述,另外還有一點須要說明:若是DisposePattern類是派生自基類B,而B是一個實現了Dispose的類,那麼DisposePattern中只須要override基類B的帶參的Dispose方法便可,而不須要重寫無參的DisposeFinalize方法,此時Dispose的實現爲:

classDerivedClass : DisposePattern

{

    protectedoverridevoid Dispose(bool disposing)

    {

       lock (this)

       {

           try

           {

               //清理本身的非託管資源,

               //實現模式與DisposePattern相同

           }

           finally

           {

               base.Dispose(disposing);

           }

       }

    }

}

固然,若是DerivedClass自己沒有什麼資源須要清理,那麼就不須要重寫Dispose方法了,正如咱們平時作的一些對話框,雖然都是繼承於System.Windows.Forms.Form,但咱們經常不須要去重寫基類FormDispose方法,由於自己沒有什麼非託管的咚咚須要釋放。

瞭解GC的脾性在不少時候是很是必要的,起碼在出現資源泄漏問題的時候你不至於手足無措。我寫過一個生成excel報表的控件,其中對excel對象的釋放就讓我忙活了一陣。若是你作過excel開發的話,可能也遇到過結束excel進程之類的問題,特別是包裝成一個供別人調用的庫時,什麼時候釋放excel對象以確保進程結束是一個關鍵問題。固然,GC的內部機制很是複雜,還有許多內容可挖,但瞭解全部細節的成本過高,只需瞭解基礎,夠用就好。

using()語法有用嗎?什麼是IDisposable?它是如何實現肯定性終結的。

using()能自動調用Dispose方法

好比:using()會自動調用MyObjectDispose方法

using ( MyObject myObject = new MyObject ( ) )

{

  Console.WriteLine ( "quit" ) ;

}

IDisposiable是顯示釋放對象的接口,實現IDisposiable接口的類,能夠顯示的釋放對象。經過編寫Dispose方法來實現顯式釋放資源;

// C#

classMyClass :IDisposable

{

    //構造函數

    public MyClass() {

   

    }

 

    //析構方法 (不肯定的) (編譯器經過重載virtual void Finalize來實現),與C++/CLI的!MyClass()等效

    ~MyClass() {

   

    }

 

    // Dispose方法

    publicvoid Dispose() { }  

    publicstatic void Test()

    {

       using (MyClass auto =newMyClass())

       {

       

       }

       //由於使用了using句法,編譯器自動調用auto.Dispose()

       //以上代碼等效於:

       MyClass user =newMyClass();

       try {

 

       }

       finally {

           user.Dispose();

       }

    }

}

 

tasklist /m "mscor*"這句命令是幹嗎的?

列出全部使用了以" mscor"做爲開頭的dll或者exe進程和模塊信息

in-procout-of-proc的區別

in-proc是進程內,進程內能共享代碼和數據塊,out-of-proc是進程外,進程外的互操做須要用進程間通信來實現。

.NET裏的哪一項技術可以實現out-of-proc通信?

.Net Remoting技術或者WCF技術

當你在ASP.NET中運行一個組件時,它在Windows XP, Windows 2000, Windows 2003上分別跑在哪一個進程裏面?

Xp :aspnet_Wp.exe

Windows 2000 :inetinfo.exe

Windows 2003 :w3wp.exe

.Net中全部可序列化的類都被標記爲何?

[serializable]

DateTime.Parse(myString);這行代碼有什麼問題? 

        有問題,當myString不能知足時間格式要求的時候,會引起異常,建議使用DateTime.TryParse() 

PDB是什麼東西?在調試中它應該放在哪裏? 

        PDB是用於保存調試和項目狀態信息的文件,在debug的時候將產生pdb文件,調試的時候應該放在和對應應用程序集相同目錄。 

什麼叫圈複雜度(cyclomatic complexity)?爲何它很重要? 

不知道,望指教 

寫一個標準的lock(),在訪問變量的先後建立臨界區,要有"雙重檢查"

lock的使用

    publicvoid LockTest()

    {

       Object lockObj =newObject();

       lock (lockObj)

       {

           //

       }

    }

什麼叫FullTrust?放入GACassembly是不是FullTrust

        FullTrust徹底信任。放入GAC中的Assembly是否FullTrust個人理解不是。我理解FullTrust是能夠經過代碼設定的 

代碼加上須要安全權限的特性有什麼好處? 

        能夠更加靈活的設置對代碼的訪問權限,實現代碼級保護。這點不是特清楚,有明白的給講解下 

gacutil /l | find /i "Corillian"這句命令的做用是什麼? 

        全局程序集緩存中若是有Corillian就更新該程序集,沒有就安裝 

sn -t foo.dll這句命令是幹嗎的? 

        顯示程序集foo.dll的公鑰標記 

DCOM須要防火牆打開哪些端口?端口135是幹嗎用的? 

        135端口,由於DCOM的端口號是隨機分配的,默認狀況下,會分配1024以上的端口號,因此默認狀況下,DCOM不能穿越防火牆。由於根本不曉得開哪一個端口。但有解決辦法能夠使DCOM分配的端口號固定,

        有關內容我在http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html有過一些描述。135是遠程過程調用(RPC)的默認端口 

對比OOPSOA,它們的目的分別是什麼? 

        我想OOPSOA應該沒有對比性吧。OOP是一種編程模型,強調將複雜的邏輯分解出小的模塊,特性是繼承,封裝和多態。而SOA是一個技術框架,技術框架和編程模型應該說不是一碼事吧?SOA的思想是將業務邏輯封裝成服務或者中間件提供給應用程序來調用,固然其組件化思想是繼承和發揚了OOP的優勢。 

XmlSerializer是如何工做的?使用這個類的進程須要什麼ACL權限? 

        我只知道XmlSerializer將對象的屬性和字段進行序列化和反序列化的序列化成爲xml數據,反序列化再將xml轉換成對象。應該至少須要ACL權限中的讀權限

        ACL(access control list)訪問控制表

        ACL是存在於計算機中的一張表,它使操做系統明白每一個用戶對特定系統對象,例如文件目錄或單個文件的存取權限。每一個對象擁有一個在訪問控制表中定義的安全屬性。這張表對於每一個系統用戶有擁有一個訪問權限。最通常的訪問權限包括讀文件(包括全部目錄中的文件),寫一個或多個文件和執行一個文件(若是它是一個可執行文件或者是程序的時候)。Windows NTNovell公司的NetwareDigital公司的 OpenVMS和基於UNIX系統是使用這種訪問控制表的系統。而此表的實如今各個系統中卻不同。

爲何不提倡catch(Exception) 

        緣由可能有兩點:1try..catch在出現異常的時候影響性能 2)應該捕獲更具體得異常,好比IOExeception,OutOfMemoryException 

Debug.WriteTrace.Write有什麼不一樣?什麼時候應該使用哪個? 

        Debug.Write是調試的時候向跟蹤窗口輸出信息。當編譯模式爲debug的時候纔有效,爲release的時候Debug.Write在編譯的時候會忽略,Trace則是在debugrelease兩種模式下都可以向跟蹤窗口輸出信息。 

Debug BuildRelease Build的區別,是否會有明顯的速度變化?請說明理由。 

        Debug會產生pdb文件,release不會。Debug用於開發時的調試,不能要於部署,而release用於部署.debug編譯一些特殊代碼,好比#IFDEBUG Debug.Write等,而Release則會將那些特殊標記省略 

         PDB程序數據庫文件,文件保存着調試和項目狀態信息,使用這些信息能夠對程序的調試配置進行增量連接。

JIT是以assembly爲單位發生仍是以方法爲單位發生?這對於工做區有何影響

        方法,道理很簡單,由於對於一次運行,極可能只用到一個程序集中極少數類型和對象,而大部分可能並不會被使用,此時CLR傻乎乎的給整個程序集都給Compile了,CLR不是傻瘋了麼 

a.Equals(b)a == b同樣嗎? 

        不同。a.Equals(b)表示ab一致, a==b表示ab的值相等 

在對象比較中,對象一致和對象相等分別是指什麼? 

        對象一致是指兩個對象是同一個對象,引用相同。而對象相等是指兩個對象的值相同,但引用不必定相同 

.NET中如何實現深拷貝(deep copy)? 

        實現IClonable接口 

請解釋一下IClonable 

        IClonable方法是實現深度複製的接口,實現它應該能深度複製一個對象出來。深度複製的特徵的調用對象的構造方法,建立新的對象,包括建立對象中嵌套的引用對象的新實例。        

        Shadow複製則不一樣,是淺表複製,不從新建立新實例。淺表複製的實現是Object.MemberWiseClone().

深度複製(Deep Copy)與淺表複製(Shadow Copy)的比較

using System;

publicclassName

{

    publicstring FirstName;

    publicstring LastName;

}

publicclassPerson :ICloneable

{

    publicName PersonName;

    publicstring Email;

    //// <summary>

    /// Deep Copy的例子

    ///</summary>

    ///<returns></returns>

    publicObject Clone()

    {

       Person p =newPerson();

       p.Email =this.Email;

       p.PersonName =newName();

       p.PersonName.FirstName =this.PersonName.FirstName;

       p.PersonName.LastName =this.PersonName.LastName;

       return p;

    }

 

    publicvoid ChangLastName(string lastName)

    {

       this.PersonName.LastName = lastName;

    }

 

    publicstatic void Main()

    {

       Person p =newPerson();

       p.PersonName =newName();

       p.PersonName.LastName ="jill";

       p.PersonName.FirstName ="zhang";

       p.Email ="jillzhang@126.com";

       Person sameNamePerson = p.Clone()asPerson;

       sameNamePerson.ChangLastName("clr_");

       Console.WriteLine(p.PersonName.LastName);

       Console.WriteLine(sameNamePerson.PersonName.LastName);

 

 

       Person samePerson = p.MemberwiseClone()asPerson;

       samePerson.ChangLastName("Shadow");

 

       Console.WriteLine(p.PersonName.LastName);

       Console.WriteLine(sameNamePerson.PersonName.LastName);

 

       Console.Read();

    }

}

 

結果:

jill

clr_

Shadow

clr_

string是值類型仍是引用類型

        引用類型 

XmlSerializer使用的針對屬性的模式有什麼好處?解決了什麼問題? 

        只序列化有用的數據,而不是序列化整個對象。實現不必的數據冗餘,和提高序列化時的性能。 

特性可以放到某個方法的參數上?若是能夠,這有什麼用? 

        能夠,做用能夠對參數有進一步限定,好比輸入參數爲int類型,能夠經過容許AttributeTargets=ParameterInfoAttribute自定義實現來限定輸入參數的大小,好比當輸入參數小於100的時候便報錯。 

對方法的參數設置Attribute的例子

[AttributeUsage(AttributeTargets.Parameter)]

publicclassParameterAtt :Attribute

{

   publicint Min = 100;

}

 

publicclassAttributeTest

{

   publicvoid TestMethod([ParameterAtt(Min = 100)]int par1)

   {

       ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0];

       ParameterAtt att =ParameterAtt.GetCustomAttribute(para,typeof(ParameterAtt))asParameterAtt;

       if (att.Min > par1)

       {

           thrownewException("要求para1最小爲" + att.Min);

       }

   }

用什麼方法比較2個字符串類似,且在系統運行時長駐內存?

        生成正則表達式進行比較,使用靜態變量/方法就能夠長駐內存了

CollectionCollections的區別?

        Collection是集合類的上級接口,Collections是針對集合類的一個幫助類,它提供一系列靜態方法來實現對各類集合的搜索,排序,線程安全化操做。

        存在System.Collections命名空間

死鎖的必要條件?怎麼克服?

系統的資源不足,進程的推動的順序不合適,資源分配不當,一個資源每次只能被一個進程使用,一個資源請求資源時,而此時這個資源已阻塞,對已得到資源不放,進程得到資源時,未使用完前,不能強行剝奪。

什麼是死鎖?死鎖(Deadlock):是指兩個或兩個以上的進程在運行過程當中,因爭奪資源而形成的一種互相等待(誰也沒法再繼續推動)的現象,若無外力做用,它們都將沒法推動下去。

死鎖的四個必要條件

互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。

請求與保持條件(Hold and wait):已經獲得資源的進程能夠再次申請新的資源。

非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。

循環等待條件(Circular wait):系統中若干進程組成環路,該環路中每一個進程都在等待相鄰進程正佔用的資源。

處理死鎖的策略

1.忽略該問題。例如鴕鳥算法,該算法能夠應用在極少發生死鎖的的狀況下。爲何叫鴕鳥算法呢,由於傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥以爲看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。

2.檢測死鎖而且恢復。

3.仔細地對資源進行動態分配,以免死鎖。

4.經過破除死鎖四個必要條件之一,來防止死鎖產生。

什麼是Windows服務,它的生命週期與標準的EXE程序有什麼不一樣

Windows服務是運行在windows後臺指定用戶下(默認System)的應用程序,它沒有標準的UI界面,想比標準的EXE程序,Windows服務是在服務開始的時候建立,而在服務結束的時候銷燬,並且能夠設置服務是否與操做系統一塊兒啓動,一塊兒關閉。它支持三種方式:1)自動方式 2)手動方式 3)禁用。自動方式的時候,windows服務將在OS啓動後自動啓動運行,而手動方式則必須手工啓動服務,禁用的狀況下服務將不能被啓動。另外標準的EXE默認使用的當前登陸的用戶,而windows服務則默認使用System用戶,這在對系統資源訪問的時候特別須要注意。

請解釋轉發與跳轉的區別?

        轉發就是服務端的跳轉A頁面提交數據到B頁面,B頁面進行處理而後從服務端跳轉到其它頁面,跳轉就是指客戶端的跳轉

請簡述一下用Socket進行同步通信編程的詳細步驟

1、在應用程序和遠程設備中使用協議和網絡地址初始化套接字

2、在應用程序中經過指定端口和地址創建監聽

3、遠程設備發出鏈接請求

4、應用程序接受鏈接產生通訊scoket

5、應用程序和遠程設備開始通信(在通信中應用程序將掛起直到通信結束)

6、通信結束,關閉應用程序和遠程設備的Socket回收資源

什麼叫作SQL注入,如何防止?請舉例說明。

        利用sql關鍵字對網站進行攻擊。過濾關鍵字'

        所謂SQL注入(SQL Injection),就是利用程序員對用戶輸入數據的合法性檢測不嚴或不檢測的特色,故意從客戶端提交特殊的代碼,從而收集程序及服務器的信息,從而獲取想獲得的資料。

請敘述屬性與索引器的區別。

 屬性                                                                   索引器   

 經過名稱標識。                                     經過簽名標識。   

 經過簡單名稱或成員訪問來訪問。   經過元素訪問來訪問。   

 能夠爲靜態成員或實例成員。           必須爲實例成員。   

 屬性的get訪問器沒有參數。       索引器的get訪問器具備與索引器相同的形參表

 屬性的set訪問器包含隱式value參數。除了value參數外,索引器的  set  訪問器還具備與索引器相同的形參表。

String類與StringBuilder類有什麼區別?爲啥在.Net類庫中要同時存在這2個類?

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

選擇題

1、您要建立ASP.NET應用程序用於運行AllWin公司內部的Web站點,這個應用程序包含了50個頁面。您想要配置這個應用程序以便當發生一個 HTTP代碼錯誤時它能夠顯示一個自定義的錯誤頁面給用戶。您想要花最小的代價完成這些目標,您應該怎麼作?(多選)( CD  )

  A.在這個應用程序的Global.asax文件中建立一個Application_Error過程去處理ASP.NET代碼錯誤。

  B.在這個應用程序的Web.config文件中建立一個applicationError節去處理ASP.NET代碼錯誤。

  C.在這個應用程序的Global.asax文件中建立一個CustomErrors事件去處理HTTP錯誤。

  D.在這個應用程序的Web.config文件中建立一個CustomErrors節去處理HTTP錯誤。

  E.在這個應用程序的每一頁中添加一個Page指示符去處理ASP.NET代碼錯誤。

F.在這個應用程序的每一頁中添加一個Page指示符去處理ASP.NET HTTP錯誤。

2、您的公司有一個DB Server,名爲AllWin,其上裝了MS SQLSERVER 2000。如今須要您寫一個數據庫鏈接字符串,用以鏈接AllWinSQL SERVER中的一個名爲PubBase實例的Test庫。請問,應該選擇下面哪個字符串?( B )

  A.Server=AllWin;Data Source=PubBase;Initial Catalog=Test;Integrated Security=SSPI

  B.Server= AllWin;Data Source=PubBase;Database=Test;Integrated Security= SSPI

  C.Data Source= AllWin \PubBase;Initial Category=PubBase;Integrated Security= SSPI

  D.Data Source= AllWin \ PubBase;Database=Test;Integrated Security= SSPI

3.您要建立一個ASP.NET應用程序在DataGrid控件中顯示一個通過排序的列表。產品數據被存放於一個名爲PubBaseMicrosoft SQL Server 數據庫。每一個產品的主鍵是ProductIDNumeric型而且每一個產品有一個字母描述字段,名爲ProductName。您使用一個 SqlDataAdapter對象和一個SqlCommand對象經過調用一個存儲過程從數據庫中獲取產品數據。您將SqlCommand對象的 CommandType屬性設置爲CommandType.StoredProcedure,並將它的CommandText屬性設置爲 procProductList。您成功的獲取了一個DataTable對象,其中是已經按ProductID降序排列的產品列表。您打算顯示以相反的字母順序排列的ProductName,請問該怎麼作? (  B  )

  A.SqlCommand對象的CommandType屬性修改成CommandType.Text,將CommandText屬性修改成」SELECT * FROM procProductList ORDER BY ProductName DESC」。而後將這個DataTable對象綁定到DataGrid控件。

  B.建立一個基於這個DataTable對象的新的DataView並將這個DataViewSort屬性設置爲「ProductName DESC」。而後將這個DataView對象綁定到DataGrid控件。

  C.DataGrid控件的AllowSorting屬性設置爲True,並將DataGridColumnSortExpression屬性設置爲ProductName DESC.以顯示ProductName。而後將這個DataTable對象綁定到DataGrid控件。

  D.DataTable對象的DisplayExpression屬性設置爲ORDER BY ProductName DESC.。而後將這個DataTable對象綁定到DataGrid控件。

4、您須要建立一個ASP.NET應用程序,公司考慮使用Windows身份認證。

  全部的用戶都存在於AllWin這個域中。您想要使用下列認證規則來配置這個應用程序:

    a匿名用戶不容許訪問這個應用程序。

    b全部僱員除了TessKing都容許訪問這個應用程序。

  請問您應該使用如下哪個代碼段來配置這個應用程序?( A )

A. <authorization>

   <deny users=allwin\tess, allwin\king>

   <allow users=*>

   <deny users=?>

 </authorization>

B. <authorization>

   <allow users=*>

   <deny users=allwin\tess, allwin\king>

   <deny users=?>

 </authorization>

C. <authorization>

   <deny users=allwin\tess, allwin\king>

   <deny users=?>

   <allow users=*>

 </authorization>

D. <authorization>

   <allow users=allwin\tess, allwin\king>

   <allow users=*>

 </authorization>

E.<authorization>

   <allow users=*>

   <deny users=allwin\tess, allwin\king>

 </authorization>

5.對於一個實現了IDisposable接口的類,如下哪些項能夠執行與釋放或重置非託管資源相關的應用程序定義的任務?(多選) (   ABC     )

A.Close                B.DisposeC.Finalize

D.using                E.Quit

6.Net依賴如下哪項技術實現跨語言互用性?( C )

A.CLR              B.CTS              C.CLS                 D.CTT

7.如下哪一個類是int的基類?(   )

A.Int32             B.Object         C.ValueType           D.Int16

8.如下哪些能夠做爲接口成員?  (多選) ( ABDE )

A.方法B.屬性C.字段D.事件E.索引器

F.構造函數G.析構函數

9.如下關於refout的描述哪些項是正確的?(多選) (   ACD     )

A.使用ref參數,傳遞到ref參數的參數必須最早初始化。

B.使用out參數,傳遞到out參數的參數必須最早初始化。

C.使用ref參數,必須將參數做爲ref參數顯式傳遞到方法。

D.使用out參數,必須將參數做爲out參數顯式傳遞到方法。

10.「訪問範圍限定於此程序或那些由它所屬的類派生的類型」是對如下哪一個成員可訪問性含義的正確描述?( B  )

A.public       B.protected           C.internal        D.protected internal

11.class Class1

{

   private static int count = 0;

   static Class1()

   {

       count++;

   }

   public Class1()

   {

       count++;

   }

}

Class1 o1 = new Class1();

Class1 o2 = new Class1();

請問,o1.Count的值是多少?( C )

A.1        B.2            C.3             D.4

12.

using System;

abstractclassBaseClass

{

    publicvirtual string MethodA()

    {

       return"aaaa";

    }

    publicvirtual string MethodB()

    {

       return"bbbb";

    }

}

classClass1:BaseClass

{

    publicstring MethodA(string arg)

    {

       return"cccc";

    }

    publicoverride string MethodB()

    {

       return"dddd";

    }

}

classClass2:Class1

{

    newpublic string MethodB()

    {

       return"eeee";

    }

}

classMainClass

{

    publicstatic void Main(string[] args)

    {

       Class2 o =newClass2();

       Console.WriteLine(o.MethodA());

    }

}

結果:

aaaa

請按任意鍵繼續. . .

請問,o.MethodA調用的是: (  A  )

A.BaseClass.MethodAB.Class2.MethodA

C.Class1.MethodAD.都不是

 

13.接口是一種引用類型,在接口中能夠聲明(A),但不能夠聲明公有的域或私有的成員變量。

a)方法、屬性、索引器和事件; b)方法、屬性信息、屬性; c)索引器和字段;   d)事件和字段;

14.ASP.NET框架中,服務器控件是爲配合Web表單工做而專門設計的。服務器控件有兩種類型,它們是(A )

a)HTML控件和Web控件 b)HTML控件和XML控件 c)XML控件和Web控件   d)HTML控件和IIS控件

15.ASP.NET中,在Web窗體頁上註冊一個用戶控件,指定該控件的名稱爲」Mike」,正確的註冊指令爲( D)

a)<%@Register TagPrefix = 「Mike」 TagName = 「Space2」 Src = 「myX.ascx」%>

b)<%@Register TagPrefix = 「Space2」 TagName = 「Mike」 Src = 「myX.ascx」%>

c)<%@Register TagPrefix = 「SpaceX」 TagName = 「Space2」 Src = 「Mike」%>

d)以上皆非

16.ADO.NET中,對於Command對象的ExecuteNonQuery()方法和ExecuteReader()方法,下面敘述錯誤的是(C)。

a)insertupdatedelete等操做的Sql語句主要用ExecuteNonQuery()方法來執行;

b)ExecuteNonQuery()方法返回執行Sql語句所影響的行數。

c)Select操做的Sql語句只能由ExecuteReader()方法來執行;

d)ExecuteReader()方法返回一個DataReder對象;

17.下列ASP.NET語句(b)正確地建立了一個與SQL Server 2000數據庫的鏈接。

a)SqlConnection con1 = new Connection(「Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB」);

b)SqlConnection con1 = new SqlConnection(「Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB」);

c)SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB);

d)SqlConnection con1 = new OleDbConnection(「Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB」);

18.Winform中,關於ToolBar控件的屬性和事件的描述不正確的是(D)

a)Buttons屬性表示ToolBar控件的全部工具欄按鈕

b)ButtonSize屬性表示ToolBar控件上的工具欄按鈕的大小,如高度和寬度

c)DropDownArrows屬性代表工具欄按鈕(該按鈕有一列值須要如下拉方式顯示)旁邊是否顯示下箭頭鍵

d)ButtonClick事件在用戶單擊工具欄任何地方時都會觸發

19.ADO.NET中執行一個存儲過程時,若是要設置輸出參數則必須同時設置參數的方向和(B),必要時還要設置參數尺寸。

a)大小;            b)上限;             c)初始值;           d)類型;

20.若是將窗體的FormBoderStyle設置爲None,則( B)

a)窗體沒有邊框並不能調整大小;       b)窗體沒有邊框但能調整大小;

c)窗體有邊框但不能調整大小;         d)窗體是透明的;

21.若是要將窗體設置爲透明的,則( B)

a)要將FormBoderStyle屬性設置爲None     b)要將Opacity屬性設置爲小於100%得值;

c)要將locked屬性設置爲True             d)要將 Enabled屬性設置爲True

22.下列關於C#中索引器理解正確的是(B/C )

a)索引器的參數必須是兩個或兩個以上  b)索引器的參數類型必須是整數型

c)索引器沒有名字                    d)以上皆非

23.下面描述錯誤的是( C/D)

a)窗體也是控件; b)窗體也是類; c)控件是從窗體繼承來的; d)窗體的父類是控件類;

24.要對註冊表進行操做則必須包含( D)

a)System.ComponentModel命名空間; b)System.Collections命名空間;

c)System.Threading命名空間;     d)Microsoft.Win32命名空間;

25.要建立多文檔應用程序,須要將窗體的(D )屬性設爲true

a)DrawGrid        b)ShowInTaskbar         c)Enabled           d)IsMdiContainer

26.若是設treeView1=new TreeView(),則treeView1.Nodes.Add("根節點")返回的是一個 ()類型的值。

a)TreeNode

b)int

c)string

d)TreeView

27.下面關於XML的描述錯誤的是(D)。

a)XML提供一種描述結構化數據的方法;

b)XML是一種簡單、與平臺無關並被普遍採用的標準;

c)XML文檔可承載各類信息;

d)XML只是爲了生成結構化文檔;

28.裝箱、拆箱操做發生在: (  C  )

A.類與對象之間  B.對象與對象之間

C.引用類型與值類型之間  D.引用類型與引用類型之間

29.用戶類若想支持Foreach語句須要實現的接口是: (  A  )

A.IEnumerableB.IEnumerator

C.ICollectionD.ICollectData

30..Net Framework經過什麼與COM組件進行交互操做?(  C )

A.Side By SideB.Web Service

C.InteropD.PInvoke

31..Net依靠如下哪一項技術解決COM存在的Dll Hell問題的?( A  )

A.Side By SideB.Interop

C.PInvokeD.COM+

32.裝箱與拆箱操做是不是互逆的操做?( B )

A.B.

33.如下哪一個是能夠變長的數組?( D )

A.Array                     B.string[]

C.string[N]                 D.ArrayList

34.用戶自定義異常類須要從如下哪一個類繼承:( A )

A.Exception                            B.CustomException

C.ApplicationException                 D.BaseException

35如下敘述正確的是: B C

A.接口中能夠有虛方法。B.一個類能夠實現多個接口。 C.接口不能被實例化。 D.接口中能夠包含已實現的方法。

36從數據庫讀取記錄,你可能用到的方法有:B C D

     A. ExecuteNonQuery           B. ExecuteScalar     C. Fill                        D. ExecuteReader

37.對於一個實現了IDisposable接口的類,如下哪些項能夠執行與釋放或重置非託管資源相關的應用程序定義的任務?(多選)  (       ABC         ) 

 A.Close B.Dispose C.Finalize 

 D.using E.Quit 

38.如下關於refout的描述哪些項是正確的?(多選)  (   ACD   ) 

 A.使用ref參數,傳遞到ref參數的參數必須最早初始化。 

 B.使用out參數,傳遞到out參數的參數必須最早初始化。 

 C.使用ref參數,必須將參數做爲ref參數顯式傳遞到方法。 

 D.使用out參數,必須將參數做爲out參數顯式傳遞到方法。

39.在對SQL Server數據庫操做時應選用(A)。

a)SQL Server .NET Framework數據提供程序;

b)OLE DB .NET Framework數據提供程序;

c)ODBC .NET Framework數據提供程序;

d)Oracle .NET Framework數據提供程序;

40.下列選項中,(C)是引用類型。

a)enum類型  b)struct類型 c)string類型  d)int類型

41.關於ASP.NET中的代碼隱藏文件的描述正確的是(C

a)Web窗體頁的程序的邏輯由代碼組成,這些代碼的建立用於與窗體交互。編程邏輯惟一與用戶界面不一樣的文件中。該文件稱做爲「代碼隱藏」文件,若是用C#建立,該文件將具備「.ascx.cs」擴展名。

b)項目中全部Web窗體頁的代碼隱藏文件都被編譯成.EXE文件。

c)項目中全部的Web窗體頁的代碼隱藏文件都被編譯成項目動態連接庫(.dll)文件。

d)以上都不正確。

42.如下描述錯誤的是(A

a)C++中支持抽象類而在C#中不支持抽象類。

b)C++中可在頭文件中聲明類的成員而在CPP文件中定義類的成員,在C#中沒有頭文件而且在同一處聲明和定義類的成員。

c)C#中可以使用 new修飾符顯式隱藏從基類繼承的成員。

d)C#中要在派生類中從新定義基類的虛函數必須在前面加Override

43.C#的數據類型有(A

a)值類型和調用類型; b)值類型和引用類型;c)引用類型和關係類型;d)關係類型和調用類型;

44.下列描述錯誤的是(D

a)類不能夠多重繼承而接口能夠;

b)抽象類自身能夠定義成員而接口不能夠;

c)抽象類和接口都不能被實例化;

d)一個類能夠有多個基類和多個基接口;

45.DOM中,裝載一個XML文檔的方法(D

a)save方法  b)load方法 c)loadXML方法 d)send方法

46.下列關於構造函數的描述正確的是(C

a)構造函數能夠聲明返回類型。

b)構造函數不能夠用private修飾

c)構造函數必須與類名相同

d)構造函數不能帶參數

47.如下是一些C#中的枚舉型的定義,其中錯誤的用法有()

a)public enum var1{ Mike = 100, Nike = 102, Jike }

b)public enum var1{ Mike = 100, Nike, Jike }

c)public enum var1{ Mike=-1 , Nike, Jike }

d)public enum var1{ Mike , Nike , Jike }

48.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是(D)。

a)9                  b)2            c)6             d)越界

 

代碼書寫和閱讀

變量AB如何不經過第三變量來交換(C#實現)?

using System;

classMainClass

{

   staticvoid Main(string[] args)

   {

       int A = 5, B = 7;

       Console.WriteLine("交換前:A=" + A + "  B=" + B);

       A = A + B;

       B = A - B;

       A = A - B;

       Console.WriteLine("交換後:A=" + A + "  B=" + B);

       Console.ReadLine();

   }

}

結果:

交換前:A=5 B=7

交換後:A=7 B=5

請編程遍歷頁面上全部TextBox控件並給它賦值爲string.Empty

using System.Windows.Forms;

//部分代碼略

    foreach (Control cinthis.Controls)

    {

       if (cis TextBox)

       {

           TextBox tb = (TextBox)c;

           tb.Text ="aaa";

       }

    }

公司要求開發一個繼承System.Windows.Forms.ListView類的組件,要求達到如下的特殊功能:點擊ListView各列列頭時,能按照點擊列的每行值進行重排視圖中的全部行 (排序的方式如DataGrid類似)。根據您的知識,請簡要談一下您的思路

根據點擊的列頭,包該列的ID取出,按照該ID排序後,在給綁定到ListView中。

給定如下XML文件,完成算法流程圖。

<FileSystem>

   <DriverC>

   <DirDirName="MSDOS622">

       <FileFileName =" Command.com" ></File>

   </Dir>

   <FileFileName ="MSDOS.SYS" ></File>

   <FileFileName =" IO.SYS" ></File>

   </DriverC>

</FileSystem>

請畫出遍歷全部文件名(FileName)的流程圖(請使用遞歸算法)。下面只是個算法思路,不是代碼

void FindFile( Directory d )

{

  FileOrFolders = d.GetFileOrFolders();

  foreach( FileOrFolder fof in FileOrFolders ) 

  {

    if( fof is File ) 

            You Found a file;

    else if ( fof is Directory ) 

            FindFile( fof );

   }

}

根據線程安全的相關知識,分析如下代碼,當調用test方法時i>10時是否會引發死鎖?並簡要說明理由。

    publicvoid test(int i)

    {

       lock (this)

       {

           if (i > 10)

           {

               i--;

               test(i);

           }

       }

    }

        不會發生死鎖,(但有一點int是按值傳遞的,因此每次改變的都只是一個副本,所以不會出現死鎖。但若是把int換作一個object,那麼死鎖會發生)

根據委託(delegate)的知識,請完成如下用戶控件中代碼片斷的填寫:

namespace test

{

    publicdelegate voidOnDBOperate();

    publicclass UserControlBase : System.Windows.Forms.UserControl

    {

       publiceventOnDBOperate OnNew;

       privatevoid toolBar_ButtonClick(object sender, System.Windows.Forms.

                                                       ToolBarButtonClickEventArgs e)

       {

           if (e.Button.Equals(BtnNew))

           {

               //請在如下補齊代碼用來調用OnDBOperate委託簽名的OnNew事件。

           }

       }

    }

}

答:if( OnNew != null ) 

   OnNew( this, e );

分析如下代碼,計算運行結果

string strTmp = "abcdefg某某某";

int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;

int j= strTmp.Length;

以上代碼執行完後i=13,j=10

分析如下代碼,計算運行結果

using System;

classA

{

    public A()

    {

       PrintFields();

    }

    publicvirtual void PrintFields() { }

}

classB :A

{

    int x = 1;

    int y;

    public B()

    {

       y = -1;

    }

    publicoverride void PrintFields()

    {

       Console.WriteLine("x={0},y={1}", x, y);

    }

}

當使用new B()建立B的實例時,產生什麼輸出?

        X=1,Y=0new B()時,首先運行父類的構造方法,構造方法裏運行PrintFields()方法,此方法被B類從新,按B類的方法來運行。

求如下表達式的值,寫出您想到的一種或幾種實現方法: 1-2+3-4+……+m

using System;

classMainClass

{

   staticvoid Main(string[] args)

   {

       Console.WriteLine("請輸入數字:");

       int Num =int.Parse(Console.ReadLine().ToString());

       int Sum = 0;

       for (int i = 0; i < Num + 1; i++)

       {

           if ((i % 2) == 1)

           {

               Sum += i;

           }

           else

           {

               Sum -= i;

           }

       }

       System.Console.WriteLine(Sum.ToString());

       System.Console.ReadLine();

   }

}

結果:

請輸入數字:

5

3

產生一個int數組,長度爲100,並向其中隨機插入1-100,而且不能重複。

using System;

using System.Collections;

 

classMainClass

{

   staticvoid Main(string[] args)

   {

       int[] intArr =newint[100];

       ArrayList myList =newArrayList();

       Random rd =newRandom();

       int x = 0;

       while (myList.Count < 100)

       {

           x++;

           int num = rd.Next(1, 101);

           if (!myList.Contains(num))

           {

               myList.Add(num);

           }

       }

       for (int i = 0; i < 100; i++)

       {

           intArr[i] = (int)myList[i];

           Console.Write(intArr[i] +" ");

       }

       Console.WriteLine();

   }

}

13 11 2 52 74 7 56 42 69 20 58 84 15 19 87 78 53 36 5 16 34 54 82 22 55 76 61 79

 23 8 98 71 44 45 41 26 100 83 86 65 10 1 60 30 81 46 50 43 17 48 62 91 64 35 72

 21 6 75 14 9 92 12 96 49 80 33 37 39 93 18 88 63 38 70 28 27 40 95 3 24 97 25 8

5 29 66 68 73 31 59 90 4 57 99 94 89 51 67 77 47 32

請按任意鍵繼續. . .

程序設計:貓大叫一聲,全部的老鼠都開始逃跑,主人被驚醒。

      要求:1.要有聯動性,老鼠和主人的行爲是被動的。 2.考慮可擴展性,貓的叫聲可能引發其餘聯動效應。

using System;

publicsealedclassCat

{

    //貓叫時引起的事件

    publicevent EventHandler Calling;

 

    publicvoid Call()

    {

       Console.WriteLine("貓叫了...");

       if (Calling !=null)//檢查是否有事件註冊

           Calling(this,EventArgs.Empty);//調用事件註冊的方法.

    }

}

//老鼠,提供一個方法表示逃跑

publicsealedclassMouse

{

    publicvoid Escape(object sender,EventArgs e)

    {

       Console.WriteLine("老鼠逃跑了...");

    }

}

 

//主人,發生貓叫的時候驚醒

publicsealedclassMaster

{

    publicvoid Wakened(object sender,EventArgs e)

    {

       Console.WriteLine("主人驚醒了...");

    }

}

//用於測試的執行方法

//程序入口點

publicclassProgram

{

    publicstatic void Main(string[] args)

    {

       //創建貓

       Cat cat =newCat();

       //創建老鼠

       Mouse mouse =newMouse();

       //創建主人

       Master master =newMaster();

 

       //註冊事件

       cat.Calling +=newEventHandler(mouse.Escape);

       cat.Calling +=newEventHandler(master.Wakened);

 

       //貓開始叫

       cat.Call();

    }

}

結果:

貓叫了...

老鼠逃跑了...

主人驚醒了...

請按任意鍵繼續. . .

 

如下采用觀察者模式

//要點:1.聯動效果,運行代碼只要執行Cat.Cryed()方法.2.對老鼠和主人進行抽象

//評分標準: <1>.構造出CatMouseMaster三個類,並能使程序運行(2)

//<2>MouseMaster中提取抽象(5分)

//<3>聯動效應,只要執行Cat.Cryed()就能夠使老鼠逃跑,主人驚醒.(3)

using System;

using System.Collections;

publicinterfaceObserver

{

    //觀察者的響應,如是老鼠見到貓的反映

    void Response();

}

publicinterfaceSubject

{

    //針對哪些觀察者,這裏指貓的要撲捉的對象---老鼠

    void AimAt(Observer obs);

}

publicclassMouse :Observer

{

    privatestring name;

    public Mouse(string name,Subject subj)

    {

       this.name = name;

       subj.AimAt(this);

    }

 

    publicvoid Response()

    {

       Console.WriteLine(name +" attempt to escape!");

    }

}

publicclassMaster :Observer

{

    public Master(Subject subj)

    {

       subj.AimAt(this);

    }

 

    publicvoid Response()

    {

       Console.WriteLine("Host waken!");

    }

}

 

publicclassCat :Subject

{

    privateArrayList observers;

    public Cat()

    {

       this.observers =newArrayList();

    }

    publicvoid AimAt(Observer obs)

    {

       this.observers.Add(obs);

    }

    publicvoid Cry()

    {

       Console.WriteLine("Cat cryed!");

       foreach (Observer obsinthis.observers)

       {

           obs.Response();

       }

    }

}

classMainClass

{

    staticvoid Main(string[] args)

    {

       Cat cat =newCat();

       Mouse mouse1 =newMouse("mouse1", cat);

       Mouse mouse2 =newMouse("mouse2", cat);

       Master master =newMaster(cat);

       cat.Cry();

    }

}

Cat cryed!

mouse1 attempt to escape!

mouse2 attempt to escape!

Host waken!

請按任意鍵繼續. . .

寫出程序的輸出結果

using System;

classProgram

{

    privatestring str ="Class1.str";

    privateint i = 0;

    staticvoid StringConvert(string str)

    {

       str ="A string being converted.";

    }

    staticvoid StringConvert(Program c)

    {

       c.str ="B string being converted.";

    }

    staticvoid Add(int i)

    {

       i++;

    }

    staticvoid AddWithRef(refint i)

    {

       i++;

    }

    staticvoid Main()

    {

       int i1 = 10;

       int i2 = 20;

       string str ="str";

       Program c =newProgram();

       Add(i1);

       AddWithRef(ref i2);

       Add(c.i);

       StringConvert(str);//string沒法被改變           

       StringConvert(c);  //傳遞對象string能夠被改變

 

       Console.WriteLine(i1);

       Console.WriteLine(i2);

       Console.WriteLine(c.i);

       Console.WriteLine(str);

       Console.WriteLine(c.str);

    }

}

運行結果:

10

21

0

str

B string being converted.

請按任意鍵繼續. . .

寫出程序的輸出結果

using System;

publicabstractclassA

{

    public A()

    {

       Console.WriteLine('A');

    }

    publicvirtual void Fun()

    {

       Console.WriteLine("A.Fun()");

    }

}

publicclassB :A

{

    public B()

    {

       Console.WriteLine('B');

    }

    publicnew void Fun()

    {

       Console.WriteLine("B.Fun()");

    }

    publicstatic void Main()

    {

       A a =newB();

       a.Fun();

    }

}

 

運行結果:

A

B

A.Fun()

請按任意鍵繼續. . .

有繼承關係,在構造子類的時候會先構造父類;Fun函數在子類是被new了一下,只是顯示隱藏,並無重寫,因此輸出仍是A.Fun()。若是子類是被override,則最後輸出B.Fun

寫出程序的輸出結果

using System;

publicclassA

{

    publicvirtual void Fun1(int i)

    {

       Console.WriteLine(i);

    }

    publicvoid Fun2(A a)

    {

       a.Fun1(1); //以傳遞進來的對象選擇哪一個Fun1

       Fun1(5);   //以調用此方法的對象選擇哪一個Fun1

    }

}

publicclassB :A

{

    publicoverride void Fun1(int i)

    {

       base.Fun1(i + 1);

    }

    publicstatic void Main()

    {

       B b =newB();

       A a =newA();

       a.Fun2(b);

       b.Fun2(a);

    }

}

輸出結果:

2

5

1

6

請按任意鍵繼續. . .

冒泡排序

using System;

publicclassMainClass

{

   publicstaticvoid ArraySort()

   {

       int[] Arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };

       int t = 0;

       //從小到大排序

       for (int i = 0; i < Arr.Length - 1; i++)           //總共須要N-1趟

       {

           for (int j = 0; j < Arr.Length - 1 - i; j++)   //每趟總共須要(N-1-趟數)次比較

           {

               if (Arr[j] > Arr[j + 1])

               {

                   t = Arr[j];

                   Arr[j] = Arr[j + 1];

                   Arr[j + 1] = t;

 

               }

           }

       }

       foreach (int iin Arr)

       {

           Console.Write(i +",");

       }

   }

   publicstaticvoid Main()

   {

       ArraySort();

   }

}

輸出:1,2,3,4,5,6,7,8,9,請按任意鍵繼續. . .

寫出程序的輸出結果

using System;

classA

{

    publicstatic int X;

    static A()

    {

       X =B.Y + 1;

    }

}

classB

{

    publicstatic int Y =A.X + 1;

    static B() { }

    staticvoid Main()

    {

       Console.WriteLine("X={0},Y={1}",A.X,B.Y);

    }

}

輸出結果:

X=1,Y=2

請按任意鍵繼續. . .

.netC# or vb.net)中如何用戶自定義消息,並在窗體中處理這些消息。

在form中重載DefWndProc函數來處理消息:

protectedoverridevoid DefWndProc(ref System.WinForms.Message m)

{

    switch (m.msg)

    {

       case WM_Lbutton:

           ///string與MFC中的CString的Format函數的使用方法有所不一樣

           string message =string.Format("收到消息!參數爲:{0},{1}", m.wParam, m.lParam);

           MessageBox.Show(message);///顯示一個消息框

           break;

       case USER:

       //處理的代碼

       default:

           base.DefWndProc(ref m);///調用基類函數處理非自定義消息。

           break;

    }

}

請說明以下代碼的結果

using System;

classFather

{

    publicvirtual void show()

    {

       Console.WriteLine("Father");

    }

    staticvoid Main(string[] args)

    {

       Father obj =newChild();

       obj.show();

    }

}

classChild :Father

{

    publicoverride void show()

    {

       Console.WriteLine("Child");

    }

}

輸出:

Child

請按任意鍵繼續. . .

若是把virtualoverride去掉,輸出結果爲Father

相關文章
相關標籤/搜索