![C#經(jīng)典問(wèn)題回答_第1頁(yè)](http://file4.renrendoc.com/view/752565493dc76b52eb527e158ab08420/752565493dc76b52eb527e158ab084201.gif)
![C#經(jīng)典問(wèn)題回答_第2頁(yè)](http://file4.renrendoc.com/view/752565493dc76b52eb527e158ab08420/752565493dc76b52eb527e158ab084202.gif)
![C#經(jīng)典問(wèn)題回答_第3頁(yè)](http://file4.renrendoc.com/view/752565493dc76b52eb527e158ab08420/752565493dc76b52eb527e158ab084203.gif)
![C#經(jīng)典問(wèn)題回答_第4頁(yè)](http://file4.renrendoc.com/view/752565493dc76b52eb527e158ab08420/752565493dc76b52eb527e158ab084204.gif)
![C#經(jīng)典問(wèn)題回答_第5頁(yè)](http://file4.renrendoc.com/view/752565493dc76b52eb527e158ab08420/752565493dc76b52eb527e158ab084205.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1.靜態(tài)成員和非靜態(tài)成員的區(qū)別?................................................1
2.const和staticreadonly區(qū)別?..........................................3
3.extern是什么意思?........................................................6
4.abstract是什么意思?......................................................8
5.internal修飾符起什么作用?.................................................13
6.sealed修飾符是干什么的?..................................................16
7.override和overload的區(qū)別?.................................................20
8.什么是索引指示器?.........................................................22
9.new修飾符是起什么作用?...................................................25
lO.this關(guān)鍵字的含義?........................................................26
11.可以使用抽象函數(shù)重寫(xiě)基類(lèi)中的虛函數(shù)嗎?....................................28
12.密封類(lèi)可以有虛函數(shù)嗎?.....................................................29
13.什么是屬性訪(fǎng)問(wèn)器?.........................................................29
14.abstract可以和virtual一起使用嗎?可以和override一起使用嗎?...........30
15.接口可以包含哪些成員?.....................................................30
16.類(lèi)和結(jié)構(gòu)的區(qū)別?...........................................................30
17.接口的多繼承會(huì)帶來(lái)哪些問(wèn)題?.............................................34
18.抽象類(lèi)和接口的區(qū)別?.....................................................37
L靜態(tài)成員和非靜態(tài)成員的區(qū)別?
答:
靜態(tài)變量使用static修飾符進(jìn)行聲明,在類(lèi)被實(shí)例化時(shí)創(chuàng)建,通過(guò)類(lèi)進(jìn)行訪(fǎng)問(wèn)
不帶有static修飾符聲明的變量稱(chēng)做非靜態(tài)變量,在對(duì)象被實(shí)例化時(shí)創(chuàng)建,通過(guò)對(duì)象進(jìn)行訪(fǎng)問(wèn)
一個(gè)類(lèi)的所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值,同一個(gè)類(lèi)的不同實(shí)例的同?非靜態(tài)變量可以是不同的值
靜態(tài)函數(shù)的實(shí)現(xiàn)里不能使用非靜態(tài)成員,如非靜態(tài)變量、非靜態(tài)函數(shù)等
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExampleOl
classProgram
(
classClassi
(
publicstaticStringstaticStr="Class”;
publicStringnotstaticStr="Obj";
)
staticvoidMain(string[]args)
(
〃靜態(tài)變量通過(guò)類(lèi)進(jìn)行訪(fǎng)問(wèn),該類(lèi)所有實(shí)例的同一靜態(tài)變量都是同一個(gè)值
Console.WriteLine(*ClassTsstaticStr:{0}”,Classi.staticStr);
ClassitrnpObj1=newClassi();
tmpObjl.notstaticStr="tmpObjl”;
Classitmp0bj2=newClassi();
tmp0bj2.notstaticStr二〃lmp0bj2";
〃非靜態(tài)變量通過(guò)對(duì)象進(jìn)行訪(fǎng)問(wèn),不同對(duì)象的同一非靜態(tài)變量可以有不同的值
Console.WriteLine(^trnpObjl,snotstaticStr:{0}”,tmpObjl.notstaticStr);
Console.WriteLine(/ztmpObj2,snotstaticStr:{0}”,tmp0bj2.notstaticStr);
Console.ReadLine();
)
)
結(jié)果:
Classi'sstaticStr:Class
tmpObjl'snotstaticStr:tmpObjl
tmpObj2*snotstaticStr:tmpObj2
Z.const和staticreadonly區(qū)別?
答:
const
用const修飾符聲明的成員叫常量,是在編譯期初始化并嵌入到客戶(hù)端程序
staticreadonly
用staticreadonly修飾符聲明的成員依然是變量,只不過(guò)具有和常量類(lèi)似的使用方法:通過(guò)類(lèi)進(jìn)行訪(fǎng)問(wèn)、
初始化后不可以修改。但與常量不同的是這種變量是在運(yùn)行期初始化
示例:
測(cè)試類(lèi):
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExampleO2Lib
publicclassClassi
publicconstStringstrConst="Const”;
publicstaticreadonlyStringstrStaticReadonly=
nStaticReadonlyn;
//publicconstStringstrConst="ConstChanged0;
//publicstaticreadonlyStringstrStaticReadonly
nStaticReadonlyChangedn;
)
)
客戶(hù)端代碼:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingExample02Lib;
namespaceExamp]一02
(
classProgram
staticvoidMain(string[]args)
//修改Example02中Classi的strConst初始值后,只編譯
ExampleO2Lib項(xiàng)目
//然后到資源管理器里把新編譯的ExampleO2Lib.dll拷貝
Example02.exe所在的目錄,擬I彳亍Exampl一02.exe
//切不可在IDE里直接調(diào)試運(yùn)行因?yàn)檫@會(huì)重新編譯整個(gè)解決方
案??!
//可以看至IIstrConst的輸出沒(méi)有改變,而
strStaticReadonly的輸出已經(jīng)改變
//表明Const變量是在編譯期初始化并嵌入到客戶(hù)端程序,而
StaticReadonly是在運(yùn)行時(shí)初始化的
Console.WriteLine("strConst:{0}n,
Classi.strConst);
Console.WriteLine(nstrStaticReadonly:{0}",
Classi.strStaticReadonly);
Console.ReadLine();
)
)
)
結(jié)果:
strConst:Const
strStaticReadonly:StaticReadonly
修改后的示例:
測(cè)試類(lèi):
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExampleO2Lib
(
publicclassClassi
(
//publicconstStringstrConst="Const”;
//publicstaticreadonlyStringstrStaticReadonly=
nStaticReadonlyH;
publicconstStringstrConst="ConstChanged”;
publicstaticreadonlyStringstrStaticReadonly=
nStaticReadonlyChanged”;
}
}
結(jié)果
strConst:Const
strStaticReadonly:StaticReadonlyChanged
3.extern是什么意思?
答:
extern修飾符用于聲明由程序集外部實(shí)現(xiàn)的成員函數(shù)
經(jīng)常用于系統(tǒng)API函數(shù)的調(diào)用(通過(guò)Dlllmport)。注意,和Dlllmport一起使用時(shí)要加上static修
飾符
也可以用于對(duì)于同一程序集不同版本組件的調(diào)用(用extern聲明別名)
不能與abstract修飾符同時(shí)使用
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
namespaceExample03
(
classProgram
(
//注意Dlllmport是一個(gè)AttributeProperty,在
System.Runtime.InteropServices命名空間中定義
//extern與Dlllmport一起使用時(shí)必須再加上一個(gè)static修飾符
[Dlllmport("User32.dll")]
publicstaticexternintMessageBox(intHandle,string
Message,stringCaption,intType);
staticintMain()
stringmyString;
Console.Write("Enteryourmessage:n);
myString=Console.ReadLine();
returnMessageBox(0,myString,"MyMessageBox”,
0);
)
)
)
結(jié)果:
4.abstract是什么意思?
答:
abstract修飾符可以用于類(lèi)、方法、屬性、事件和索引指示器(indexer),表示其為抽象成員
abstract不可以和static、virtual一起使用
聲明為abstract成員可以不包括實(shí)現(xiàn)代碼,但只要類(lèi)中還有未實(shí)現(xiàn)的抽象成員(即抽象類(lèi)),那么它的
對(duì)象就不能被實(shí)例化,通常用于強(qiáng)制繼承類(lèi)必須實(shí)現(xiàn)某?成員
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample04
(
#region基類(lèi),抽象類(lèi)
publicabstractclassBaseClass
(
//抽象屬性,同時(shí)具有g(shù)et和set訪(fǎng)問(wèn)器表示繼承類(lèi)必須將該屬性實(shí)
現(xiàn)為可讀寫(xiě)
publicabstractStringAttribute
(
get;
set;
)
//抽象方法,傳入一個(gè)字符串參數(shù)無(wú)返回值
publicabstractvoidFunction(Stringvalue);
//抽象事件,類(lèi)型為系統(tǒng)預(yù)定義的代理(delegate):EventHandler
publicabstracteventEventHandlerEvent;
//抽象索引指示器,只具有g(shù)et訪(fǎng)問(wèn)器表示繼承類(lèi)必須將該索引指示
器實(shí)現(xiàn)為只讀
publicabstractCharthis[intIndex]
(
get;
)
)
#endregion
#region繼承類(lèi)
publicclassDeriveClass:BaseClass
(
privateStringattribute;
publicoverrideStringAttribute
(
get
returnattribute;
}
set
attribute=value;
)
)
publicoverridevoidFunction(Stringvalue)
(
attribute=value;
if(Event!=null)
(
Event(this,newEventArgs());
)
)
publicoverrideeventEventHandlerEvent;
publicoverrideCharthis[intIndex]
(
get
(
returnattribute[Index];
)
)
)
#endregion
classProgram
(
staticvoidOnFunction(objectsender,EventArgse)
(
for(inti=0;i<
((DeriveClass)sender).Attribute.Length;i++)
(
Console.WriteLine(((DeriveClass)sender)[i]);
)
)
staticvoidMain(string[]args)
(
DeriveClasstmpObj=newDeriveClass();
tmpObj.Attribute="1234567”;
Console.WriteLine(tmpObj.Attribute);
//將靜態(tài)函數(shù)OnFunction與tmpObj對(duì)象的Event事件進(jìn)行
關(guān)聯(lián)
tmpObj.Event+=newEventHandler(OnFunction);
tmpObj.Function(”7654321”);
Console.ReadLine();
)
)
)
結(jié)果:
1234567
7
6
5
4
3
2
1
5.internal修飾符起什么作用?
答:
internal修飾符可以用于類(lèi)型或成員,使用該修飾符聲明的類(lèi)型或成員只能在同一程集內(nèi)訪(fǎng)問(wèn)
接口的成員不能使用internal修飾符
值得注意的是,如果為internal成員加上了protected修飾符,這時(shí)的訪(fǎng)問(wèn)級(jí)別為internal或
protectedo只是看字面意思容易弄錯(cuò),許多人認(rèn)為internalprotected應(yīng)該是''只有同一個(gè)程序集中的
子類(lèi)可以訪(fǎng)問(wèn)〃,但其實(shí)它表示''同一個(gè)程序集中的所有類(lèi),以及所有程序集中的子類(lèi)都可以訪(fǎng)問(wèn)〃
示例
ExampleO5Lib項(xiàng)目的Classi
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExampleO5Lib
(
publicclassClassi
{
internalStringstrinternal=null;
publicStringstrPublic;
internalprotectedStringstrInternalProtected=
null;
}
)
結(jié)果
ExampleO5Lib項(xiàng)目的Class2類(lèi)可以訪(fǎng)問(wèn)到Classi的strinternal成員,當(dāng)然也可以訪(fǎng)問(wèn)到
strlnternalProtected成員,因?yàn)樗麄冊(cè)谕粋€(gè)程序集里
Class2xs*Classl.cs*
襟Exan<)ieO5Ub,Class2v
Busin<System;
Iusin^System.CollectionsG?neric;
LusiySystem.Text;
BnwespactExampl?05Lib
E3classCltss2
(
privateStringt*pStr-newClassi0.|
'.}^Eouals
^GetHashCode
QGetType
承strInternal
口strlnternalProtected
QstrPublic
?ToString
ClarkZheng
Example05項(xiàng)目里的Class3類(lèi)無(wú)法訪(fǎng)問(wèn)到Classi的strinternal成員,因?yàn)樗鼈儾辉谕?個(gè)程序
集里。但卻可以訪(fǎng)問(wèn)到strlnternalProtected成員,因?yàn)镃lass3是Classi的繼承類(lèi)
Example05項(xiàng)目的Program類(lèi)既無(wú)法訪(fǎng)問(wèn)到Classi的strinternal成員,也無(wú)法訪(fǎng)問(wèn)到
strlnternalProtected成員,因?yàn)樗鼈兗炔辉谕粋€(gè)程序集里也不存在繼承關(guān)系
6.sealed修飾符是干什么的?
答:
sealed修飾符表示密封
用于類(lèi)時(shí),表示該類(lèi)不能再被繼承,不能和abstract同時(shí)使用,因?yàn)檫@兩個(gè)修飾符在含義上互相排斥
用于方法和屬性時(shí),表示該方法或?qū)傩圆荒茉俦恢貙?xiě),必須和override關(guān)鍵字一起使用,因?yàn)槭褂?/p>
sealed修飾符的方法或?qū)傩钥隙ㄊ腔?lèi)中相應(yīng)的虛成員
通常用于實(shí)現(xiàn)第三方類(lèi)庫(kù)時(shí)不想被客戶(hù)端繼承,或用于沒(méi)有必要再繼承的類(lèi)以防止濫用繼承造成層次結(jié)構(gòu)
體系混亂
恰當(dāng)?shù)睦胹ealed修飾符也可以提高一定的運(yùn)行效率,因?yàn)椴挥每紤]繼承類(lèi)會(huì)重寫(xiě)該成員
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample06
(
classProgram
(
classA
(
publicvirtualvoidF()
Console.WriteLine(nA.FH);
}
publicvirtualvoidG()
(
Console.WriteLine("A.G");
}
}
classB:A
(
publicsealedoverridevoidF()
(
Console.WriteLine("B.F");
)
publicoverridevoidG()
(
Console.WriteLine("B.G");
)
)
classC:B
(
publicoverridevoidG()
Console.WriteLine("C.G");
)
)
staticvoidMain(string[]args)
(
newA().F();
newA().G();
newB().F();
newB().G();
newC().F();
newC().G();
Console.ReadLine();
}
)
)
結(jié)果:
類(lèi)B在繼承類(lèi)A時(shí)可以重寫(xiě)兩個(gè)虛函數(shù),如圖所示:
classA
(
publicvirtutlvoidF0
(
Console.tfriteLine(*A.F");
)
publicvirtualvoidGO
(
Console.WriteLine(-A.G");
classBA
(
publicsealedoverridevoid
RE。
C由應(yīng)heng
由于類(lèi)B中對(duì)F方法進(jìn)行了密封,類(lèi)C在繼承類(lèi)B時(shí)只能重寫(xiě)一個(gè)函數(shù),如圖所示:
bclassB:A
(
Bpublics??l?dov?rrid?voidF()
{
Console.WriteLine(*B.F");
}
BpublicoverridevoidGO
(
Console.WriteLine(*B.G");
}
)
BclassC:B
(
publicoverridevoid
iwol
ClarkZheng
控制臺(tái)輸出結(jié)果,類(lèi)C的方法F只能是輸出類(lèi)B中對(duì)該方法的實(shí)現(xiàn):
A.F
A.G
B.F
B.G
B.F
C.G
7.override和overload的區(qū)別?
答:
override表示重寫(xiě),用于繼承類(lèi)對(duì)基類(lèi)中虛成員的實(shí)現(xiàn)
overload表示重載,用于同一個(gè)類(lèi)中同名方法不同參數(shù)(包括類(lèi)型不同或個(gè)數(shù)不同)的實(shí)現(xiàn)
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample07
(
classProgram
(
classBaseClass
(
publicvirtualvoidF()
(
Console.WriteLineC^BaseClass.F");
)
}
classDeriveClass:BaseClass
(
publicoveiTidevoidF()
(
base.F();
Console.WriteLineC'DeriveClass.F");
)
publicvoidAdd(intLeft,intRight)
(
Console.WriteLine(HAddforInt:{0}",Left+Right);
)
publicvoidAdd(doubleLeft,doubleRight)
(
Console.WriteLine(nAddforint:{0}u,Left+Right);
)
)
staticvoidMain(string[]args)
(
DeriveClasstmpObj=newDeriveClass();
tmpObj.F();
tmpObj.Add(l,2);
tmpObj.Add(1.1,2.2);
Console.ReadLine();
結(jié)果:
BaseClass.F
DeriveClass.F
AddforInt:3
Addforint:3.3
8.什么是索引指示能?
答:
實(shí)現(xiàn)索引指示器(indexer)的類(lèi)可以象數(shù)組那樣使用其實(shí)例后的對(duì)象,但與數(shù)組不同的是索
引指示器的參數(shù)類(lèi)型不僅限于int
簡(jiǎn)單來(lái)說(shuō),其本質(zhì)就是一個(gè)含參數(shù)屬性
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample08
(
publicclassPoint
(
privatedoublex,y;
publicPoint(doubleX,doubleY)
(
x=X;
y=Y;
)
//重寫(xiě)ToString方法方便輸出
publicoverridestringToStringO
(
returnString.Format("X:{0},Y:{1}n,x,y);
)
)
publicclassPoints
(
Point[]points;
publicPoints(Point[]Points)
(
points=Points;
)
publicintPoinlNumber
(
get
returnpoints.Length;
〃實(shí)現(xiàn)索引訪(fǎng)問(wèn)器
publicPointthis[intIndex]
(
get
(
returnpoints[Index];
)
}
)
〃索引指示器的實(shí)質(zhì)是含參屬性,參數(shù)并不只限于int
classWeatherOfWeek
(
publicstringthis[intIndex]
(
get
(
//注意case段使用return直接返回所以不需要break
switch(Index)
(
case0:
(
return"Todayiscloudy!";
)
case5:
(
return"Todayisthundershower!";
}
default:
(
return"Todayisfine!";
}
)
)
)
publicstringthis[stringDay]
(
get
(
stringTodayWeather=null;
//switch的標(biāo)準(zhǔn)寫(xiě)法
switch(Day)
case"Sunday”:
(
TodayWeather="Todayiscloudy!,1;
break;
)
case"Friday1':
(
TodayWeather=*'Todayisthundershower!'1;
break;
)
default:
(
TodayWeather="Todayisfine!',;
break;
)
)
returnTodayWeather;
classProgram
(
staticvoidMain(string[]args)
(
Point[]tmpPoints=newPoint[10];
for(inti=0;i<tmpPoints.Length;i++)
(
tmpPointsliJ=newPoint(i,Math.Sin(i));
)
PointstmpObj=newPoints(tmpPoints);
for(inti=0;i<tmpObj.PointNumber;i++)
(
Console.WriteLine(tmpObj[iJ);
string[]Week=newstringf]{"Sunday","Monday","Tuesday",''Wednesday1',
"Thursday","Friday",nStaurdayn};
WeatherOfWeektmpWeatherOfWeek=newWeatherOfWeek();
for(inti=0;i<6;i++)
Console.WriteLine(tmpWeatherOf,Week[i]);
foreach(stringtmpDayinWeek)
(
Console.WriteLine(tmpWeatherOlWeek[tmpDay]);
)
Console.ReadLine();
結(jié)果:
X:0,Y:0
X:1,Y:0.841470984807897
X:2,Y:0.909297426825682
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修飾符用于聲明類(lèi)或類(lèi)的成員,表示隱藏了基類(lèi)中同名的成員。而new操作符用于實(shí)
例化一個(gè)類(lèi)型
new修飾符只能用于繼承類(lèi),一般用于彌補(bǔ)基類(lèi)設(shè)計(jì)的不足
new修飾符和override修飾符不可同時(shí)用在一個(gè)成員上,因?yàn)檫@兩個(gè)修飾符在含義上互相
排斥
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample09
(
classBaseClass
(
〃基類(lèi)設(shè)計(jì)者聲明了一個(gè)PI的公共變量,方便進(jìn)行運(yùn)算
publicstaticdoublePI=3.1415;
}
classDervieClass:BaseClass
(
〃繼承類(lèi)發(fā)現(xiàn)該變量的值不能滿(mǎn)足運(yùn)算精度,于是可以通過(guò)new修飾符顯式隱藏基
類(lèi)中的聲明
publicnewstaticdoublePI=3.1415926;
)
classProgram
(
staticvoidMain(string[]args)
(
Console.WriteLine(BaseClass.PI);
Console.WriteLine(DervieClass.PI);
Console.ReadLine();
結(jié)果:
3.1415
3.1415926
lO.this關(guān)鍵字的含義?
答:
this是一個(gè)保留字,僅限于構(gòu)造函數(shù)和方法成員中使用
在類(lèi)的構(gòu)造函數(shù)中出現(xiàn)表示對(duì)正在構(gòu)造的對(duì)象本身的引用,在類(lèi)的方法中出現(xiàn)表示對(duì)調(diào)用該
方法的對(duì)象的引用,在結(jié)構(gòu)的構(gòu)造上函數(shù)中出現(xiàn)表示對(duì)正在構(gòu)造的結(jié)構(gòu)的引用,在結(jié)構(gòu)的方
法中出現(xiàn)表示對(duì)調(diào)用該方法的結(jié)果的引用
this保留字不能用于靜態(tài)成員的實(shí)現(xiàn)里,因?yàn)檫@時(shí)對(duì)象或結(jié)構(gòu)并未實(shí)例化
在C#系統(tǒng)中,this實(shí)際上是一個(gè)常量,所以不能使用this++這樣的運(yùn)算
this保留字一般用于限定同名的隱藏成員、將對(duì)象本身做為參數(shù)、聲明索引訪(fǎng)問(wèn)器、判斷傳
入?yún)?shù)的對(duì)象是否為本身
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample10
(
classClassi
(
privatedoublec;
privatestringvalue;
publicdoubleC
(
get
(
returnc;
)
}
publicClassi(doublec)
(
〃限定同名的隱臧成員
this.c=c;
)
publicClassi(Classivalue)
(
〃用對(duì)象本身實(shí)例化自己沒(méi)有意義
if(this!=value)
(
c=value.C;
)
)
publicoverridestringToStringO
(
〃將對(duì)象本身做為參數(shù)
returnstring.Format(n{0}Celsius={1}Fahrenheit",c,UnitTransClass.C2F(this));
)
〃由于好奇,在這做了一個(gè)效率測(cè)試,想看看到底哪種方式訪(fǎng)問(wèn)成員變量更快,結(jié)
論:區(qū)別不大。。。
publicstringTest1()
(
longvTickCount=Environment.TickCount;
for(inti=0;i<10000000;i++)
this.value=i.ToString();
returnstring.Format("Havethis.:{0}MSEL",Environment.TickCount-
vTickCount);
)
publicstringTest2()
(
longvTickCount=Environment.TickCount;
for(inti=0;i<10000000;i++)
value=i.ToString();
returnstring.Format(nDon'thavethis.:{0}MSEL'\Environment.TickCount-
vTickCount);
)
}
classUnitTransClass
(
publicstaticdoubleC2F(Classlvalue)
(
〃攝氏到華氏的轉(zhuǎn)換公式
return1.8*value.C+32;
)
)
classProgram
(
staticvoidMain(string[]args)
{
ClassitmpObj=newClassl(37.5);
Console.WriteLine(tmpObj);
Console.WriteLine(tmpObj.Testi());
Console.WriteLine(tmpObj.Test2());
Console.ReadLine();
結(jié)果:
37.5Celsius=99.5Fahrenheit
Havethis.:4375MSEL
Don'thavethis.:4406MSEL
11.可以使用抽象函數(shù)重寫(xiě)基類(lèi)中的虛函數(shù)嗎?
答:
可以
需使用new修飾符顯式聲明,表示隱藏了基類(lèi)中該函數(shù)的實(shí)現(xiàn)
或增加override修飾符,表示抽象重寫(xiě)了基類(lèi)中該函數(shù)的實(shí)現(xiàn)
示例:
classBaseClass
(
publicvirtualvoidF()
(
Console.WriteLine("BaseClass.F");
abstractclassDeriveClassl:BaseClass
(
publicabstractnewvoidF();
〃是他提醒了我還可以用這種方法抽象重寫(xiě)基類(lèi)的虛方法
abstractclassDeriveClass2:BaseClass
(
publicabstractoverridevoidF();
)
12.密封類(lèi)可以有虛函數(shù)嗎?
答:
可以,基類(lèi)中的虛函數(shù)將隱式的轉(zhuǎn)化為非虛函數(shù),但密封類(lèi)本身不能再增加新的虛函數(shù)
示例:
classBaseClass
{
publicvirtualvoidF()
(
Console.WriteLine("BaseClass.F");
)
)
sealedclassDeriveClass:BaseClass
(
〃基類(lèi)中的虛函數(shù)F被隱式的轉(zhuǎn)化為非虛函數(shù)
〃密封類(lèi)中不能再聲明新的虛函數(shù)G
//publicvirtualvoidG()
//{
//Console.WriteLine("DeriveClass.G");
//)
13.什么是屬性訪(fǎng)問(wèn)器?
答:
屬性訪(fǎng)問(wèn)器(PropertyAccessor),包括get訪(fǎng)問(wèn)器和set訪(fǎng)問(wèn)器分別用于字段的讀寫(xiě)操作
其設(shè)計(jì)目的主要是為了實(shí)現(xiàn)面向?qū)ο螅?0)中的封裝思想。根據(jù)該思想,字段最好設(shè)為
private,一個(gè)精巧的類(lèi)最好不要直接把字段設(shè)為公有提供給客戶(hù)調(diào)用端直接訪(fǎng)問(wèn)
另外要注意屬性本身并不一定和字段相聯(lián)系
14.abstract可以和virtual一起使用嗎?可以和override一起使用嗎?
答:
abstract修飾符不可以和static>virtual修飾符一起使用
abstract修飾符可以和override一起使用,參見(jiàn)第11點(diǎn)
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample14
(
classBaseClass
(
publicvirtualvoidF()
(
Console.WriteLine("BaseClass.FH);
)
)
abstractclassDeriveClassl:BaseClass
(
〃在這里,abstract是可以和override一起使用的
publicabstractoverridevoidF();
)
classProgram
(
staticvoidMain(string[]args)
15.接口可以包含哪些成員?
答:
接口可以包含屬性、方法、索引指示器和事件,但不能包含常量、域、操作符、構(gòu)造函數(shù)和
析構(gòu)函數(shù),而且也不能包含任何靜態(tài)成員
16.類(lèi)和結(jié)構(gòu)的區(qū)別?
答:
類(lèi):
類(lèi)是引用類(lèi)型在堆上分配,類(lèi)的實(shí)例進(jìn)行賦值只是復(fù)制了引用,都指向同一段實(shí)際對(duì)象分配
的內(nèi)存
類(lèi)有構(gòu)造和析構(gòu)函數(shù)
類(lèi)可以繼承和被繼承
結(jié)構(gòu):
結(jié)構(gòu)是值類(lèi)型在棧上分配(雖然棧的訪(fǎng)問(wèn)速度比較堆要快,但棧的資源有限放),結(jié)構(gòu)的賦
值將分配產(chǎn)生一個(gè)新的對(duì)象。
結(jié)構(gòu)沒(méi)有構(gòu)造函數(shù),但可以添加。結(jié)構(gòu)沒(méi)有析構(gòu)函數(shù)
結(jié)構(gòu)不可以繼承自另一個(gè)結(jié)構(gòu)或被繼承,但和類(lèi)一樣可以繼承自接口
示例:
根據(jù)以上比較,我們可以得出一些輕量級(jí)的對(duì)象最好使用結(jié)構(gòu),但數(shù)據(jù)量大或有復(fù)雜處理邏
輯對(duì)象最好使用類(lèi)。
如:Geoemtry(GIS里的一個(gè)概論,在OGC標(biāo)準(zhǔn)里有定義)最好使用類(lèi),而Geometry中
點(diǎn)的成員最好使用結(jié)構(gòu)
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExample16
(
interfaceIPoint
(
doubleX
{
get;
set;
)
doubleY
(
get;
set;
}
doubleZ
(
get;
set;
)
)
〃結(jié)構(gòu)也可以從接口繼承
structPoint:IPoinl
privatedoublex,y,z;
〃結(jié)構(gòu)也可以增加構(gòu)造函數(shù)
publicPoint(doubleX,doubleY,doubleZ)
this.x=X;
this.y=Y;
this.z=Z;
)
publicdoubleX
(
get{returnx;}
set{x=value;}
)
publicdoubleY
(
get{returnx;}
set{x=value;)
)
publicdoubleZ
(
get{returnx;}
set{x=value;}
)
}
〃在此簡(jiǎn)化了點(diǎn)狀Geometry的設(shè)計(jì),實(shí)際產(chǎn)品中還包含Project(坐標(biāo)變換)等復(fù)雜操
作
classPointGeometry
(
privatePointvalue;
publicPointGeometry(doubleX,doubleY,doubleZ)
{
value=newPoint(X,Y,Z);
}
publicPointGeometry(Pointvalue)
(
〃結(jié)構(gòu)的賦值將分配新的內(nèi)存
this.value=value;
)
publicdoubleX
(
get{returnvalue.X;}
set{this.value.X=value;}
)
publicdoubleY
get{returnvalue.Y;}
set{this.value.Y=value;}
)
publicdoubleZ
(
get{returnvalue.Z;}
set{this.value.Z=value;}
)
publicstaticPointGeometryoperator+(PointGeometryLeft,PointGeometryRiglh)
(
returnnewPointGeometry(Left.X+Rigth.X,Left.Y+Rigth.Y,Left.Z+Rigth.Z);
)
publicoverridestringToStringO
(
returnstring.Format("X:{0},Y:{1},Z:{2}'\value.X,value.Y,value.Z);
)
)
classProgram
{
staticvoidMain(string[]args)
(
PointtmpPoint=newPoint(l,2,3);
PointGeometrytmpPG1=newPointGeometry(tmpPoint);
PointGeometrytmpPG2=newPointGeometry(tmpPoint);
tmpPG2.X=4;
tmpPG2.Y=5;
tmpPG2.Z=6;
//由于結(jié)構(gòu)是值類(lèi)型,tmpPG1和tmpPG2的坐標(biāo)并不一樣
Console.WriteLine(tmpPG1);
Console.WriteLine(tmpPG2);
//由于類(lèi)是引用類(lèi)型,對(duì)tmpPG1坐標(biāo)修改后影響到了tmpPG3
PointGeometrytmpPG3=tmpPG1;
tmpPGl.X=7;
tmpPGl.Y=8;
tmpPG1.Z=9;
Console.WriteLine(tmpPG1);
Console.WriteLine(tmpPG3);
Console.ReadLine();
結(jié)果:
X:1,Y:2,Z:3
X:4,Y:5,Z:6
X:7,Y:8,Z:9
X:7,Y:8,Z:9
17.接口的多繼承會(huì)帶來(lái)哪些問(wèn)題?
答:
C#中的接口與類(lèi)不同,可以使用多繼承,即一個(gè)子接口可以有多個(gè)父接口。但如果兩個(gè)父成員具有同名
的成員,就產(chǎn)生了二義性(這也正是C#中類(lèi)取消了多繼承的原因之一),這時(shí)在實(shí)現(xiàn)時(shí)最好使用顯式的
聲明
示例:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceExamplel7
(
classProgram
(
〃一個(gè)完整的接口聲明示例
interfaceIExample
(
〃屬性
stringP
get;
set;
}
〃方法
stringF(intValue);
〃事件
eventEventHandlerE;
〃索引指示器
stringthis[intIndex]
{
get;
set;
}
}
interfaceIA
(
intCount{get;set;}
I
interfaceIB
intCount();
//IC接口從IA和IB多重繼承
interfaceIC:1A,IB
(
}
classC:IC
(
privateintcount=100;
〃顯式聲明實(shí)現(xiàn)IA接口中的Count屬性
intIA.Count
{
get{return100;}
set{count=value;}
}
〃顯式聲明實(shí)現(xiàn)IB接口中的Count方法
intIB.Count()
(
returncount*count;
}
}
staticvoidMain(string[]args)
CtmpObj=newC();
〃調(diào)用時(shí)也要顯式轉(zhuǎn)換
Console.WriteLine(^Countproperty:{0}”,((IA)tmpObj).Count);
Console.WriteLine(*Countfunction:{0}”,((IB)tmpObj).Count());
Console.ReadLineO;
)
)
)
結(jié)果:
Countproperty:100
Countfunction:10000
18.抽象類(lèi)和接口的區(qū)別?
答:
抽象類(lèi)(abstractclass)可以包含功能定義和實(shí)現(xiàn),接口(interface)只能包含功能定義
抽象類(lèi)是從一系列相關(guān)對(duì)象中抽象出來(lái)的概念,因此反映的是事物的內(nèi)部共性;接口是為了滿(mǎn)足外部調(diào)用
而定義的一個(gè)功能約定,因此反映的是事物的外部特性
分析對(duì)象,提煉內(nèi)部共性形成抽象類(lèi),用以表示對(duì)象本質(zhì),即''是什么〃
為外部提供調(diào)用或功能需要擴(kuò)充時(shí)優(yōu)先使用接口
19.別名指示符是什么?
答:
通過(guò)別名指示符我們可以為某個(gè)類(lèi)型起一個(gè)別名
主要用于解決兩個(gè)命名空間內(nèi)有同名類(lèi)型的沖突或避免使用冗余的命名空間
別名指示符在所有命名空間最外層定義,作用域?yàn)檎麄€(gè)單元文件。如果定義在某個(gè)命名空間內(nèi),那么它只
在直接隸屬的命名空間內(nèi)起作用
示例:
Classi.cs:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespace
com.nblogs.reonlyrun.CSharp25QExample.Example19.LibOl
(
classCla
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 昆明2025年云南昆明市生態(tài)環(huán)境局所屬事業(yè)單位引進(jìn)高層次人才筆試歷年參考題庫(kù)附帶答案詳解
- 2025年中國(guó)雙人翻轉(zhuǎn)座椅骨架市場(chǎng)調(diào)查研究報(bào)告
- 廣西2025年廣西合浦儒艮國(guó)家級(jí)自然保護(hù)區(qū)管理中心招聘筆試歷年參考題庫(kù)附帶答案詳解
- 2025至2031年中國(guó)鋁合金絲編織管行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)精密交流脈沖焊接機(jī)行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)玻璃衛(wèi)浴產(chǎn)品行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)汽車(chē)前大燈鏡片行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 惠州2025年廣東惠州龍門(mén)縣市容環(huán)境衛(wèi)生事務(wù)中心招聘編外環(huán)衛(wèi)工人14人筆試歷年參考題庫(kù)附帶答案詳解
- 2025年平移大門(mén)驅(qū)動(dòng)系統(tǒng)項(xiàng)目可行性研究報(bào)告
- 2025年合金鋼襯項(xiàng)目可行性研究報(bào)告
- 2024-2025年中國(guó)專(zhuān)網(wǎng)通信行業(yè)市場(chǎng)前景預(yù)測(cè)及投資戰(zhàn)略研究報(bào)告
- 二零二五年度能源行業(yè)員工勞動(dòng)合同標(biāo)準(zhǔn)范本3篇
- 培訓(xùn)課件:律師客戶(hù)溝通技巧
- 2025年春新外研版(三起)英語(yǔ)三年級(jí)下冊(cè)課件 Unit5第1課時(shí)Startup
- 2025年春新外研版(三起)英語(yǔ)三年級(jí)下冊(cè)課件 Unit1第2課時(shí)Speedup
- 2024年石柱土家族自治縣中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 西藏事業(yè)單位c類(lèi)歷年真題
- 部編版語(yǔ)文小學(xué)二年級(jí)下冊(cè)第一單元集體備課(教材解讀)
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳畫(huà)冊(cè)
- (中外歷史綱要下)歷史 第三單元 大單元教學(xué)設(shè)計(jì)與單元評(píng)價(jià)
- 人民醫(yī)院診斷證明書(shū)
評(píng)論
0/150
提交評(píng)論