2021UpdateC#.NET筆試題基礎(chǔ)篇

1.C#中堆和棧的區(qū)別?

棧:由編譯器自動(dòng)分配、釋放。在函數(shù)體中定義的變量通常在棧上。堆:一般由程序員分配釋放。用new、malloc等分配內(nèi)存函數(shù)分配得到的就是在堆上。存放在棧中時(shí)要管存儲(chǔ)順序,保持著先進(jìn)后出的原則,他是一片連續(xù)的內(nèi)存域,系統(tǒng)自動(dòng)分配和維護(hù);堆:是無序的,他是一片不連續(xù)的內(nèi)存域,有用戶自己來控制和釋放,如果用戶自己不釋放的話,當(dāng)內(nèi)存達(dá)到一定的特定值時(shí),通過垃圾回收器(GC)來回收。棧內(nèi)存無需我們管理,也不受GC管理。當(dāng)棧頂元素使用完畢,立馬釋放。而堆則需要GC清理。使用引用類型的時(shí)候,一般是對(duì)指針進(jìn)行的操作而非引用類型對(duì)象本身。但是值類型則操作其本身

2.C#中的委托是什么?事件是不是一種委托?

委托的本質(zhì)是一個(gè)類,委托是將一種方法作為參數(shù)代入到另一種方法。事件是委托的實(shí)例,事件是一種特殊的委托。//比如:onclick事件中的參數(shù)就是一種方法。

3.C#靜態(tài)構(gòu)造函數(shù)特點(diǎn)是什么?

最先被執(zhí)行的構(gòu)造函數(shù),且在一個(gè)類里只允許有一個(gè)無參的靜態(tài)構(gòu)造函數(shù)執(zhí)行順序:靜態(tài)變量>靜態(tài)構(gòu)造函數(shù)>實(shí)例變量>實(shí)例構(gòu)造函數(shù)

4.CTS、CLS、CLR分別作何解釋

CTS:通用語言系統(tǒng)。CLS:通用語言規(guī)范。CLR:公共語言運(yùn)行庫。CTS:Common Type System 通用類型系統(tǒng)。Int32、Int16→int、String→string、Boolean→bool。每種語言都定義了自己的類型,.NET通過CTS提供了公共的類型,然后翻譯生成對(duì)應(yīng)的.NET類型。CLS:Common Language Specification 通用語言規(guī)范。不同語言語法的不同。每種語言都有自己的語法,.NET通過CLS提供了公共的語法,然后不同語言翻譯生成對(duì)應(yīng)的.NET語法。CLR:Common Language Runtime 公共語言運(yùn)行時(shí),就是GC、JIT等這些。有不同的CLR,比如服務(wù)器CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相當(dāng)于一個(gè)發(fā)動(dòng)機(jī),負(fù)責(zé)執(zhí)行IL。

5.C#中什么是值類型與引用類型?

值類型:struct、enum、int、float、char、bool、decimal引用類型:class、delegate、interface、array、object、string

6.請(qǐng)?jiān)斒鲈贑#中類(class)與結(jié)構(gòu)(struct)的異同?

class可以被實(shí)例化,屬于引用類型,class可以實(shí)現(xiàn)接口和單繼承其他類,還可以作為基類型,是分配在內(nèi)存的堆上的struct屬于值類型,不能作為基類型,但是可以實(shí)現(xiàn)接口,是分配在內(nèi)存的棧上的.

7.new關(guān)鍵字的作用

運(yùn)算符:創(chuàng)建對(duì)象實(shí)例修飾符:在派生類定義一個(gè)重名的方法,隱藏掉基類方法約束:泛型約束定義,約束可使用的泛型類型

8.int?和int有什么區(qū)別

int?為可空類型,默認(rèn)值可以是nullint默認(rèn)值是0int?是通過int裝箱為引用類型實(shí)現(xiàn)

9.C#中值傳遞與引用傳遞的區(qū)別是什么?

值傳遞時(shí),系統(tǒng)首先為被調(diào)用方法的形參分配內(nèi)存空間,并將實(shí)參的值按位置一一對(duì)應(yīng)地復(fù)制給形參,此后,被調(diào)用方法中形參值得任何改變都不會(huì)影響到相應(yīng)的實(shí)參;

引用傳遞時(shí),系統(tǒng)不是將實(shí)參本身的值復(fù)制后傳遞給形參,而是將其引用值(即地址值)傳遞給形參,因此,形參所引用的該地址上的變量與傳遞的實(shí)參相同,方法體內(nèi)相應(yīng)形參值得任何改變都將影響到作為引用傳遞的實(shí)參。

簡(jiǎn)而言之,按值傳遞不是值參數(shù)是值類型,而是指形參變量會(huì)復(fù)制實(shí)參變量,也就是會(huì)在棧上多創(chuàng)建一個(gè)相同的變量。而按引用傳遞則不會(huì)??梢酝ㄟ^ ref 和 out 來決定參數(shù)是否按照引用傳遞。

10.C#中參數(shù)傳遞 ref 與 out 的區(qū)別?

(1)ref指定的參數(shù)在函數(shù)調(diào)用時(shí)必須先初始化,而out不用(2)out指定的參數(shù)在進(jìn)入函數(shù)時(shí)會(huì)清空自己,因此必須在函數(shù)內(nèi)部進(jìn)行初始化賦值操作,而ref不用總結(jié):ref可以把值傳到方法里,也可以把值傳到方法外;out只可以把值傳到方法外注意:string作為特殊的引用類型,其操作是與值類型看齊的,若要將方法內(nèi)對(duì)形參賦值后的結(jié)果傳遞出來,需要加上ref或out關(guān)鍵字。

11.C#中什么是裝箱和拆箱?

裝箱:把值類型轉(zhuǎn)換成引用類型拆箱:把引用類型轉(zhuǎn)換成值類型裝箱:對(duì)值類型在堆中分配一個(gè)對(duì)象實(shí)例,并將該值復(fù)制到新的對(duì)象中。(1)第一步:新分配托管堆內(nèi)存(大小為值類型實(shí)例大小加上一個(gè)方法表指針。(2)第二步:將值類型的實(shí)例字段拷貝到新分配的內(nèi)存中。(3)第三步:返回托管堆中新分配對(duì)象的地址。這個(gè)地址就是一個(gè)指向?qū)ο蟮囊昧恕?/p>

拆箱:檢查對(duì)象實(shí)例,確保它是給定值類型的一個(gè)裝箱值。將該值從實(shí)例復(fù)制到值類型變量中。在裝箱時(shí)是不需要顯式的類型轉(zhuǎn)換的,不過拆箱需要顯式的類型轉(zhuǎn)換。int i=0;System.Object obj=i; //這個(gè)過程就是裝箱!就是將 i 裝箱!int j=(int)obj;//這個(gè)過程 obj 拆箱!

12.C#實(shí)現(xiàn)多態(tài)的過程中 overload 重載 與override 重寫的區(qū)別?

override 重寫與 overload 重載的區(qū)別。重載是方法的名稱相同。參數(shù)或參數(shù)類型不同,進(jìn)行多次重載以適應(yīng)不同的需要override 是進(jìn)行基類中函數(shù)的重寫。實(shí)現(xiàn)多態(tài)。重載:是方法的名稱相同,參數(shù)或參數(shù)類型不同;重載是面向過程的概念。重寫:是對(duì)基類中的虛方法進(jìn)行重寫。重寫是面向?qū)ο蟮母拍睢?/p>

13.C# 中static關(guān)鍵字的作用?

對(duì)類有意義的字段和方法使用static關(guān)鍵字修飾,稱為靜態(tài)成員,通過類名加訪問操作符“.”進(jìn)行訪問; 對(duì)類的實(shí)例有意義的字段和方法不加static關(guān)鍵字,稱為非靜態(tài)成員或?qū)嵗蓡T。注: 靜態(tài)字段在內(nèi)存中只有一個(gè)拷貝,非靜態(tài)字段則是在每個(gè)實(shí)例對(duì)象中擁有一個(gè)拷貝。而方法無論是否為靜態(tài),在內(nèi)存中只會(huì)有一份拷貝,區(qū)別只是通過類名來訪問還是通過實(shí)例名來訪問。

14.C# 成員變量和成員函數(shù)前加static的作用?

它們被稱為常成員變量和常成員函數(shù),又稱為類成員變量和類成員函數(shù)。分別用來反映類的狀態(tài)。比如類成員變量可以用來統(tǒng)計(jì)類實(shí)例的數(shù)量,類成員函數(shù)負(fù)責(zé)這種統(tǒng)計(jì)的動(dòng)作。不用new

15.C#中索引器的實(shí)現(xiàn)過程,是否只能根據(jù)數(shù)字進(jìn)行索引,請(qǐng)描述一下

C#通過提供索引器,可以象處理數(shù)組一樣處理對(duì)象。特別是屬性,每一個(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 ),并為其提供了簡(jiǎn)單的 get 和 set訪問器 方法(作為分配和檢索值的方法)。Program 類為存儲(chǔ)字符串創(chuàng)建了此類的一個(gè)實(shí)例。

16.C#中 abstract class和interface有什么區(qū)別?

abstract class abstract 聲明抽象類抽象方法,一個(gè)類中有抽象方法,那么這個(gè)類就是抽象類了。所謂的抽象方法,就是不含主體(不提供實(shí)現(xiàn)方法),必須由繼承者重寫。因此,抽象類不可實(shí)例化,只能通過繼承被子類重寫。

interface 聲明接口,只提供一些方法規(guī)約,在C#8之前的版本中不提供任何實(shí)現(xiàn),在C#9版本也可以支持接口的實(shí)現(xiàn);不能用public、abstract等修飾,無字段、常量,無構(gòu)造函數(shù)

兩者區(qū)別:

1.interface中不能有字段,而abstract class可以有; 2.interface中不能有public等修飾符,而abstract class 可以有。3.interface 可以實(shí)現(xiàn)多繼承。

17.C#中用sealed修飾的類有什么特點(diǎn)?

密封,不能繼承。

18.字符串中string str=null和string str=""和string str=string.Empty的區(qū)別

string.Empty相當(dāng)于“”,Empty是一個(gè)靜態(tài)只讀的字段。string str="" ,初始化對(duì)象,并分配一個(gè)空字符串的內(nèi)存空間 string str=null,初始化對(duì)象,不會(huì)分配內(nèi)存空間

19.byte b = 'a'; byte c = 1; byte d = 'ab'; byte e = '啊'; byte g = 256; 這些變量有些錯(cuò)誤是錯(cuò)在哪里?

本題考查的是數(shù)據(jù)類型能承載數(shù)據(jù)的大小。1byte =8bit,1個(gè)漢字=2個(gè)byte,1個(gè)英文=1個(gè)byte=8bit所以bc是對(duì)的,deg是錯(cuò)的。'a'是char類型,a錯(cuò)誤java byte取值范圍是-128~127, 而C#里一個(gè)byte是0~255

20.string和StringBuilder的區(qū)別,兩者性能的比較

都是引用類型,分配再堆上StringBuilder默認(rèn)容量是16,可以允許擴(kuò)充它所封裝的字符串中字符的數(shù)量.每個(gè)StringBuffer對(duì)象都有一定的緩沖區(qū)容量,當(dāng)字符串大小沒有超過容量時(shí),不會(huì)分配新的容量,當(dāng)字符串大小超過容量時(shí),會(huì)自動(dòng)增加容量。對(duì)于簡(jiǎn)單的字符串連接操作,在性能上stringbuilder不一定總是優(yōu)于strin因?yàn)閟tringbulider對(duì)象的創(chuàng)建也消耗大量的性能,在字符串連接比較少的情況下,過度濫用stringbuilder會(huì)導(dǎo)致性能的浪費(fèi)而非節(jié)約,只有大量無法預(yù)知次數(shù)的字符串操作才考慮stringbuilder的使用。從最后分析可以看出如果是相對(duì)較少的字符串拼接根本看不出太大差別。Stringbulider的使用,最好制定合適的容量值,否則優(yōu)于默認(rèn)值容量不足而頻繁的進(jìn)行內(nèi)存分

21.什么是擴(kuò)展方法?

一句話解釋,擴(kuò)展方法使你能夠向現(xiàn)有類型“添加”方法,無需修改類型條件:按擴(kuò)展方法必須滿足的條件,1.必須要靜態(tài)類中的靜態(tài)方法2.第一個(gè)參數(shù)的類型是要擴(kuò)展的類型,并且需要添加this關(guān)鍵字以標(biāo)識(shí)其為擴(kuò)展方法建議:通常,只在不得已的情況下才實(shí)現(xiàn)擴(kuò)展方法,并謹(jǐn)慎的實(shí)現(xiàn)使用:不能通過類名調(diào)用,直接使用類型來調(diào)用

22. 特性是什么?如何使用?

特性與屬性是完全不相同的兩個(gè)概念,只是在名稱上比較相近。Attribute特性就是關(guān)聯(lián)了一個(gè)目標(biāo)對(duì)象的一段配置信息,本質(zhì)上是一個(gè)類,其為目標(biāo)元素提供關(guān)聯(lián)附加信息,這段附加信息存儲(chǔ)在dll內(nèi)的元數(shù)據(jù),它本身沒什么意義。運(yùn)行期以反射的方式來獲取附加信息

23.什么叫應(yīng)用程序域(AppDomain)

一種邊界,它由公共語言運(yùn)行庫圍繞同一應(yīng)用程序范圍內(nèi)創(chuàng)建的對(duì)象建立(即,從應(yīng)用程序入口點(diǎn)開始,沿著對(duì)象激活的序列的任何位置)。應(yīng)用程序域有助于將在一個(gè)應(yīng)用程序中創(chuàng)建的對(duì)象與在其他應(yīng)用程序中創(chuàng)建的對(duì)象隔離,以使運(yùn)行時(shí)行為可以預(yù)知。在一個(gè)單獨(dú)的進(jìn)程中可以存在多個(gè)應(yīng)用程序域。應(yīng)用程序域可以理解為一種輕量級(jí)進(jìn)程。起到安全的作用。占用資源小。

24.byte a =255;a+=5;a的值是多少?

byte的取值范圍是-2的8次方至2的8次方-1,-256至258,a+=1時(shí),a的值時(shí)0,a+=5時(shí),a的值是0,所以a+=5時(shí),值是4

25.const和readonly有什么區(qū)別?

都可以標(biāo)識(shí)一個(gè)常量。主要有以下區(qū)別:1、初始化位置不同。const必須在聲明的同時(shí)賦值;readonly即可以在聲明處賦值;2、修飾對(duì)象不同。const即可以修飾類的字段,也可以修飾局部變量;readonly只能修飾類的字段3、const是編譯時(shí)常量,在編譯時(shí)確定該值;readonly是運(yùn)行時(shí)常量,在運(yùn)行時(shí)確定該值。4、const默認(rèn)是靜態(tài)的;而readonly如果設(shè)置成靜態(tài)需要顯示聲明5、修飾引用類型時(shí)不同,const只能修飾string或值為null的其他引用類型;readonly可以是任何類型。

26.分析下面代碼,a、b的值是多少?

string strTmp = "a1某某某";

int a = System.Text.Encoding.Default.GetBytes(strTmp).Length;

int b = strTmp.Length;

分析:一個(gè)字母、數(shù)字占一個(gè)byte,一個(gè)中文占占兩個(gè)byte,所以a=8,b=5

27.Strings = new String(“xyz”);創(chuàng)建了幾個(gè)String Object?

兩個(gè)對(duì)象,一個(gè)是“xyz”,一個(gè)是指向“xyz”的引用對(duì)象s。

28.c#可否對(duì)內(nèi)存直接操作

C#在unsafe 模式下可以使用指針對(duì)內(nèi)存進(jìn)行操作, 但在托管模式下不可以使用指針,C#NET默認(rèn)不運(yùn)行帶指針的,需要設(shè)置下,選擇項(xiàng)目右鍵->屬性->選擇生成->“允許不安全代碼”打勾->保存

29.什么是強(qiáng)類型,什么是弱類型?哪種更好些?為什么?

強(qiáng)類型是在編譯的時(shí)候就確定類型的數(shù)據(jù),在執(zhí)行時(shí)類型不能更改,而弱類型在執(zhí)行的時(shí)候才會(huì)確定類型。沒有好不好,二者各有好處,強(qiáng)類型安全,因?yàn)樗孪纫呀?jīng)確定好了,而且效率高。一般用于編譯型編程語言,如c++,java,c#,pascal等,弱類型相比而言不安全,在運(yùn)行的時(shí)候容易出現(xiàn)錯(cuò)誤,但它靈活,多用于解釋型編程語言,如javascript等

30.Math.Round(11.5)等於多少? Math.Round(-11.5)等於多少?

Math.Round(11.5)=12Math.Round(-11.5)=-12

31.&和&&的區(qū)別

相同點(diǎn)&和&&都可作邏輯與的運(yùn)算符,表示邏輯與(and),當(dāng)運(yùn)算符兩邊的表達(dá)式的結(jié)果都為true時(shí),其結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。(ps:當(dāng)要用到邏輯與的時(shí)候&是毫無意義,&本身就不是干這個(gè)的)

不同點(diǎn)if(loginUser!=null&&string.IsnullOrEmpty(loginUser.UserName))&&具有短路的功能,即如果第一個(gè)表達(dá)式為false,則不再計(jì)算第二個(gè)表達(dá)式,對(duì)于上面的表達(dá)式,當(dāng)loginUser為null時(shí),后面的表達(dá)式不會(huì)執(zhí)行,所以不會(huì)出現(xiàn)NullPointerException如果將&&改為&,則會(huì)拋出NullPointerException異常。(ps:所以說當(dāng)要用到邏輯與的時(shí)候&是毫無意義的)

& 是用作位運(yùn)算的。

總結(jié)&是位運(yùn)算,返回結(jié)果是int類型 &&是邏輯運(yùn)算,返回結(jié)果是bool類型

32.i++和++i有什么區(qū)別?

1.i++是先賦值,然后再自增;++i是先自增,后賦值。2.i=0,i++=0,++i=1;Console.WriteLine(++i==i++); 結(jié)果位true

33.as和is的區(qū)別

as在轉(zhuǎn)換的同時(shí)判斷兼容性,如果無法進(jìn)行轉(zhuǎn)換,返回位null(沒有產(chǎn)生新的對(duì)象),as轉(zhuǎn)換是否成功判斷的依據(jù)是是否位null is只是做類型兼容性判斷,并不執(zhí)行真正的類型轉(zhuǎn)換,返回true或false,對(duì)象為null也會(huì)返回false。as比is效率更高,as只需要做一次類型兼容檢查

34.談?wù)刦inal、finally的區(qū)別。

final:不能作為父類被繼承。一個(gè)類不能聲明是final,又聲明為abstract。finally:用于try{}catch{}finally{}結(jié)構(gòu),用于異常處理時(shí)執(zhí)行任何清除操作。

35.簡(jiǎn)述C#成員修飾符

abstract:指示該方法或?qū)傩詻]有實(shí)現(xiàn)。

const:指定域或局部變量的值不能被改動(dòng)。

event:聲明一個(gè)事件。

extern:指示方法在外部實(shí)現(xiàn)。

override:對(duì)由基類繼承成員的新實(shí)現(xiàn)。

readonly:指示一個(gè)域只能在聲明時(shí)以及相同類的內(nèi)部被賦值。

static:指示一個(gè)成員屬于類型本身,而不是屬于特定的對(duì)象。

virtual:指示一個(gè)方法或存取器的實(shí)現(xiàn)可以在繼承類中被覆蓋。

36.什么是匿名類,有什么好處?

不用定義、沒有名字的類,使用一次便可丟棄。好處是簡(jiǎn)單、隨意、臨時(shí)的。

37.說說什么是逐字字符串

在普通字符串中,反斜杠字符是轉(zhuǎn)義字符。而在逐字字符串(Verbatim Strings)中,字符將被編程器按照原義進(jìn)行解釋。使用逐字字符串只需在字符串前面加上 @ 符號(hào)。

// 逐字字符串:轉(zhuǎn)義符

var filename = @"c:\temp\newfile.txt";

Console.WriteLine(filenaame);

// 逐字字符串:多行文本

var multiLine = @"This is a

multiline paragraph.";

Console.WriteLine(multiLine);

// 非逐字字符串

var escapedFilename = "c:\temp\newfile.txt";

Console.WriteLine(escapedFilename);

輸出結(jié)果:

c:\temp\newfile.txt

This is a

multiline paragraph.

c: ? emp

ewfile.txt

逐字字符串中唯一不被原樣解釋的字符是雙引號(hào)。由于雙引號(hào)是定義字符串的關(guān)鍵字符,所以在逐字字符串中要表達(dá)雙引號(hào)需要用雙引號(hào)進(jìn)行轉(zhuǎn)義。

var str = @"""I don't think so"", he said.";

Console.WriteLine(str);

輸出結(jié)果:

"I?don't?think?so",?he?said.

在逐字字符串中也可以 $ 符號(hào)實(shí)現(xiàn)字符串內(nèi)插值。

Testing?\n?1?2?3

輸出結(jié)果:

Testing?\n?1?2?3

38.列舉你知道的數(shù)字格式化轉(zhuǎn)換

可使用“0”和“#”占位符進(jìn)行補(bǔ)位?!?” 表示位數(shù)不夠位數(shù)就補(bǔ)充“0”,小數(shù)部分如果位數(shù)多了則會(huì)四舍五入;“#”表示占位,用于輔助“0”進(jìn)行補(bǔ)位。如下例:

? ? ? ? ? // “0”描述:占位符,如果可能,填充位

Console.WriteLine(string.Format("{0:000000}", 1234)); // 結(jié)果:001234?

? ? ? ? ? // “#”描述:占位符,如果可能,填充位

? ? ? ? ? Console.WriteLine(string.Format("{0:######}", 1234)); // 結(jié)果:1234

? ? ? ? ? Console.WriteLine(string.Format("{0:#0####}", 1234)); // 結(jié)果:01234

Console.WriteLine(string.Format("{0:0#0####}", 1234)); // 結(jié)果:0001234?

? ? ? ? ? // "."描述:小數(shù)點(diǎn)

? ? ? ? ? Console.WriteLine(string.Format("{0:000.000}", 1234)); ? ? ? // 結(jié)果:1234.000

? ? ? ? ? Console.WriteLine(string.Format("{0:000.000}", 4321.12543)); // 結(jié)果:4321.125

? ? ? ? ? // ","描述:千分表示

? ? ? ? ? Console.WriteLine(string.Format("{0:0,0}", 1234567)); ? //結(jié)果:1,234,567

? ? ? ? ? // "%"描述:格式化為百分?jǐn)?shù)

? ? ? ? ? Console.WriteLine(string.Format("{0:0%}", 1234)); ? ? ? // 結(jié)果:123400%

? ? ? ? ? Console.WriteLine(string.Format("{0:#%}", 1234.125)); ? // 結(jié)果:123413%

? ? ? ? ? Console.WriteLine(string.Format("{0:0.00%}", 1234)); ? ? // 結(jié)果:123400.00%

? ? ? ? ? Console.WriteLine(string.Format("{0:#.00%}", 1234.125)); // 結(jié)果:123412.50%

內(nèi)置快捷字母格式化用法

? ? ? ? ? // E-科學(xué)計(jì)數(shù)法表示

? ? ? ? ? Console.WriteLine((25000).ToString("E")); // 結(jié)果:2.500000E+004

? ? ? ? ? // C-貨幣表示,帶有逗號(hào)分隔符,默認(rèn)小數(shù)點(diǎn)后保留兩位,四舍五入

? ? ? ? ? Console.WriteLine((2.5).ToString("C")); // 結(jié)果:¥2.50

? ? ? ? ? // D[length]-十進(jìn)制數(shù)

? ? ? ? ? Console.WriteLine((25).ToString("D5")); // 結(jié)果:00025

? ? ? ? ? // F[precision]-浮點(diǎn)數(shù),保留小數(shù)位數(shù)(四舍五入)

? ? ? ? ? Console.WriteLine((25).ToString("F2")); // 結(jié)果:25.00

? ? ? ? ? // G[digits]-常規(guī),保留指定位數(shù)的有效數(shù)字,四舍五入

? ? ? ? ? Console.WriteLine((2.52).ToString("G2")); // 結(jié)果:2.5

? ? ? ? ? // N-帶有逗號(hào)分隔符,默認(rèn)小數(shù)點(diǎn)后保留兩位,四舍五入

? ? ? ? ? Console.WriteLine((2500000).ToString("N")); // 結(jié)果:2,500,000.00

? ? ? ? ? // X-十六進(jìn)制,非整型將產(chǎn)生格式異常

? ? ? ? ? Console.WriteLine((255).ToString("X")); // 結(jié)果

ToString 也可以自定義補(bǔ)零格式化:

? ? ? ? ? Console.WriteLine((15).ToString("000")); ? ? ? ? ? ? // 結(jié)果:015

? ? ? ? ? Console.WriteLine((15).ToString("value is 0")); ? ? ? // 結(jié)果:value is 15

? ? ? ? ? Console.WriteLine((10.456).ToString("0.00")); ? ? ? ? // 結(jié)果:10.46

? ? ? ? ? Console.WriteLine((10.456).ToString("00")); ? ? ? ? ? // 結(jié)果:10

? ? ? ? ? Console.WriteLine((10.456).ToString("value is 0.0")); // 結(jié)果:value is 10.5

39.說說字符串拼接、字符串內(nèi)插法

將數(shù)組中的字符串拼接成一個(gè)字符串:

var parts = new[] { "Foo", "Bar", "Fizz", "Buzz"};

var joined = string.Join(", ", parts);

// joined = "Foo, Bar, Fizz, Buzz"

以下四種方式都可以達(dá)到相同的字符串拼接的目的:

string first = "Hello";

stringsecond = "World";

string foo = first + " " + second;

string foo = string.Concat(first, " ", second);

string foo = string.Format("{0} {1}", firstname, lastname);

string foo = $"{firstname} {lastname}";

字符串內(nèi)插法簡(jiǎn)單用法:

var name = "World";

? ? ? ? var str =$"Hello, {name}!";

// str = "Hello, World!"

帶日期格式化

var date = DateTime.Now;

var str = $"Today is {date:yyyy-MM-dd}!";

補(bǔ)齊格式化(Padding):

?var number = 42;?

? ? ? ? ? // 向左補(bǔ)齊

? ? ? ? ? var str = $"The answer to life, the universe and everything is {number,5}.";

// str = "The answer to life, the universe and everything is ___42." ('_'表示空格)?

? ? ? ? ? // 向右補(bǔ)齊

? ? ? ? ? var str = $"The answer to life, the universe and everything is ${number,-5}.";

? ? ? ? ? // str = "The answer to life, the universe and everything is 42___."

結(jié)合內(nèi)置快捷字母格式化:

var amount = 2.5;

? ? ? ? ? var str = $"It costs {amount:C}";

// str = "¥2.50"?

? ? ? ? ? var number = 42;

? ? ? ? ? var str = $"The answer to life, the universe and everything is {number,5:f1}.";

? ? ? ? ? // str = "The answer to life, the universe and everything is ___42.1"

40.什么是虛函數(shù)?什么是抽象函數(shù)?

虛函數(shù):沒有實(shí)現(xiàn)的,可以由子類繼承并重寫的函數(shù)。抽象函數(shù):規(guī)定其非虛子類必須實(shí)現(xiàn)的函數(shù),必須被重寫。

41.什么是WebService?

答:Web Service是基于網(wǎng)絡(luò)的、分布式的模塊化組件,它執(zhí)行特定的任務(wù),遵守具體的技術(shù)規(guī)范,這些規(guī)范使得Web Service能與其他兼容的組件進(jìn)行互操作。

42.ADO.NET常用對(duì)象有哪些?

Connection:主要是開啟程序和數(shù)據(jù)庫之間的連接。沒有利用連接對(duì)象將數(shù)據(jù)庫打開,是無法從數(shù)據(jù)庫中取得數(shù)據(jù)的。Close和Dispose的區(qū)別,Close以后還可以O(shè)pen,Dispose以后則不能再用。

Command:主要可以用來對(duì)數(shù)據(jù)庫發(fā)出一些指令,例如可以對(duì)數(shù)據(jù)庫下達(dá)查詢、新增、修改、刪除數(shù)據(jù)等指令,以及調(diào)用存在數(shù)據(jù)庫中的存儲(chǔ)過程等。這個(gè)對(duì)象是架構(gòu)在Connection 對(duì)象上,也就是Command:對(duì)象是通過在Connection對(duì)象連接到數(shù)據(jù)源。

DataAdapter:主要是在數(shù)據(jù)源以及DataSet 之間執(zhí)行數(shù)據(jù)傳輸?shù)墓ぷ?,它可以透過Command 對(duì)象下達(dá)命令后,并將取得的數(shù)據(jù)放入DataSet 對(duì)象中。這個(gè)對(duì)象是架構(gòu)在Command對(duì)象上,并提供了許多配合DataSet 使用的功能。

DataSet:這個(gè)對(duì)象可以視為一個(gè)暫存區(qū)(Cache),可以把從數(shù)據(jù)庫中所查詢到的數(shù)據(jù)保留起來,甚至可以將整個(gè)數(shù)據(jù)庫顯示出來,DataSet是放在內(nèi)存中的。DataSet 的能力不只是可以儲(chǔ)存多個(gè)Table 而已,還可以透過DataAdapter對(duì)象取得一些例如主鍵等的數(shù)據(jù)表結(jié)構(gòu),并可以記錄數(shù)據(jù)表間的關(guān)聯(lián)。DataSet 對(duì)象可以說是ADO.NET 中重量級(jí)的對(duì)象,這個(gè)對(duì)象架構(gòu)在DataAdapter對(duì)象上,本身不具備和數(shù)據(jù)源溝通的能力;也就是說我們是將DataAdapter對(duì)象當(dāng)做DataSet 對(duì)象以及數(shù)據(jù)源間傳輸數(shù)據(jù)的橋梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。

DataReader:當(dāng)我們只需要循序的讀取數(shù)據(jù)而不需要其它操作時(shí),可以使用DataReader 對(duì)象。DataReader對(duì)象只是一次一次向下循序的讀取數(shù)據(jù)源中的數(shù)據(jù),這些數(shù)據(jù)是存在數(shù)據(jù)庫服務(wù)器中的,而不是一次性加載到程序的內(nèi)存中的,只能(通過游標(biāo))讀取當(dāng)前行的數(shù)據(jù),而且這些數(shù)據(jù)是只讀的,并不允許作其它的操作。因?yàn)镈ataReader 在讀取數(shù)據(jù)的時(shí)候限制了每次只讀取一條,而且只能只讀,所以使用起來不但節(jié)省資源而且效率很好。使用DataReader 對(duì)象除了效率較好之外,因?yàn)椴挥冒褦?shù)據(jù)全部傳回,故可以降低網(wǎng)絡(luò)的負(fù)載。

43.在ASP.NET中所有的自定義用戶控件都必須繼承自?

Control類

44.在.NET托管代碼總我們不必?fù)?dān)心內(nèi)存泄漏,這是因?yàn)橛辛耍?/p>

GC 垃圾收集器。

45.什么是MVC模式

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

aspx就是View,視圖;Model:DataSet、Reader、對(duì)象;Controller:cs代碼。

MVC是典型的平行關(guān)系,沒有說誰在上誰在下的關(guān)系,模型負(fù)責(zé)業(yè)務(wù)領(lǐng)域的事情,視圖負(fù)責(zé)顯示的事情,控制器把數(shù)據(jù)讀取出來填充模型后把模型交給視圖去處理。而各種驗(yàn)證什么的應(yīng)該是在模型里處理了。它強(qiáng)制性的使應(yīng)用程序的輸入、處理和輸出分開。MVC最大的好處是將邏輯和頁面分離。

46.能用foreach遍歷訪問的對(duì)象的要求

需要實(shí)現(xiàn)IEnumerable接口或聲明GetEnumerator方法的類型。

47.什么是反射?

程序集包含模塊,而模塊又包括類型,類型下有成員,反射就是管理程序集,模塊,類型的對(duì)象,它能夠動(dòng)態(tài)的創(chuàng)建類型的實(shí)例,設(shè)置現(xiàn)有對(duì)象的類型或者獲取現(xiàn)有對(duì)象的類型,能調(diào)用類型的方法和訪問類型的字段屬性。它是在運(yùn)行時(shí)創(chuàng)建和使用類型實(shí)例。

48.ORM中的延遲加載與直接加載有什么異同?

延遲加載(Lazy Loading)只在真正需要進(jìn)行數(shù)據(jù)操作的時(shí)候再進(jìn)行加載數(shù)據(jù),可以減少不必要的開銷。

49.簡(jiǎn)述Func與Action的區(qū)別?

Func是有返回值的委托,Action是沒有返回值的委托。

50.23種設(shè)計(jì)模式分別叫什么名稱,如何分類?

分三類:創(chuàng)建型,行為型,結(jié)構(gòu)型;

創(chuàng)建型包含:1.單例模式2.工廠模式3.建造者模式4.原型模式5.工廠方法模式

行為型包含:1.策略模式2.模板方法模式3.觀察者模式4.迭代子模式5.責(zé)任鏈模式6.命令模式7.備忘錄模式8.狀態(tài)模式9.訪問者模式10.中介者模式11.解釋器模式

結(jié)構(gòu)型設(shè)計(jì)模式包含:1.適配器模式2.裝飾器模式3.代理模式4.外觀模式5.橋接模式6.組合模式7.享元模式

后續(xù)更新更多干貨!請(qǐng)關(guān)注!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容