C#的25個(gè)基礎(chǔ)概念_第1頁
C#的25個(gè)基礎(chǔ)概念_第2頁
C#的25個(gè)基礎(chǔ)概念_第3頁
C#的25個(gè)基礎(chǔ)概念_第4頁
C#的25個(gè)基礎(chǔ)概念_第5頁
已閱讀5頁,還剩85頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

C#的25個(gè)基礎(chǔ)概念

你必須知道的3的25個(gè)基礎(chǔ)概念(附演示)

先自己復(fù)習(xí)一下,看看F面的C#問題都能回答上來么?

1.靜態(tài)變量和非靜態(tài)變量的區(qū)別?

2.const和staticreadonly區(qū)別?

3.extem是什么意思?

4abstract是什么意思?

5.internal修飾符起什么作用?

6.sealed修飾符是干什么的?

7.override和overload的區(qū)別?

8.什么是索引指示器?

“new修飾符是起什么作用?

lO.this關(guān)犍字的含義?

11,可以使用抽象函數(shù)重寫基類中的虛函數(shù)嗎?

12.密封類可以有虛函數(shù)嗎?

13.如果班類中的虛屆性只仃一個(gè)屬性訪問器,那么繼承類

重寫該屬性后可以有幾個(gè)屬性訪問器?如果基類中行g(shù)et

和set兩個(gè)呢?

14.abstract可以和virtual一起使用嗎?可以和override

22.StringBuilderfnString的區(qū)別?

23.explicit和implicit的含義?

24.params有什么用?

25.什么是反射?

以F是我做的一份參考答案(C#語言范疇之內(nèi)),如果有

不準(zhǔn)確、不全面的,歡迎各位朋友指正!

L靜態(tài)變埴和非靜態(tài)變量的區(qū)別?

答:

靜態(tài)變量:

靜態(tài)變量使用static修飾符進(jìn)行聲明

在所屬類被裝載時(shí)創(chuàng)建

通過類進(jìn)行訪問

所相類的所有實(shí)例的同一靜態(tài)變計(jì)都是同一個(gè)值

非靜態(tài)變量:

不帶有static修飾符聲明的變量稱做非靜態(tài)變量

在類被實(shí)例化時(shí)創(chuàng)建

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExampleOl

{

classProgram

(

classClassi

{

piblicstaticStringstaticStr=&a

mp;quot;Class&cpjot;;

publicStringnotstaticStr=&am

p;quot;Obj";

}

staticvoidMain(string[]args)

{

〃靜態(tài)變吊通過類進(jìn)行訪問,該類所

有實(shí)例的同一靜態(tài)變量都是同一個(gè)值

Console.WriteLine("Class

IsstaticStr:{0}"fClassl.staticSt

同對(duì)象的同一非靜態(tài)變量可以有不同的值

Console.WriteLine("tmp

Objl'snotstaticStr:{0}&quot,,tmpObj

LnotstaticStr);

Console.WriteLine("tmp

Obj2'snotstaticStr:{0}",tmpObj

2.notstaticStr);

Console.ReacLine();

}

)

}

結(jié)梟:

Classi'sstaticStr*:Class

I

tmpObjl'snotstaticStr:tmpObj1

trrij2'snotstaticStr:tmpObj?

2.const和staticreadonly區(qū)別?

示例:

測試類:

[運(yùn)行代碼][夏制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystemText;

namespaceExampleO2Lib

(

publicclassClassi

{

publicconstStringstrConst=&

quot;Const&qijot;;

publicstaticreadonlyStringstrStatic

Readonly="StaticReadonly&

QJOt;;

//publicconstStringstrConst=&am

p;quot;ConstChanged";

//publicstaticreadonlyStringstrStati

cReadonly="StaticReadonlyCha

客戶端代碼:

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingExampleO2Lib;

namespaceExample02

(

classProgram

{

staticvoidMain(string[]args)

{

〃修改Example02中Classi的strCo

nst初始值后,只編譯ExampleO2Lib項(xiàng)目

〃然后到資源管理瑞里把新編譯的E

xampleO2Lib.dll拷貝Example02.exe所在的目

求.iiExampleO2.exe

〃切不可在IDE里直接調(diào)試運(yùn)行因?yàn)?/p>

行時(shí)初始化的

Console.WriteLine("strC

onst:{0}",Classi.strConst);

Console.WriteLine("strSt

aticReadonly:{0}",Classi.strStat

icReadonly);

Console.Read_ine();

}

}

)

結(jié)果*

..、

strConst:Const

strStaticReadonly:StaticReadonly

峰改后的示例:

測試類:

[運(yùn)行代碼][0制到剪貼板][±]

C8E:

usingSystem;

usingSystem.Collections.Generic;

usingSystem,Text;

namespaceExampleO2Lib

{

publicclassClassi

//publicconstStringstrConst=&am

p;quot;Const";

//publicstaticreadonlyStringstrStatl

cReadonly="StaticReadonly&am

P;quot;;

publicconstStringstrConst=&

quot;ConstChanged";

publicstaticreadonlyStringstrStatic

Readonly="StaticReadonlyChan

ged&qjot;;

!結(jié)果

strConst:Const

strStaticReadonly:StaticReadonlyChanged

示例:

[運(yùn)行代碼][攵制到剪貼板][土]

C8E:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Runtime.IntercpServices;

namespaceExample03

(

classProgram

{

〃注意Dlllmport是一個(gè)AttributePrope

rty,(\.System.Runtime.InteropServices命名彳<

間中定義

//externl-jDlllmport一起使用時(shí)必須再

加上一個(gè)static修飾符

[Dillmport("User32,dlI&am

P;QJOt;)]

piblicstaticexternintMessageBox(in

urmessage:");

myString=Console.ReadLine();

returnMessageBoxfO,myString,&

amp;quot;MyMessageBox",0);

}

}

}

結(jié)果:

4.abstract是什么意思?

:答:

abstract修飾符可以用于類、方法、屬性、事件和索弓I指

示器(indexer),表示其為抽象成員

abstract不可以和static、virtual>override一起使用

聲明為abstract成員叮以不包括實(shí)現(xiàn)代碼,但只有類中還

有未實(shí)現(xiàn)的抽象成員,該類就不可以被實(shí)例化,通常用「

強(qiáng)制繼承類必須實(shí)現(xiàn)某一成員

[運(yùn)行代眄][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExampleO4

{

#region基類,抽象類

publicabstractclassBaseClass

{

〃抽象屬性,同時(shí)具有g(shù)et和set訪問器

表示繼承類必須將該屈性實(shí)現(xiàn)為可讀寫

publicabstractStringAttribute

{

get;

set;

}

〃抽象方法,傳入一個(gè)字符串參數(shù)無返回

publicabstractvoidFunction(Stringv

alue);

〃抽象一件,類型為系統(tǒng)預(yù)定義的代理為

elegate):EventHandler

publicabstracteventEventHandlerE

#endregion

#region繼承類

publicclassDeriveClass:BaseClass

(

privateStringattribute;

publicoverrideStringAttribute

{

get

{

retirnattribute;

}

set

(

attribute=value;

}

}

publicoverridevoidFunction(Stringv

aloe)

publicoverrideCharthis[intIndex]

(

get

(

returnattribute[Index];

)

}

)

#endregicr)

classProgram

{

staticvoidOnFinction(objectsender,

EventZVgse)

(

for(inti=0;i<((DeriveClass)s

ender).Attribute.Length;i++)

(

Console.WriteLine(((DeriveClas

s)sender)[i]);

Console.WriteLineftmpObj.Attribut

e);

〃將靜態(tài)函數(shù)CnFunction與tmpObj

對(duì)象的Event聿件進(jìn)行關(guān)聯(lián)

tmpObj.Event+=newEventHand

ler(OnFuxtion);

bripObj.Functiori(&quot;76543

21&quot;);

Console.Read.ine();

}

)

結(jié)果:

1234567

7

6

5

1的類型或成員只能/卜同一程集內(nèi)訪問

接口的成員不能使用internal修飾符

示例

ExampleO5Lib項(xiàng)目的Classi

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExampleO5Lib

(

publicclassClassi

{

internalStringstrlntemal=null;

piblicStringstrFtbllc;

)

}

結(jié)果

ExampleO5Lib項(xiàng)H的Class2類可以訪問到Classi的

6.sealed修飾符是廣什么的?

答:

sealed修飾符表示密封

用F類時(shí),表示該類不能再被繼承,不能和abstract同時(shí)

使用,因?yàn)檫@兩個(gè)修飾符在含義上互相排斥

用F方法和屬性時(shí).友示該方法或?qū)傩圆荒茉俦焕^承,必

須和override關(guān)鍵'產(chǎn)一起使用,因?yàn)槭褂胹ealed修飾符

的方法或?qū)傩钥隙ㄊ腔愔邢鄳?yīng)的虛成員

通常用于實(shí)現(xiàn)第三方類庫時(shí)不想被客戶端繼承,或用于沒

行必要再繼承的類以防止濫用繼承造成層次結(jié)構(gòu)體系混亂

恰當(dāng)?shù)睦胹ealed修飾符也可以提高一定的運(yùn)行效率,

因?yàn)椴挥每紤]繼承類會(huì)重寫該成員

示例:

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample06

(

classProgram

classA

pcblicvirtualvoidF()

{

Console.WriteLine(&quot;

A.F&qjot;);

)

publicvirtualvoidG()

<

Console.WriteLine(&quot;

A.G&qijot;);

}

}

classB:A

(

pcblicsealedoverridevoidF()

(

Console.WriteLine(&quot;

B.F&quot;);

)

publicoverridevoidG()

{

Console.WriteLine(&quot;

C.G&quot;);

}

}

staticvoidMain(string[]args)

{

newA().F();

newA().G();

newB().F();

newB().G();

newC().F();

newC().G();

Console.ReadLine();

}

}

}

該方法的實(shí)現(xiàn):

A.F

A.G

B.F

B.G

B.F

C.G

7.override和overload的區(qū)別?

答:

override表示重寫,用于繼承類對(duì)基類中虛成員的實(shí)現(xiàn)

overload表示重載,用于同一個(gè)類中同名方法不同參數(shù)(包

括類型不同或個(gè)數(shù)不同)的實(shí)現(xiàn)

示例:

[運(yùn)行代碼][”制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample07

(

classProgram

{

classBaseClass

piblicvirtualvoidF()

(

Ccrisole.WriteLine(&quot;B

aseClass.F&quot;);

}

}

classDeriveClass:BaseClass

(

piblicoverridevoidF()

{

base.F();

Console,WriteLine(&quot;

DeriveClass.F&quot;);

}

pcblicvoidAdd(intLeft,intRigh

t)

(

Console.WriteLine(&quot;A

ddforInt:{0}&quot;zLeft+Richt);

staticvoidMain(string[]args)

{

DeriveClasstmpObj=newDerive

Class();

tmpObj.F();

tmpObj.Add(l,2);

tmpObj.Add(1.1,2.2);

Console.ReadLine();

}

}

}

i結(jié)果:

BaseClass.F

DeriveClass.F

AddforInt:3

Addforint:3.3

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample08

(

publicclassPoint

(

privatedoublex,y;

publicPoint(ck>jbleX,docbleY)

{

x=X;

y=Y;

}

〃重寫TbString方法方便輸出

pi±licoverridestringTbStringO

{

points=Points;

publicintPointNjmber

{

get

(

returnpoints.Length;

}

}

〃實(shí)現(xiàn)索引訪問器

publicPointthis[intIndex]

{

get

(

returnpoints[Index];

}

}

}

get

{

〃注意case段使用retim直接返

回所以不需要break

switch(Index)

{

case0:

{

return&quot;T

odayiscloudyI&quot;;

}

case5:

{

return&quot;T

odayistixndershower!&quot;;

}

default:

get

{

stringTbdayWeather=null;

//switch的標(biāo)準(zhǔn)寫法

switch(Day)

{

case&quot;Sunday&a

mp;quot;:

{

TbdayWeather=&a

mp;quot;Todayiscloudy!&quot;;

break;

}

case&quot;Friday&am

P;quot;:

{

TbdayWeather=&a

mp;quot;T3dayisthundershower!&qijo

t;;

)

returnTodayWeather;

}

}

}

classProgram

{

staticvoidMain(string[]args)

{

Point[]tmpPoints=newPoint[l

0];

for(inti=0;i<tmpPoints.Len

gth;i++)

{

tmpPoints[i]=newPoint(i,M

ath.Sin(i));

}

PointstmpObj=newPoints(tmpP

oints);

nday&quot;,&quot;luesday&q

uot;,&quot;Wednesday&quot;,&a

mp;quot;lhirsday&quot;;&quot;Fri

day&quot;,&quot;Staurday&q

uot;};

WeatherOfWeektmpWeatherOfWe

ek=newWeatherOfWeek();

for(inti=0;i<6;i++)

{

Console.WriteLine(tmpWeather

OfWeek[i]);

}

foreach(stringtmpDayinWeek)

(

Console.WriteLine(tmpWeather

OfWeek[tmpDay]);

}

Console.ReacLine();

}

X:3,Y:0.141120008059867

X:4,Y:-0.756802495307928

X:5,Y:-0.958924274663138

X:6,Y:-0.279415498198926

X:7,Y:0.656986598718789

X:8,Y:0.989358246623382

X:9,Y:0.412118485241757

Todayiscloudy!

Todayisfine!

Todayisfine!

Todayisfine!

Todayisfine!

Todayisthundershower!

Todayiscloudy!

Todayisfine!

Todayisfine!

Todayisfine!

Todayisfine!

Todayisthundershower!

Todayisfine!

9.new修飾符是起什么作用?

答:

new修飾符與new操作符是兩個(gè)概念

new修飾符用于聲明類或類的成員,表示隱藏了基類中同名的成員。而new操作符用于

實(shí)例化一個(gè)類型

new修飾符只能用于繼承類,一般用于彌補(bǔ)基類設(shè)計(jì)的不足

new修飾符和override修飾符不可同時(shí)用在一個(gè)成員

上,因?yàn)檫@兩個(gè)修飾符在含義上互相排斥

示例:

[運(yùn)行代叫[復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExampleOO

(

classBaseClass

{

〃基類設(shè)計(jì)者聲明了一個(gè)PI的公共變楠,

方便進(jìn)行運(yùn)算

pcblicstaticdoublePI=3.1415;

}

classDervieCiass:BaseClass

{

〃繼承類發(fā)現(xiàn)該變量的值不能滿足運(yùn)算

精度,于是可以通過new修飾符顯示隱藏基類

中的聲明

staticvoidMain(string[]args)

Console.WriteLine(BaseClassPI);

Console.WriteLlne(DervieClassPI);

Console.Read_ine();

}

結(jié)果:

*3.1415

3.1415926

ilO.this關(guān)鍵字的含義?

:

this是一個(gè)保留字,僅限于構(gòu)造函數(shù)和方法成員中使用

在類的構(gòu)造函數(shù)中出現(xiàn)表示對(duì)正在構(gòu)造的對(duì)象本身的1I

為參數(shù)、聲明索引訪問器、判斷傳入?yún)?shù)的對(duì)象是否為本

示例:

[運(yùn)行代碼][復(fù)制到剪貼板][土]

C8E:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample10

(

classClassi

(

privatedocblec;

privatestringvalue;

publicdodbleC

{

get

{

returnc;

}

)

publicClassi(Classivalue)

{

〃用對(duì)象本身實(shí)例化自己沒有意義

if(this!=value)

{

c=value.C;

)

}

piblicoverridestringIbStringO

{

〃將對(duì)象本身做為參數(shù)

returnstring.Format(&quot;

{0}Celsius={1}Fahrenheit&quot;zc,

UhitlransClass.C2F(this));

}

〃由于好奇,在這做了一個(gè)效率測試,想

看看到底哪種方式訪問成員變量更快,結(jié)論:區(qū)

別不大

avethis.:{0}MSEL&quot;,Bivironmen

t.TickCocnt-vTickCount);

}

publicstringTest2()

{

longvTickCount=Environment.Ti

ckCount;

for(inti=0;i<10000000;i+

+)

value=i.lbStringO;

returnstring.Format(&quot;D

on'thavethis.:{0}MS曰_&quot;,Enviro

nment.TickCount-vTickCoiint);

}

}

classLhitlransClass

publicstaticdojbleC2F(Classlvalue)

ClassitmpObj=newClassl(37.

5);

Console.WriteLine(tmpObj);

Console.WriteLine(tmpObj.Testl());

Console.WriteLine(tmpObj.7est2());

Console.Read,ine();

)

}

結(jié)果:

37.5Celsius=99.5Fahrenheit

Havethis.:4375MSEL

Don'thavethis.:4406MSEL

IL”以使用抽象函數(shù)重寫基類中的虛函數(shù)嗎?

答:

可以,但需使用new修飾符顯式聲明,表示隱藏了基類

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

classBaseClass

pdblicvirtualvoidF()

Console.WriteLine(&quot;Base

Class.F&quot;);

}

}

abstractclassDeriveClass:BaseClass

{

piblicnewabstractvoidF();

}

12.密封類可以有虛函數(shù)嗎?

答:

可以?拓類中的虛函數(shù)將隱式的轉(zhuǎn)化為『虛函數(shù),但密封

類本身不能再增加新的虛函數(shù)

示例:

[運(yùn)行代碼][女制到剪貼板][土]

CODE:

classBaseClass

piblicvirtualvoidF()

Console.WriteLine(&quot;Base

Class.F&quot;);

)

}

sealedclassDeriveClass:BaseClass

〃基類中的虛函數(shù)F被隱式的轉(zhuǎn)化為非

虛函數(shù)

〃密封類中不能再聲明新的虛函數(shù)G

//publicvirtualvoidG()

//(

//Console.WriteLine(&quot;De

riveClass.G&quot;);

//}

}

13,如果基類中的虛屬性只有個(gè)屬性訪問器,那么維承類

童寫該屬性后可以有幾個(gè)屬性訪問器?如果基類中有g(shù)et

和set兩個(gè)呢?

I答:

如果展類中的虛屬性只有一個(gè)屬性訪問器,那么繼承類重

符?起使用

15.接口可以包含哪些成員?

答:

接口可以包含屬性、方法、索引指示器和事件,但不能包含常量、域、操作符、構(gòu)造函

數(shù)和析構(gòu)函數(shù),而且也不能包含任何靜態(tài)成員

16.類和結(jié)構(gòu)的區(qū)別?

答:

類:

類是引用類型在堆上分配,類的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對(duì)象

分配的內(nèi)存

類有構(gòu)造和析構(gòu)函數(shù)

類可以繼承和被繼承

結(jié)構(gòu):

結(jié)構(gòu)是值類型在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放),結(jié)構(gòu)

的賦值將分配產(chǎn)生一個(gè)新的對(duì)象。

結(jié)構(gòu)沒有構(gòu)造函數(shù),但可以添加。結(jié)構(gòu)沒有析構(gòu)函數(shù)結(jié)構(gòu)不可以繼承自另?個(gè)結(jié)構(gòu)或

被繼承,但和類一樣可以繼承自接口

示例:

根據(jù)以上比較,我們可以得出一些輕量級(jí)的對(duì)象最好使用結(jié)構(gòu),但數(shù)據(jù)量大或有復(fù)雜處

理邏輯對(duì)象最好使用類。如:Geoemtry(GIS里的一個(gè)概論,在OGC標(biāo)準(zhǔn)里有定義)

最好使用類,而Geometry中點(diǎn)的成員最好使用結(jié)

構(gòu)

[運(yùn)行代碼][或制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample16

(

interfaceIPoint

{

doubleX

{

get;

set;

}

doubleY

{

get;

set;

)

〃結(jié)構(gòu)也可以從接口繼承

structPoint:IPoint

{

privatedoublex,y,z;

〃結(jié)構(gòu)也可以增加構(gòu)造函數(shù)

publicPoint(doi±)leX,doubleY,doub

IeZ)

{

this.x=X;

this.y=Y;

this.z=Z;

}

publicdodbleX

{

get{returnx;}

set{x=value;}

}

publicdoibleY

}

〃在此簡化了點(diǎn)狀Geometry的設(shè)計(jì),實(shí)際產(chǎn)

品中還包含Project(坐標(biāo)變換)等攵雜操作

classPointGeometry

(

privatePointvalue;

piblicPointGeometry(doubleX,doubl

eY,doubleZ)

{

value=newPoint(X,Y,Z);

}

publicPointGeometry(Pointvalue)

{

〃結(jié)構(gòu)的賦值將分配新的內(nèi)存

this.value=value;

}

publicdodbleX

}

publicdoubleZ

(

get{retcmvalue,Z;}

set{this.value.Z=value;}

)

publicstaticPointGeometryoperator

+(PointGeometryLeft,PointGeometryRigth)

(

returnnewPointGeometry(Left.X

+Rigth.X,Left.Y+Rigth.Y,Left.Z+Rigth.

Z);

}

publicoverridestringTbStringO

{

returnstring.Format(&qijot;X:

{0}fY:{1},Z:{2}&quot;,value.X,va

lue.Y;value.Z);

intGeometry(tmpPoint);

PointGeometrytmpPG2=newPo

intGeometry(tmpPoint);

tmpPG2,X=4;

tmpPG2.Y=5;

tmpPG2.Z=6;

〃由于結(jié)構(gòu)是值類型,tmpPGl和t

mpPG2的坐標(biāo)并不一樣

Console.WriteLine(tmpPGl);

Console.WriteLine(tmpPG2);

〃由于類是引用類型.對(duì)tmpPGl坐

標(biāo)修改后影響到了tmpPG3

PointGeometrytmpPG3=tmpPG

1;

tmpPGl.X=7;

tmpPGl.Y=8;

tmpPGl,Z=9;

Console.WriteLine(tmpPG1);

Console.WriteLine(tmpPG3);

X:4,Y:5,Z:6

X:7,Y:8,Z:9

X:7,Y:8,Z:9

17,接口的多繼承會(huì)帶來哪些問題?

答;

C#中的接「I。類不同,可以使用多繼承,即?個(gè)子接門

可以有多個(gè)父接口。但如果兩個(gè)父成員具有同名的成員,

就產(chǎn)生了.義性(這也正是C#中類取消了多繼承的原因

之一),這時(shí)在實(shí)現(xiàn)時(shí)最好使用顯式的聲明

示例:

[運(yùn)行代碼][旦制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample17

(

classProgram

{

〃一個(gè)完整的接口聲明示例

interfacelExample

{

〃屬性

sti'ingP

get;

set;

)

〃方法

stringF(intValue);

〃事件

eventEventHandlerE;

〃索引指示器

stringthis[intIndex]

{

get;

set;

)

}

interfaceIA

intCount{get;set;}

classC:IC

{

privateintcount=100;

〃顯式市明實(shí)現(xiàn)IA接I」中的Count

屬性

intIA.Count

(

get{return100;}

set{count=value;}

}

〃顯式聲明實(shí)現(xiàn)IB接口中的Count

方法

intIB.Count()

(

retirncocnt*count;

)

}

staticvoidMain(string[]args)

Console.ReadLine();

}

}

結(jié)果:

Countproperty:100

Countfunction:10000

18.抽象類和接口的區(qū)別?

答:

抽象類(abstractclass)可以包含功能定義和實(shí)現(xiàn),接口

(interface)只能包含功能定義

抽象類是從一系列相關(guān)時(shí)象中抽象出來的概念,因此反映

的是次物的內(nèi)部共性;接口是為了滿足外部調(diào)用面定義的

一個(gè)功能約定,因此反映的是事物的外部特性

分析對(duì)象,提煉內(nèi)部共性形成抽象類,用以去示對(duì)象本質(zhì).

即“是什么”

示例:

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

Classl.cs:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespacecom.nblogs.reonlyrun.CSharp26Q

Example.ExampleIQ.LibO1

(

classClassi

{

pibllcoverridestringTbStringO

(

returnmp;quot;com.nblogsreon

lyrtri.CSharp26QExample.Example19.Lib01's

Classl&3mp;quot;;

}

}

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespacecom.nblogs.reonlyrun.CSharp26Q

Example.Example19.LibO2

(

classClassi

{

publicoverridestring7bString()

(

return&quot;com.nblogs.reon

lyrun.CSharp26QExample.Example19,LibO2's

Classl&quot;;

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingLibOlClassl=com.nblogs.reonlyrun.C

Sharp26QExample.Example19.LibOl.Class1,

usingLibO2Class2=com.nblogs.reonlyrun.C

Sharp26QExample.Example19.LibO2.Class1;

namespaceExample19

(

classProgram

(

staticvoidMain(string[]args)

{

LibOlClassltmpObjl=newLibO

ICIasslO;

LibO2Class2tmpObj2=newLibO

2Class2();

Console.WriteLine(tmpObjl);

Console.WriteLine(tmpCbj2);

Console.ReacLine();

com.nblogs.reonlyrun.CSharp26QExample.Example19.Lib

O2'sClassi

20.如何釋放非托管資源?

答:

.任T平臺(tái)在內(nèi)存管理方面提供了GC<Garbage

Collection),負(fù)責(zé)自動(dòng)釋放托管資源和內(nèi)方回收的「作,田

它無法對(duì)非托管資源進(jìn)行釋放,這時(shí)我們必須自己提供方

法來釋放對(duì)象內(nèi)分配的小托管資源,比如你在對(duì)象的實(shí)現(xiàn)

代碼中使用r一個(gè)COM對(duì)象

最簡單的辦法,可以通過'實(shí)現(xiàn)protectedvoidFinalize()(析

構(gòu)函數(shù)會(huì)在編譯時(shí)變成這個(gè)東東)來釋放作托管資源,閃

為GC在釋放對(duì)象時(shí)會(huì)檢查該對(duì)象是否實(shí)現(xiàn)了FinalizeO

方法,如果是則調(diào)用它。但,據(jù)說這樣會(huì)降低效率一。

有一種更好的.那就是通過實(shí)現(xiàn)一個(gè)接口顯式的提供給客

戶調(diào)用端手工釋放對(duì)象的方法,而不是傻傻的等著GC來

釋放我們的對(duì)象(何況效率又那么低)

System命名空間內(nèi)行一個(gè)1Disposable接U,S來做這

事非常合適,就省得我們自己再聲明一個(gè)接口了

[運(yùn)行代碼][笈制到宵貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample20

{

classProgram

(

classClassi:Disposable

(

〃析構(gòu)函數(shù),編譯后變成protected

voidFinalizeO,GC會(huì)在回收對(duì)象前會(huì)調(diào)用調(diào)用

該方法

~Classl()

(

Dispose(false);

)

〃通過實(shí)現(xiàn)該接口,客戶可以顯式地

釋放對(duì)象,而不需要等待GC來釋放資源,據(jù)說

anageResaTces()

(

//Dosomething...

)

〃私有函數(shù)用以釋放非托管資源

privatevoidDispose(booldisposin

g)

{

ReleaseUnmanageResou'ces(),

〃為true時(shí)表示是客戶顯式調(diào)用

「擇放函數(shù),需通知GC不要再調(diào)用對(duì)象的Fina

lize方法

〃為false時(shí)肯定是GC調(diào)用了對(duì)

象的Finalize方法,所以沒有必要再告訴GC你

不要調(diào)用我的Finalize方法啦

if(disposing)

{

GC.Suppres^inalizetthis),

)

說比等著GC來釋放它效率要調(diào)飛

〃個(gè)人認(rèn)為是因?yàn)橐饌€(gè)對(duì)象的令看

其元數(shù)據(jù),以確認(rèn)是否實(shí)現(xiàn)了Dispose方法吧

〃當(dāng)然最重要的是我們可以自己確定

釋放的時(shí)間以由省內(nèi)存,優(yōu)化程序運(yùn)行效率

ClassitmpObj2=newClass1();

((IDisposable)tmpCbj2).Dispose();

)

)

}

21,P/lnvoke是什么?

答:

在受控代碼1J拒受控代碼進(jìn)行交互時(shí)會(huì)產(chǎn)生一個(gè)事務(wù)

(transition),這通常發(fā)生在使用平臺(tái)調(diào)用服務(wù)(Platform

InvocationServices),即P/Invoke

如調(diào)用系統(tǒng)的ZPI或。COM時(shí)象打交道,通過

System.Runtime.InteropServices命名空間

String雖然是一個(gè)引用類型,但在賦值操作時(shí)會(huì)產(chǎn)生一個(gè)

新的對(duì)象,而StringBuilder則不會(huì)

所以在大盤字符串拼接或頻繁對(duì)某一字符串進(jìn)行操作時(shí)最

好使用StringBuilder,不要使用String

示例:

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample22

{

classProgram

{

staticvoidMain(string[]args)

{

constintcycle=100000;

IonavTickCoint=Environment.Ti

ckCount;

Stringstr=null;

for(intI=0;i<cycle;i++)

str+=LlbStringO;

Console.WriteLine(&quot;Strin

vTickCount=Environment.TickCo

unt;

//看到這個(gè)變M名我就生氣,奇怪為

什么大家都使它呢?:)

StringBuildersb=newStringBuil

der();

for(inti=0;i<cyde;i++)

sb,/Append。);

Console.WriteLine(&quot;Strin

gBuilder:{0}MSEL&jquot^Environmen

t.TickComt-vTickCount);

Console.Read.rne();

?

)

}

結(jié)果:

String:102047MSS.

implicit喪示隱式轉(zhuǎn)換,如從B->A只需直接賦值(A=

B)

隱式轉(zhuǎn)換可以讓我們的代碼看上去更漂亮、更簡潔易懂,

所以最好多使用implicit運(yùn)算符。不過!如果對(duì)象本身在

轉(zhuǎn)換時(shí)會(huì)損失一些信息(如精度),那么我們只能使用

explicit運(yùn)算符,以便在編譯期就能警告客戶調(diào)用端

示例:

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceExample23

(

classProgram

{

〃本例靈感來源于大話西游經(jīng)典臺(tái)詞“神

fill?妖怪?”一主要是我實(shí)在想不出什么好例子

T

classImmortal

{

piblicstringname;

pcblicImma'tal(str1ngName)

name=Name;

}

publicstaticimplicitoperatorMon

ster(Immortalvalue)

(

returnnewMonster(value.nam

e+&quot;:神仙變妖怪?偷偷下凡即

nj'c.n&quot;);

}

}

classMonster

{

piblicstringname;

pcblicMonster(stringName)

{

name=Name;

}

pcblicstaticexplicitoperatorImm

ortaI(Monstervalue)

mortal(&quot;紫由仙子&quot;);

〃隱式轉(zhuǎn)換

MonstertmpObjl=tmplmmortal;

Console.WriteLine(tmpO);

MonstertmpMonster=newMons

ter(&quot;孫悟空&quot;);

〃顯式轉(zhuǎn)換

ImmortaltmpObj2=(Immortal)t

mpMcnster;

Console.WriteLine(tmpObj2,name);

Console.ReacLine();

}

)

)

結(jié)果:

紫霞仙子:神仙變妖怪?偷偷下凡即可…

孫悟空:妖怪想當(dāng)神仙?再去修煉五百年!

[運(yùn)行代碼][復(fù)制到剪貼板][土]

CODE:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

namespaceConsoleZ^ppIication1

{

class告p

{

〃第一個(gè)參數(shù)必須是整型,但后而的參數(shù)

個(gè)數(shù)是可變的。

〃而且由于定的是object數(shù)組.所有的

數(shù)據(jù)類型都可以做為參數(shù)傳入

publicstaticvoidUseParamsfintid,p

aramsobject[]list)

{

Console.WriteLine(id);

for(inti=0;i<list.Length;i+

是字符串類型

UseParams(l,&quot;a&

quot;z&quot;b&quot;,&quot;

c&quot;);

〃可變參數(shù)部分傳入了四個(gè)參數(shù),分

別為字符串、整數(shù)、浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)數(shù)組

UseParams(2,&quot;d&

quo。100,33.33,newdoublet]{1.1,2.2

));

Console.Read-ine();

}

}

!結(jié)果:

1

a

b

答:

反射,Reflection,通過它我們可以在運(yùn)行時(shí)獲得各種信息,

如程序集、模塊

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論