C#一些面试知识题
1.簡述 private、 protected、 public、internal 修飾符的訪問權(quán)限
答:
private:私有成員, 在類的內(nèi)部才可以訪問(只能從其聲明上下文中進(jìn)行訪問)。
protected:保護(hù)成員,該類內(nèi)部和從該類派生的類中可以訪問。
Friend:友元 ,聲明 friend 元素的程序集中的代碼可以訪問該元素,而不能從程序集外部訪問。
Protected Friend:在派生類或同一程序集內(nèi)都可以訪問。
public:公共成員,完全公開,沒有訪問限制。
internal:在同一命名空間內(nèi)可以訪問。(很少用)
2.列舉ASP.NET頁面之間傳遞值的幾種方式
答:
1.使用QueryString,如....?id=1;response. Redirect()....
2.使用Session變量
3.使用Server.Transfer
4.使用Application
5.使用Cache
6使用HttpContext的Item屬性
7.使用文件
8.使用數(shù)據(jù)庫
9.使用Cookie
3.一列數(shù)的規(guī)則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數(shù)是多少,用遞歸算法實(shí)現(xiàn)
答:
public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0) return 0;
else if(i > 0 && i <= 2) return 1;
else return Foo(i - 1) + Foo(i - 2);
}
}
4.C#中的委托是什么?事件是不是一種委托?
答:
委托是將一種方法作為參數(shù)代入到另一種方法。
是,事件是一種特殊的委托。 //比如:onclick事件中的參數(shù)就是一種方法。
5.實(shí)現(xiàn)多態(tài)的過程中overload 重載與override 重寫的區(qū)別
答:
overload 重載是方法的名稱相同,參數(shù)或參數(shù)類型不同,進(jìn)行多次重載以適應(yīng)不同的需要。
Override 是進(jìn)行基類中函數(shù)的重寫,實(shí)現(xiàn)多態(tài)。
6.請編程實(shí)現(xiàn)一個(gè)冒泡排序算法?
答:
int [] array = new int [*];
int temp = 0 ;
for (int i = 0; i < array.Length - 1; i++){
for (int j = i + 1 ; j < array.Length ; j++){
if (array[j] < array[i]){
temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
}
}
或者
public static void bubble_sort(int[] x)
{
for (int i = 0; i < x.Length; i++)
{
for (int j = i; j < x.Length; j++)
{
if (x[i] < x[j]) //從大到小排序
{
int temp;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
}
static void Main(string[] args)
{
int[] huage = { 1, 5, 2, 9, 3, 7, 6,4,8,0};
bubble_sort(huage);
foreach (var a in huage)
{
Console.WriteLine(a );
}
}
7.描述一下C#中索引器的實(shí)現(xiàn)過程,是否只能根據(jù)數(shù)字進(jìn)行索引
答:
C#通過提供索引器,可以象處理數(shù)組一樣處理對象。特別是屬性,每一個(gè)元素都以一個(gè)get或set方法暴露。索引器不單能索引數(shù)字(數(shù)組下標(biāo)),還能索引一些HASHMAP的字符串,所以,通常來說,C#中類的索引器通常只有一個(gè),就是THIS,但也可以有無數(shù)個(gè),只要你的參數(shù)列表不同就可以了。索引器和返回值無關(guān), 索引器最大的好處是使代碼看上去更自然,更符合實(shí)際的思考模式.
微軟官方一個(gè)示例:
索引器允許類或結(jié)構(gòu)的實(shí)例按照與數(shù)組相同的方式進(jìn)行索引。
索引器類似于屬性,不同之處在于它們的訪問器采用參數(shù)。
在下面的示例中,定義了一個(gè)泛型類(class SampleCollection<T>),并為其提供了簡單的 get 和 set 訪問器方法(作為分配和檢索值的方法)。Program 類為存儲字符串創(chuàng)建了此類的一個(gè)實(shí)例。
class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i] //注意,定義索引器。this 關(guān)鍵字用于定義索引器。
{
get
{
return arr[i]; //訪問器采用參數(shù)
}
set
{
arr[i] = value; //訪問器采用參數(shù)
}
}
}
// This class shows how client code uses the indexer
class Program
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World"; //這里 使用索引器進(jìn)行引用
System.Console.WriteLine(stringCollection[0]);
}
}
索引器使得對象可按照與數(shù)組相似的方法進(jìn)行索引。
get 訪問器返回值。set 訪問器分配值。
this 關(guān)鍵字用于定義索引器。
value 關(guān)鍵字用于定義由 set 索引器分配的值。
索引器不必根據(jù)整數(shù)值進(jìn)行索引,由您決定如何定義特定的查找機(jī)制。
索引器可被重載。
索引器可以有多個(gè)形參,例如當(dāng)訪問二維數(shù)組時(shí)。
8.用.net做B/S結(jié)構(gòu)的系統(tǒng),您是用幾層結(jié)構(gòu)來開發(fā),每一層之間的關(guān)系以及為什么要這樣分層?
答:
使用MVC模式分層
一般為3層:數(shù)據(jù)訪問層,業(yè)務(wù)層,表示層。
數(shù)據(jù)訪問層對數(shù)據(jù)庫進(jìn)行增刪查改。
業(yè)務(wù)層一般分為二層,業(yè)務(wù)表觀層實(shí)現(xiàn)與表示層的溝通,業(yè)務(wù)規(guī)則層實(shí)現(xiàn)用戶密碼的安全等。
表示層為了與用戶交互例如用戶添加表單。
9.什么是裝箱和拆箱?
答:
裝箱就是隱式的將一個(gè)值型轉(zhuǎn)換為引用型對象。
拆箱就是將一個(gè)引用型對象轉(zhuǎn)換成任意值型。
比如:
int i=0;
Syste.Object obj=i;
這個(gè)過程就是裝箱!就是將 i 裝箱!
比如:
int i=0;
System.Object obj=i;
int j=(int)obj;
這個(gè)過程前2句是將 i 裝箱,后一句是將 obj 拆箱!
10.什么是受管制(托管)的代碼?
答:
托管代碼是運(yùn)行.NET 公共語言運(yùn)行時(shí)CLR的代碼。
unsafe:非托管代碼,不經(jīng)過CLR運(yùn)行,程序員自行分配和釋放內(nèi)存空間。
11.ADO.net中常用的對象有哪些?分別描述一下。
答:
DataSet:數(shù)據(jù)集。
DataCommand:執(zhí)行語句命令。
DataAdapter:數(shù)據(jù)的集合,用語填充。
DataReader:數(shù)據(jù)只讀器
Connection:數(shù)據(jù)庫連接對像
Command:數(shù)據(jù)庫命令
12.什么是Code-Behind技術(shù)?
答:代碼后置。
13.在.net中,配件的意思是?
答:程序集。(中間語言,源數(shù)據(jù),資源,裝配清單)
14.常用的調(diào)用WebService的方法有哪些?
答:
1.使用WSDL.exe命令行工具。
2.使用VS.NET中的Add Web Reference菜單選項(xiàng)
15.在C#中,string str = null 與 string str = “” 請盡量使用文字或圖象說明其中的區(qū)別。
答:
string str = null 是不給他分配內(nèi)存空間,而string str = "" 給它分配長度為空字符串的內(nèi)存空間。
16.請?jiān)斒鲈贑#中類(class)與結(jié)構(gòu)(struct)的異同?
答:
class可以被實(shí)例化,屬于引用類型,class可以實(shí)現(xiàn)接口和單繼承其他類,還可以作為基類型,是分配在內(nèi)存的堆上的。
struct屬于值類型,不能作為基類型,但是可以實(shí)現(xiàn)接口,是分配在內(nèi)存的棧上的。
17.寫出一條Sql語句:取出表A中第31到第40記錄(SQLServer,以自動增長的ID作為主鍵,注意:ID可能不是連續(xù)的。
答:
解1: select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
18.GC是什么? 為什么要有GC?
答:
GC是垃圾收集器。程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿詣舆M(jìn)行管理。要請求垃圾收集,可以調(diào)用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
19.String s = new String("xyz");創(chuàng)建了幾個(gè)String Object?
答:
兩個(gè)對象,一個(gè)是“xyx”,一個(gè)是指向“xyx”的引用對象s。
20.try {}里有一個(gè)return語句,那么緊跟在這個(gè)try后的finally {}里的code會不會被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?
答:
會執(zhí)行,在return前執(zhí)行。
21.Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別?
答:
Set里的元素是不能重復(fù)的,那么用iterator()方法來區(qū)分重復(fù)與否。equals()是判讀兩個(gè)Set是否相等。
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當(dāng)兩個(gè)分離的對象的內(nèi)容和類型相配的話,返回真值。
22.談?wù)刦inal, finally, finalize的區(qū)別。
答:
final:修飾符(關(guān)鍵字),如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載
finally:在異常處理時(shí)提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會執(zhí)行,然后控制就會進(jìn)入 finally 塊(如果有的話)。
finalize:方法名。Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對象沒有被引用時(shí)對這個(gè)對象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對象之前對這個(gè)對象調(diào)用的。
23.如何處理幾十萬條并發(fā)數(shù)據(jù)?
答:
用存儲過程或事務(wù)。取得最大標(biāo)識的時(shí)候同時(shí)更新..注意主鍵不是自增量方式這種方法并發(fā)的時(shí)候是不會重復(fù)主鍵的..取得最大標(biāo)識要有一個(gè)存儲過程來獲取.
24.進(jìn)程和線程的區(qū)別?
答:
進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的單位;線程是CPU調(diào)度和分派的單位,一個(gè)進(jìn)程可以有多個(gè)線程,這些線程共享這個(gè)進(jìn)程的資源。
25.堆和棧的區(qū)別?
答:
棧:由編譯器自動分配、釋放。在函數(shù)體中定義的變量通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內(nèi)存函數(shù)分配得到的就是在堆上。
26.成員變量和成員函數(shù)前加static的作用?
答:
它們被稱為常成員變量和常成員函數(shù),又稱為類成員變量和類成員函數(shù)。分別用來反映類的狀態(tài)。比如類成員變量可以用來統(tǒng)計(jì)類實(shí)例的數(shù)量,類成員函數(shù)負(fù)責(zé)這種統(tǒng)計(jì)的動作。
27.請指出GAC的含義?
答:全局程序集緩存。
28.DataReader與Dataset有什么區(qū)別?
答
DataReader和DataSet最大的區(qū)別在于,DataReader使用時(shí)始終占用SqlConnection,在線操作數(shù)據(jù)庫.任何對SqlConnection的操作都會引發(fā)DataReader的異常.因?yàn)镈ataReader每次只在內(nèi)存中加載一條數(shù)據(jù),所以占用的內(nèi)存是很小的..因?yàn)镈ataReader的特殊性和高性能.所以DataReader是只進(jìn)的.你讀了第一條后就不能再去讀取第一條了. DataSet則是將數(shù)據(jù)一次性加載在內(nèi)存中.拋棄數(shù)據(jù)庫連接.讀取完畢即放棄數(shù)據(jù)庫連接.因?yàn)镈ataSet將數(shù)據(jù)全部加載在內(nèi)存中.所以比較消耗內(nèi)存.但是確比DataReader要靈活.可以動態(tài)的添加行,列,數(shù)據(jù).對數(shù)據(jù)庫進(jìn)行回傳更新操作。
29.在c#中using和new這兩個(gè)關(guān)鍵字有什么意義,請寫出你所知道的意義?using 指令和語句 new 創(chuàng)建實(shí)例 new 隱藏基類中方法。
答:
using:引入名稱空間或者使用非托管資源,使用完對象后自動執(zhí)行實(shí)現(xiàn)了IDisposable接口的類的Dispose方法
new:新建實(shí)例或者隱藏父類方法
30.什么是虛函數(shù)?什么是抽象函數(shù)?
答:
虛函數(shù):沒有實(shí)現(xiàn)的,可由子類繼承并重寫的函數(shù)。Virtual CallSomeOne();
抽象函數(shù):規(guī)定其非虛子類必須實(shí)現(xiàn)的函數(shù),必須被重寫。public abstract void CallSomeOne();
31.C#中 property 與 attribute的區(qū)別,他們各有什么用處,這種機(jī)制的好處在哪里?
答:
在C#中有兩個(gè)屬性,分別為Property和Attribute,
Property比較簡單,就是我們常用的get和set,主要用于為類中的private和protected變量提供讀取和設(shè)置的接口。
Attribute用來說明這個(gè)事物的各種特征的一種描述。而Attribute就是干這事的。它允許你將信息與你定義的C#類型相關(guān)聯(lián),作為類型的標(biāo)注。這些信息是任意的,就是說,它不是由語言本身決定的,你可以隨意建立和關(guān)聯(lián)任何類型的任何信息。你可以作用屬性定義設(shè)計(jì)時(shí)信息和運(yùn)行時(shí)信息,甚至是運(yùn)行時(shí)的行為特征。關(guān)鍵在于這些信息不僅可以被用戶取出來作為一種類型的標(biāo)注,它更可以被編譯器所識別,作為編譯時(shí)的一種附屬條件參加程序的編譯。定義屬性:屬性實(shí)際上是一個(gè)派生自System.Attribute基類的類。System.Attribute類含有幾個(gè)用于訪問和檢查自定義屬性的方法。盡管你有權(quán)將任何類定義為屬性,但是按照慣例來說,從System.Attribute派生類是有意義的
32.HashMap和Hashtable的區(qū)別
答:
HashMap是Hashtable的輕量級實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable
33..NET和C#有什么區(qū)別
答:
.NET一般指 .NET FrameWork框架,它是一種平臺,一種技術(shù)。
C#是一種編程語言,可以基于.NET平臺的應(yīng)用。
34.啟動一個(gè)線程是用run()還是start()?
答:
啟動一個(gè)線程是調(diào)用start()方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會立即運(yùn)行。
run()方法可以產(chǎn)生必須退出的標(biāo)志來停止一個(gè)線程。
35.數(shù)組有沒有l(wèi)ength()這個(gè)方法? String有沒有l(wèi)ength()這個(gè)方法?
答:
數(shù)組沒有l(wèi)ength()這個(gè)方法,有l(wèi)ength的屬性。String有有l(wèi)ength()這個(gè)方法。
36.值類型和引用類型的區(qū)別?寫出C#的樣例代碼
答:
基于值類型的變量直接包含值。將一個(gè)值類型變量賦給另一個(gè)值類型變量時(shí),將復(fù)制包含的值。這與引用類型變量的賦值不同,引用類型變量的賦值只復(fù)制對對象的引用,而不復(fù)制對象本身。所有的值類型均隱式派生自 System.ValueType。與引用類型不同,從值類型不可能派生出新的類型。但與引用類型相同的是,結(jié)構(gòu)也可以實(shí)現(xiàn)接口。與引用類型不同,值類型不可能包含 null值。然而,可空類型功能允許將 null 賦給值類型。每種值類型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來初始化該類型的默認(rèn)值。
值類型主要由兩類組成:結(jié)構(gòu)、枚舉,結(jié)構(gòu)分為以下幾類:Numeric(數(shù)值)類型、整型、浮點(diǎn)型、decimal、bool、用戶定義的結(jié)構(gòu)。引用類型的變量又稱為對象,可存儲對實(shí)際數(shù)據(jù)的引用。聲明引用類型的關(guān)鍵字:class、interface、delegate、內(nèi)置引用類型:object、string
37.C#中的接口和類有什么異同。
答:
異:不能直接實(shí)例化接口。接口不包含方法的實(shí)現(xiàn)。接口、類和結(jié)構(gòu)可從多個(gè)接口繼承。但是C# 只支持單繼承:類只能從一個(gè)基類繼承實(shí)現(xiàn)。類定義可在不同的源文件之間進(jìn)行拆分。
同:接口、類和結(jié)構(gòu)可從多個(gè)接口繼承。接口類似于抽象基類:繼承接口的任何非抽象類型都必須實(shí)現(xiàn)接口的所有成員。接口可以包含事件、索引器、方法和屬性。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。
2、在dotnet中類(class)與結(jié)構(gòu)(struct)的異同?
Class可以被實(shí)例化,屬于引用類型,是分配在內(nèi)存的堆上的。類是引用傳遞的。
Struct屬于值類型,是分配在內(nèi)存的棧上的。結(jié)構(gòu)體是復(fù)制傳遞的。加分的回答:Int32、Boolean等都屬于結(jié)構(gòu)體。
3、屬性和public字段的區(qū)別是什么?調(diào)用set方法為一個(gè)屬性設(shè)值,然后用get方法讀取出來的值一定是set進(jìn)去的值嗎?
屬性可以對設(shè)值、取值的過程進(jìn)行非法值控制,比如年齡禁止設(shè)值負(fù)數(shù),而字段則不能進(jìn)行這樣的設(shè)置。雖然一般情況下get讀取的值就是set設(shè)置的值,但是可以讓get讀取的值不是set設(shè)置的值的,極端的例子。Public Age{get{return 100;}set{}}。加分的補(bǔ)充回答:用reflector反編譯可以看出,屬性內(nèi)部本質(zhì)上就是set_***、get_***方法,
4、使用構(gòu)造方法能解決:
1)在賦初值時(shí),重復(fù)的書寫對象名
2)假如我們有一個(gè)屬性,不允許用戶隨意改動.我們一般把這個(gè)屬性定義為只讀類型的屬性.
那么這個(gè)只讀類型的屬性就不能在實(shí)例化后對他賦值了,那么我們?nèi)绾螌λ跏蓟?我們
可以通過構(gòu)造方來進(jìn)行初始化.
我們定義好一個(gè)類,如果沒有寫構(gòu)造方法,那么編譯器就會自動在這個(gè)類中給我們添加一個(gè)沒
有參數(shù)的構(gòu)造方法.
一旦我們寫了一個(gè)構(gòu)造方法,那么編譯器就不會再給我們添加這個(gè)沒有參數(shù)構(gòu)造方法了.
5、不能在結(jié)構(gòu)中定義析構(gòu)函數(shù)。只能對類使用析構(gòu)函數(shù)。
一個(gè)類只能有一個(gè)析構(gòu)函數(shù)。
無法繼承或重載析構(gòu)函數(shù)。
無法調(diào)用析構(gòu)函數(shù)。它們是被自動調(diào)用的。
析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù)。
6、using關(guān)鍵字有什么用?什么是IDisposable?
using可以聲明namespace的引入,還可以實(shí)現(xiàn)非托管資源的釋放,實(shí)現(xiàn)了IDisposiable的類在using中創(chuàng)建,using結(jié)束后會自動調(diào)用該對象的Dispose方法,釋放資源。加分的補(bǔ)充回答:using其實(shí)等價(jià)于try……finally,用起來更方便。
7、string str = null 與 string str = “”說明其中的區(qū)別。
答:string str = null 是不給他分配內(nèi)存空間,而string str = \“\” 給它分配長度為空字符串的內(nèi)存空間。 string str = null沒有string對象,string str = “”有一個(gè)字符串對象。
8、誰說字符串不可變?string s = "abc";s="123",s這不是變了嗎
要區(qū)分變量名和變量指向的值的區(qū)別。程序中可以有很多字符串,然后由字符串變量指向他們,變量可以指向其他的字符串,但是字符串本身沒有變化。字符串不可變性指的是內(nèi)存中的字符串不可變,而不是變量不變。
string s10 = s1;//s10指向s1指向的字符串,而不是s10指向s1,哪怕s1以后指向了其他內(nèi)存,那么s10還是指向"hello"
9、字符串替換:string Replace(string oldValue, string newValue)將字符串中的出現(xiàn)oldValue的地方替換為newValue。例子:名字替換。
取子字符串:string Substring(int startIndex),取從位置startIndex開始一直到最后的子字符串;
string Substring(int startIndex, int length),取從位置startIndex開始長度為length的子字符串,如果子字符串的長度不足length則報(bào)錯(cuò)。
bool Contains(string value)判斷字符串中是否含有子串value
bool StartsWith(string value)判斷字符串是否以子串value開始;
bool EndsWith (string value)判斷字符串是否以子串value結(jié)束;
int IndexOf(string value):取子串value第一次出現(xiàn)的位置。
LastIndexof
Trim()
TrimEnd()
TrimStrat()
IsNullOrEmpty()
string.Join()
Int IndexOf(string value,int startIndex)
Containts
remove
10、StringBuilder 和 String 的區(qū)別?(*)
答:String 在進(jìn)行運(yùn)算時(shí)(如賦值、拼接等)會產(chǎn)生一個(gè)新的實(shí)例,而 StringBuilder?則不會。所以在大量字符串拼接或頻繁對某一字符串進(jìn)行操作時(shí)最好使用 StringBuilder,不要使用 String
?如果要操作一個(gè)不斷增長的字符串,盡量不用String類,改用StringBuilder類。兩個(gè)類的工作原理不同:String類是一種傳統(tǒng)的修改字符串的方式,它確實(shí)可以完成把一個(gè)字符串添加到另一個(gè)字符串上的工作沒錯(cuò),但是在.NET框架下,這個(gè)操作實(shí)在是劃不來。因?yàn)橄到y(tǒng)先是把兩個(gè)字符串寫入內(nèi)存,接著刪除原來的String對象,然后創(chuàng)建一個(gè)String對象,并讀取內(nèi)存中的數(shù)據(jù)賦給該對象。這一來二去的,耗了不少時(shí)間。而使用System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,能夠在已有對象的原地進(jìn)行字符串的修改,簡單而且直接。當(dāng)然,一般情況下覺察不到這二者效率的差異,但如果你要對某個(gè)字符串進(jìn)行大量的添加操作,那么StringBuilder類所耗費(fèi)的時(shí)間和String類簡直不是一個(gè)數(shù)量級的。
10、堆和棧的區(qū)別
棧是編譯期間就分配好的內(nèi)存空間,因此你的代碼中必須就棧的大小有明確的定義;局部值類型變量、值類型參數(shù)等都在棧內(nèi)存中。
堆是程序運(yùn)行期間動態(tài)分配的內(nèi)存空間,你可以根據(jù)程序的運(yùn)行情況確定要分配的堆內(nèi)存的大小。
11、值類型和引用類型的區(qū)別
1.將一個(gè)值類型變量賦給另一個(gè)值類型變量時(shí),將復(fù)制包含的值。引用類型變量的賦值只復(fù)制對對象的引用,而不復(fù)制對象本身。
2.值類型不可能派生出新的類型:所有的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結(jié)構(gòu)也可以實(shí)現(xiàn)接口。
3.值類型不可能包含 null 值:
4.每種值類型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來初始化該類型的默認(rèn)值。
(然而,可空類型功能允許將 null 賦給值類型。
)
12、虛方法與重寫
1、方法不能用static修飾
2、方法重寫與基類的簽名必須一致
3、virtual不能與private一起使用
4.虛方法為什么不能加static因?yàn)?虛方法是父類,加static,那么就是類調(diào)用這個(gè)方法,和對象無關(guān)了,那子類就調(diào)不了,
base.Fun();的目的主要是添加邏輯
常見虛方法:
Equal()
ToString()
GetHashCode()
13、override與重載(overload)的區(qū)別
重載是方法的名稱相同。參數(shù)或參數(shù)類型不同,進(jìn)行多次重載以適應(yīng)不同的需要。重載(overload)是面向過程的概念。
Override 是進(jìn)行基類中函數(shù)的重寫。Override是面向?qū)ο蟮母拍?br />14、C#中的接口和類有什么異同。
不同點(diǎn):
不能直接實(shí)例化接口。
接口不包含方法的實(shí)現(xiàn)。
接口可以多繼承,類只能單繼承。
類定義可在不同的源文件之間進(jìn)行拆分。
相同點(diǎn):
接口、類和結(jié)構(gòu)都可以從多個(gè)接口繼承。
接口類似于抽象基類:繼承接口的任何非抽象類型都必須實(shí)現(xiàn)接口的所有成員。
接口和類都可以包含事件、索引器、方法和屬性。
C#支持多重繼承么?
類之間不支持,接口之間支持。類對接口叫做實(shí)現(xiàn),不叫繼承。 類是爹、接口是能力,能有多個(gè)能力,但不能有多個(gè)爹。
15、abstract class和interface有什么區(qū)別?
相同點(diǎn):
都不能被直接實(shí)例化,都可以通過繼承實(shí)現(xiàn)其抽象方法。
不同點(diǎn):
接口支持多繼承;抽象類不能實(shí)現(xiàn)多繼承。
接口只能定義行為;抽象類既可以定義行為,還可能提供實(shí)現(xiàn)。
接口可以用于支持回調(diào)(CallBack);抽象類不能實(shí)現(xiàn)回調(diào),因?yàn)槔^承不支持。
接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實(shí)現(xiàn)的方法;
抽象類可以定義字段、屬性、包含有實(shí)現(xiàn)的方法。
接口可以作用于值類型(Struct)和引用類型(Class);抽象類只能作用于引用類型。例如,Struct就可以繼承接口,而不能繼承類。
加分的補(bǔ)充回答:講設(shè)計(jì)模式的時(shí)候SettingsProvider的例子。
16、裝箱與拆箱(*)
將值類型“賦值”給引用類型
對于值類型中的引用成員,保留原數(shù)據(jù)
效率問題
17、 什么時(shí)候用虛方法來實(shí)現(xiàn)多態(tài)?
什么使用用抽象類來實(shí)現(xiàn)多態(tài)?
什么時(shí)候用接口來實(shí)現(xiàn)多態(tài)?
多態(tài):
1、“一個(gè)接口,多種方法”
同一操作作用于不同的對象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。
? 多態(tài)的三個(gè)條件:
a. ? ?繼承的存在(繼承是多態(tài)的基礎(chǔ),沒有繼承就沒有多態(tài)).
b. ? ?子類重寫父類的方法(多態(tài)下調(diào)用子類重寫的方法).
c. ? ?父類引用變量指向子類對象(子類到父類的類型轉(zhuǎn)換).
重載(overload)和重寫(override)是實(shí)現(xiàn)多態(tài)的兩種主要方式。
? 2、實(shí)現(xiàn)多態(tài):
接口多態(tài)性。
繼承多態(tài)性。
通過抽象類實(shí)現(xiàn)的多態(tài)性。
18、所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。具體來說,它是利用現(xiàn)有應(yīng)用程序,將(惡意的)SQL命令注入到后臺數(shù)據(jù)庫引擎執(zhí)行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個(gè)存在安全漏洞的網(wǎng)站上的數(shù)據(jù)庫,而不是按照設(shè)計(jì)者意圖去執(zhí)行SQL語句。比如先前的很多影視網(wǎng)站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.
?
轉(zhuǎn)載于:https://www.cnblogs.com/hudean/p/11063197.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: WireShark 自带工具 editc
- 下一篇: C#入门详解(14)