版權(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}",,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("76543
21");
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("
A.F&qjot;);
)
publicvirtualvoidG()
<
Console.WriteLine("
A.G&qijot;);
}
}
classB:A
(
pcblicsealedoverridevoidF()
(
Console.WriteLine("
B.F");
)
publicoverridevoidG()
{
Console.WriteLine("
C.G");
}
}
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("B
aseClass.F");
}
}
classDeriveClass:BaseClass
(
piblicoverridevoidF()
{
base.F();
Console,WriteLine("
DeriveClass.F");
}
pcblicvoidAdd(intLeft,intRigh
t)
(
Console.WriteLine("A
ddforInt:{0}"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"T
odayiscloudyI";
}
case5:
{
return"T
odayistixndershower!";
}
default:
get
{
stringTbdayWeather=null;
//switch的標(biāo)準(zhǔn)寫法
switch(Day)
{
case"Sunday&a
mp;quot;:
{
TbdayWeather=&a
mp;quot;Todayiscloudy!";
break;
}
case"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","luesday&q
uot;,"Wednesday",&a
mp;quot;lhirsday";"Fri
day","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("
{0}Celsius={1}Fahrenheit"zc,
UhitlransClass.C2F(this));
}
〃由于好奇,在這做了一個(gè)效率測試,想
看看到底哪種方式訪問成員變量更快,結(jié)論:區(qū)
別不大
avethis.:{0}MSEL",Bivironmen
t.TickCocnt-vTickCount);
}
publicstringTest2()
{
longvTickCount=Environment.Ti
ckCount;
for(inti=0;i<10000000;i+
+)
value=i.lbStringO;
returnstring.Format("D
on'thavethis.:{0}MS曰_",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("Base
Class.F");
}
}
abstractclassDeriveClass:BaseClass
{
piblicnewabstractvoidF();
}
12.密封類可以有虛函數(shù)嗎?
答:
可以?拓類中的虛函數(shù)將隱式的轉(zhuǎn)化為『虛函數(shù),但密封
類本身不能再增加新的虛函數(shù)
示例:
[運(yùn)行代碼][女制到剪貼板][土]
CODE:
classBaseClass
piblicvirtualvoidF()
Console.WriteLine("Base
Class.F");
)
}
sealedclassDeriveClass:BaseClass
〃基類中的虛函數(shù)F被隱式的轉(zhuǎn)化為非
虛函數(shù)
〃密封類中不能再聲明新的虛函數(shù)G
//publicvirtualvoidG()
//(
//Console.WriteLine("De
riveClass.G");
//}
}
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}",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"com.nblogs.reon
lyrun.CSharp26QExample.Example19,LibO2's
Classl";
[運(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("Strin
vTickCount=Environment.TickCo
unt;
//看到這個(gè)變M名我就生氣,奇怪為
什么大家都使它呢?:)
StringBuildersb=newStringBuil
der();
for(inti=0;i<cyde;i++)
sb,/Append。);
Console.WriteLine("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+":神仙變妖怪?偷偷下凡即
nj'c.n");
}
}
classMonster
{
piblicstringname;
pcblicMonster(stringName)
{
name=Name;
}
pcblicstaticexplicitoperatorImm
ortaI(Monstervalue)
mortal("紫由仙子");
〃隱式轉(zhuǎn)換
MonstertmpObjl=tmplmmortal;
Console.WriteLine(tmpO);
MonstertmpMonster=newMons
ter("孫悟空");
〃顯式轉(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,"a&
quot;z"b","
c");
〃可變參數(shù)部分傳入了四個(gè)參數(shù),分
別為字符串、整數(shù)、浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)數(shù)組
UseParams(2,"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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44807.1-2024集成電路電磁兼容建模第1部分:通用建??蚣?/a>
- 共振音叉課件教學(xué)課件
- 電商物流解決方案
- 糖尿病的自我監(jiān)測與管理
- 無人駕駛汽車的發(fā)展前景
- 食管癌晚期治療進(jìn)展
- 糖尿病治療儀使用
- 初中化學(xué)常見氣體的制取專題教案
- 角膜病病人的護(hù)理
- 海上日出說課稿第課時(shí)
- 寶鋼中央研究院創(chuàng)新戰(zhàn)略與運(yùn)行機(jī)制研究
- 建筑CAD測試多選題
- 支座鑄造工藝設(shè)計(jì)
- 2022年學(xué)校禁毒工作計(jì)劃
- GB-T-30512-2014-汽車禁用物質(zhì)要求
- 生物相容性試驗(yàn)檢測報(bào)告
- 精品資料(2021-2022年收藏)云南白藥財(cái)務(wù)報(bào)表分析精講
- 美國入境海關(guān)申報(bào)單
- 七年級(jí)上冊(cè)數(shù)學(xué)期中考試試題(含答案)
- 小學(xué)四年級(jí)上冊(cè)美術(shù)課件-第3課車-蘇少版(17張)ppt課件
- 紙品配送服務(wù)方案紙品采購項(xiàng)目方案
評(píng)論
0/150
提交評(píng)論