總結.Net基礎知識(總結.Net基礎知識)
2023-08-09 08:01:09
什麼是面向對象
面向對象OO = 面向對象的分析OOA 面向對象的設計OOD 面向對象的編程OOP;
通俗的解釋就是萬物皆對象,把所有的事物都看作一個個可以獨立的對象(單元),它們可以自己完成自己的功能,而不是像C那樣分成一個個函數;
現在純正的OO語言主要是Java和C#,C 也支持OO,C是面向過程的。
闡述面向接口、面向對象、面向方面編程的區別
面向對象不好解釋,可以理解為以一切元素都是對象,在設計時以對象為單位,考慮它的屬性及方法。設計中採用了封裝、繼承、抽象的手法
面向接口本身就是面向對象的,無所謂區別,只不過面向接口的好處是耦合性低
面向方面Aspect-Oriented Programming (AOP)就是大名鼎鼎的AOP。其實有點象struts裡的攔截。
舉例:假設有在一個應用系統中,有一個共享的數據必須被並發同時訪問,首先,將這個數據封裝在數據對象中,稱為Data Class,同時,將有多個訪問類,專門用於在同一時刻訪問這同一個數據對象。
程序集與命名空間有什麼不同?
命名空間是用於避免命名衝突,專用於組織代碼,當代碼要在其他某個應用程式中重用時,可以降低複雜性。
程序集是重用代碼的一種方式驗證控制項
不同: 可以將相同命名空間中的類部署到不同的程序集中,也可以命名空間中的類部署到一個程序集中
什麼是WEB控制項?使用WEB控制項有那些優勢?
WEB控制項是能拖放在WEB頁面上的控制項
WEB控制項分為:內部控制項, 列表控制項, 複雜控制項,
•WEB控制項優勢:
l Web 控制項是對象,與對象一樣,Web 控制項擁有方法和屬性,並且響應事件
l 一旦將 Web 控制項包括在 Web 頁中,就可以設置其屬性並調用其方法
l 可以為 Web 控制項編寫伺服器端代碼以響應在客戶端上發生的事件
ASP.NET中共有幾種類型的控制項?各有什麼區別?
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服務端控制項能否調用客戶端方法?如果能,請解釋如何調用?
可以調用
例如:
C#, Java 和 c 的特點,有什麼相同的地方,不同的地方, C#分別從c 和java中吸取了他們那些優點?
C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑑了Delphi的一個特點,與COM(組件對象模型)是直接集成。
微軟c#語言定義主要是從C和C 繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C 繼承的可選選項方面比Java要廣泛一些(比如說 structs),它還增加了自己新的特點(比方說原始碼版本定義).
C#從Java繼承而來的特點
類:在C#中類的聲明與Java很相似。特點看起來與Java相比沒有變化.
布爾運算:條件表達式的結果是布爾數據類型,布爾數據類型是這種語言中獨立的一種數據類型.從布爾類型到其他類型沒有直接的轉換過程.布爾常量true和false是C#中的關鍵字.
錯誤處理:如Java中那樣,通過拋出和捕捉異常對象來管理錯誤處理過程.
內存管理:由底層.NET框架進行自動內存垃圾回收.
C#從C和C 繼承的特點
編譯:程序直接編譯成標準的二進位可執行形式.
結構體:一個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編譯器的普遍存在使得Java和C#在性能上相對相同.象"C#是編譯語言而Java是解釋性的,"之類的聲明只是商業技巧.Java的中間代碼和 MSIL都是中間的彙編形式的語言,它們在運行時或其它的時候被編譯成機器代碼.
命名空間中的聲明:當你創建一個程序的時候,你在一個命名空間裡創建了一個或多個類.同在這個命名空間裡(在類的外面)你還有可能聲明界面,枚舉類型和結構體.必須使用using關鍵字來引用其他命名空間的內容.
基本的數據類型:C#擁有比C,C 或者Java更廣泛的數據類型.這些類型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一樣,所有這些類型都有一個固定的大小.又象C和C 一樣,每個數據類型都有有符號和無符號兩種類型.與 Java相同的是,一個字符變量包含的是一個16位的Unicode字符.C#新的數據類型是decimal數據類型,對於貨幣數據,它能存放28位10 進位數字.
兩個基本類:一個名叫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 = null與string str = 「」的區別。
string str = null是不給他分配內存空間,而string str = ""給它分配長度為空字符串的內存空
怎樣理解靜態變量?靜態成員和非靜態成員的區別?
靜態變量屬於類,而不屬於對象;並對所有對象所享;靜態成員在加類的時候就被加載。
靜態成員和非靜態成員的區別?
靜態變量使用 static 修飾符進行聲明,靜態成員在加類的時候就被加載(在類被實例化時創建,哪個對),通過類進行訪問
不帶有static 修飾符聲明的變量稱做非靜態變量,在對象被實例化時創建,通過對象進行訪問
一個類的所有實例的同一靜態變量都是同一個值,同一個類的不同實例的同一非靜態變量可以是不同的值
靜態函數的實現裡不能使用非靜態成員,如非靜態變量、非靜態函數等
DataReader和DataSet的異同
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.Object的3個虛方法,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。但與引用類型相同的是,結構也可以實現接口。
3、null:與引用類型不同,值類型不可能包含 null 值。然而,可空類型功能允許將 null 賦給值類型。
4、每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
值類型主要由兩類組成:結構、枚舉
結構分為以下幾類:Numeric(數值)類型、整型、浮點型、decimal、bool、用戶定義的結構。
引用類型的變量又稱為對象,可存儲對實際數據的引用。聲明引用類型的關鍵字:class、interface、delegate、內置引用類型: object、string
5、值類型存貯在棧中,而引用類型存貯在動態的堆中,棧是先進先出的有系統管理的空間,而堆是由應用程式控制的可隨時申請和釋放該空間,在Donnet中一般情況下有垃圾收集器處理,他們的不同導致在編程上的不同。
例:
"a=null"的意思是:a的引用置為空但此時StringBuilder的堆空間並沒有被釋放,因此在此之後,輸出b時,仍然可以輸出mxh
輸出結果:
mxh
mxh
請按任意鍵繼續. . .
C#中的委託是什麼?如何理解委託?
簡單的說:委託是一種方法容器,裡面可以裝載若干個具有相同籤名的方法引用地址,那麼調用委託,就相當於同時調用了該容器內的所有方法。
委託可以看做一種新的對象類型,具有面向對象的特點,定義時可籤名接收參數,委託實例化時,可以把方法名作為一個參數傳遞給委託對象,委託可以理解為指向函數的引用。生成的委託對象可以代理所傳遞的方法,可以接收方法的參數。也就是定義了委託,可以在不用調用原方法的情況下,調用那個方法
例:
委託類似於 C或 C 中的函數指針。但不同的是委託是面向對象、類型安全的。
委託允許將方法作為參數進行傳遞。
委託可用於定義回調方法。
委託可以連結在一起;創建多個對象,使用「 =」累加到同一個委託對象上的引用上,例如,可以對一個事件調用多個方法。
方法不需要與委託籤名精確匹配。有關更多信息,請參見協變和逆變。
C# 2。0 版引入了匿名方法的概念,此類方法允許將代碼塊作為參數傳遞,以代替單獨定義的方法。如:
結果:
事件信息:Text屬性被更改了
事件發布者:Name類的對象
你輸入的名字是:張三
請按任意鍵繼續. . .
使用匿名方法,直接將方法體的代碼和委託對象關聯而不需要單獨定義此方法
也可以用Lambda表達式把delegate隱藏