《C程序员面试必答12083.docx》由会员分享,可在线阅读,更多相关《C程序员面试必答12083.docx(43页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、C# 程序员面试必答1.静态变变量和非静静态变量的的区别? 答: 静静态变量: 静态变变量使用 stattic 修修饰符进行行声明 在在所属类被被装载时创创建 通过过类进行访访问 所属属类的所有有实例的同同一静态变变量都是同同一个值 非静态变变量: 不不带有 sstatiic 修饰饰符声明的的变量称做做非静态变变量 在类类被实例化化时创建 通过对象象进行访问问 同一个个类的不同同实例的同同一非静态态变量可以以是不同的的值 示例例:usingg Sysstem;usingg Sysstem.Colllectiions.Geneeric;usingg Sysstem.Textt;namesspac
2、ee Exaamplee01 cclasss Proogramm cclasss Claass1 ppubliic sttaticc Strring statticSttr = &p;quoot;Cllass"t; ppubliic Sttringg nottstatticSttr = &p;quoot;Obbj&ammp;quuot; sstatiic vooid MMain(striing arggs) /静态变变量通过类类进行访问问,该类所所有实例的的同一静态态变量都是是同一个值值 CConsoole.WWriteeLinee(&ammp;quuot;CCla
3、sss1s statticSttr: 0&aamp;qquot;, Cllass11.staaticSStr); CClasss1 tmmpObjj1 = new Classs1(); ttmpObbj1.nnotsttaticcStr = &aamp;qquot;tmpOObj1"t; CClasss1 tmmpObjj2 = new Classs1(); ttmpObbj2.nnotsttaticcStr = &aamp;qquot;tmpOObj2"t; /非静态态变量通过过对象进行行访问,不不同对象的的同一非静静态变量可可以有不同同的值 CConsool
4、e.WWriteeLinee(&ammp;quuot;ttmpObbj1ss nottstatticSttr: 0&aamp;qquot;, tmmpObjj1.nootstaaticSStr); CConsoole.WWriteeLinee(&ammp;quuot;ttmpObbj2ss nottstatticSttr: 0&aamp;qquot;, tmmpObjj2.nootstaaticSStr); CConsoole.RReadLLine(); 复制代码结果: CClasss1s statticSttr: CClasss tmppObj11s nnotsttaticcStr: tmp
5、pObj11 tmppObj22s nnotsttaticcStr: tmppObj22 2.cconstt 和 sstatiic reeadonnly 区区别? 答答: coonst 用 coonst 修饰符声声明的成员员叫常量,是是在编译期期初始化并并嵌入到客客户端程序序 staatic readdonlyy 用 sstatiic reeadonnly 修修饰符声明明的成员依依然是变量量,只不过过具有和常常量类似的的使用方法法:通过类类进行访问问、初始化化后不可以以修改。但但与常量不不同的是这这种变量是是在运行期期初始化 示例: 测试类:usingg Sysstem;usingg Syss
6、tem.Colllectiions.Geneeric;usingg Sysstem.Textt;namesspacee Exaamplee02Liib ppubliic cllass Classs1 ppubliic coonst Striing sstrCoonst = &aamp;qquot;Consst&ammp;quuot; ppubliic sttaticc reaadonlly Sttringg strrStatticReeadonnly = &ammp;quuot;SStatiicReaadonlly&ammp;quuot; /pubblic consst Sttringg st
7、rrConsst = &p;quoot;Coonst Channged"t; /pubblic stattic rreadoonly Striing sstrSttaticcReaddonlyy = "t;StaaticRReadoonly Channged"t; /5-1-a-s-p-x复制代码客户端代码码:usingg Sysstem;usingg Sysstem.Colllectiions.Geneeric;usingg Sysstem.Textt;usingg Exaamplee02Liib;namesspacee Exaample
8、e02 cclasss Proogramm sstatiic vooid MMain(striing arggs) /修改EExampple022中Claass1的的strCConstt初始值后后,只编译译Exammple002Libb项目 /然后到到资源管理理器里把新新编译的EExampple022Lib.dll拷拷贝Exaamplee02.eexe所在在的目录,执执行Exaamplee02.eexe /切不可可在IDEE里直接调调试运行因因为这会重重新编译整整个解决方方案! /可以看看到strrConsst的输出出没有改变变,而sttrStaaticRReadoonly的的输出已经经改变
9、/表明CConstt变量是在在编译期初初始化并嵌嵌入到客户户端程序,而而StatticReeadonnly是在在运行时初初始化的 CConsoole.WWriteeLinee(&ammp;quuot;sstrCoonst : 00&ammp;quuot;, Claass1.strCConstt); CConsoole.WWriteeLinee(&ammp;quuot;sstrSttaticcReaddonlyy : 0&aamp;qquot;, Cllass11.strrStatticReeadonnly); CConsoole.RReadLLine(); 复制代码结果: sstrCoonst
10、 : Coonst strSStatiicReaadonlly : StatticReeadonnly 修修改后的示示例: 测测试类:usingg Sysstem;usingg Sysstem.Colllectiions.Geneeric;usingg Sysstem.Textt;namesspacee Exaamplee02Liib ppubliic cllass Classs1 /pubblic consst Sttringg strrConsst = &p;quoot;Coonst"t; /pubblic stattic rreadoonly Striing sst
11、rSttaticcReaddonlyy = "t;StaaticRReadoonly"t; ppubliic coonst Striing sstrCoonst = &aamp;qquot;Consst Chhangeed&ammp;quuot; ppubliic sttaticc reaadonlly Sttringg strrStatticReeadonnly = &ammp;quuot;SStatiicReaadonlly Chhangeed&ammp;quuot; 复制代码结果 sttrConnst : Connst sstrSttaticcReaddo
12、nlyy : SStatiicReaadonlly Chhangeed 3.exteern 是是什么意思思? 答: exttern 修饰符用用于声明由由程序集外外部实现的的成员函数数 经常用用于系统AAPI函数数的调用(通通过 DlllImpport )。注意意,和DlllImpport一一起使用时时要加上 stattic 修修饰符 也也可以用于于对于同一一程序集不不同版本组组件的调用用(用 eexterrn 声明明别名) 不能与 absttractt 修饰符符同时使用用51asspx 示示例:usingg Sysstem;usingg Sysstem.Colllectiions.Geneer
13、ic;usingg Sysstem.Textt;usingg Sysstem.Runttime.InteeropSServiices;namesspacee Exaamplee03 cclasss Proogramm /注意DDllImmportt是一个AAttriibutee Proopertty,在SSysteem.Ruuntimme.InnteroopSerrvicees命名空空间中定义义 /exttern与与DllIImporrt一起使使用时必须须再加上一一个staatic修修饰符 DllIImporrt(&aamp;qquot;Userr32.ddll&aamp;qquot;) pp
14、ubliic sttaticc exttern int MesssageBBox(iint HHandlle, sstrinng Meessagge, sstrinng Caaptioon, iint TType); sstatiic innt Maain() sstrinng myyStriing; CConsoole.WWritee(&ammp;quuot;EEnterr youur meessagge: "t;); mmyStrring = Coonsolle.ReeadLiine(); rreturrn MeessaggeBoxx(0, mySttringg, &aam
15、p;qquot;My MMessaage BBox&aamp;qquot;, 0); 复制代码结果: 44.absstracct 是什什么意思? 答: absttractt 修饰符符可以用于于类、方法法、属性、事事件和索引引指示器(iindexxer),表表示其为抽抽象成员 absttractt 不可以以和 sttaticc 、viirtuaal 、ooverrride 一起使用用 声明为为 absstracct 成员员可以不包包括实现代代码,但只只有类中还还有未实现现的抽象成成员,该类类就不可以以被实例化化,通常用用于强制继继承类必须须实现某一一成员 示示例:usingg Sysstem;u
16、singg Sysstem.Colllectiions.Geneeric;usingg Sysstem.Textt;namesspacee Exaamplee04 #regiion 基基类,抽象象类 ppubliic abbstraact cclasss BasseClaass /抽象属属性,同时时具有geet和seet访问器器表示继承承类必须将将该属性实实现为可读读写 ppubliic abbstraact SStrinng Atttribbute gget; sset; /抽象方方法,传入入一个字符符串参数无无返回值 ppubliic abbstraact vvoid Funcctionn
17、(Strring valuue); /抽象事事件,类型型为系统预预定义的代代理(deelegaate):EvenntHanndlerr ppubliic abbstraact eeventt EveentHaandleer Evvent; /抽象索索引指示器器,只具有有get访访问器表示示继承类必必须将该索索引指示器器实现为只只读 ppubliic abbstraact CChar thissintt Inddex gget; #endrregioon #regiion 继继承类 ppubliic cllass DeriiveCllass : BaaseCllass pprivaate SSt
18、rinng atttribbute; ppubliic ovverriide SStrinng Atttribbute gget rreturrn atttribbute; sset aattriibutee = vvaluee; ppubliic ovverriide vvoid Funcctionn(Strring valuue) aattriibutee = vvaluee; iif (EEventt != nulll) EEventt(thiis, nnew EEventtArgss(); ppubliic ovverriide eeventt EveentHaandleer Evve
19、nt; ppubliic ovverriide CChar thissintt Inddex gget rreturrn atttribbuteIndeex; #endrregioon cclasss Proogramm sstatiic vooid OOnFunnctioon(obbjectt sennder, EveentArrgs ee) ffor (int i = 0; ii (DerriveCClasss)sennder).Atttribuute.LLengtth; ii+) CConsoole.WWriteeLinee(DDerivveClaass)ssendeer)ii); ss
20、tatiic vooid MMain(striing arggs) DDerivveClaass ttmpObbj = new DeriiveCllass(); ttmpObbj.Atttribbute = &aamp;qquot;12344567"t; CConsoole.WWriteeLinee(tmppObj.Attrributte); /将静态态函数OnnFuncctionn与tmppObj对对象的Evvent事事件进行关关联 ttmpObbj.Evvent += nnew EEventtHanddler(OnFuunctiion); ttmpObbj.Fuunctii
21、on("t;765543211&p;quoot;); CConsoole.RReadLLine(); 复制代码结果: 112345567 77 6 55 4 33 2 11 5.iinterrnal 修饰符起起什么作用用? 答: intternaal 修饰饰符可以用用于类型或或成员,使使用该修饰饰符声明的的类型或成成员只能在在同一程集集内访问 接口的成成员不能使使用 innternnal 修修饰符 示示例 Exxamplle05LLib 项项目的 CClasss1usingg Sysstem;usingg Sysstem.Colllectiions.Geneeric;us
22、ingg Sysstem.Textt;namesspacee Exaamplee05Liib ppubliic cllass Classs1 iinterrnal Striing sstrInnternnal = nulll; ppubliic Sttringg strrPubllic; 复制代码结果 Exxamplle05LLib 项项目的 CClasss2 类可可以访问到到 Claass1 的 sttrIntternaal 成员员 Exaamplee05 项项目的 PProgrram 类类无法访问问到 Cllass11 的 sstrInnternnal 成成员 6.sealled 修修饰符
23、是干干什么的? 答: sealled 修修饰符表示示密封 用用于类时,表表示该类不不能再被继继承,不能能和 abbstraact 同同时使用,因因为这两个个修饰符在在含义上互互相排斥 用于方法法和属性时时,表示该该方法或属属性不能再再被继承,必必须和 ooverrride 关键字一一起使用,因因为使用 sealled 修修饰符的方方法或属性性肯定是基基类中相应应的虚成员员 通常用用于实现第第三方类库库时不想被被客户端继继承,或用用于没有必必要再继承承的类以防防止滥用继继承造成层层次结构体体系混乱 恰当的利利用 seealedd 修饰符符也可以提提高一定的的运行效率率,因为不不用考虑继继承类会重
24、重写该成员员 示例:usingg Sysstem;usingg Sysstem.Colllectiions.Geneeric;usingg Sysstem.Textt;namesspacee Exaamplee06 cclasss Proogramm cclasss A ppubliic viirtuaal vooid FF() CConsoole.WWriteeLinee(&ammp;quuot;AA.F&aamp;qquot;); ppubliic viirtuaal vooid GG() CConsoole.WWriteeLinee(&ammp;quuot;AA.G&aamp;qquot
25、;); cclasss B : A ppubliic seealedd oveerridde vooid FF() CConsoole.WWriteeLinee(&ammp;quuot;BB.F&aamp;qquot;); ppubliic ovverriide vvoid G() CConsoole.WWriteeLinee(&ammp;quuot;BB.G&aamp;qquot;); cclasss C : B ppubliic ovverriide vvoid G() CConsoole.WWriteeLinee(&ammp;quuot;CC.G&aamp;qquot;); sstati
26、ic vooid MMain(striing arggs) nnew AA().FF(); nnew AA().GG(); nnew BB().FF(); nnew BB().GG(); nnew CC().FF(); nnew CC().GG(); CConsoole.RReadLLine(); 复制代码结果: 类类 B 在在继承类 A 时可可以重写两两个虚函数数,如图所所示: 由由于类 BB 中对 F 方法法进行了密密封, 类类 C 在在继承类 B 时只只能重写一一个函数,如如图所示: 控制台台输出结果果,类 CC 的方法法 F 只只能是输出出 类B 中对该方方法的实现现: A.F A.G
27、 B.F B.G B.F C.G 7.overrridee 和 ooverlload 的区别? 答: overrridee 表示重重写,用于于继承类对对基类中虚虚成员的实实现 ovverlooad 表表示重载,用用于同一个个类中同名名方法不同同参数(包包括类型不不同或个数数不同)的的实现 示示例:usingg Sysstem;usingg Sysstem.Colllectiions.Geneeric;usingg Sysstem.Textt;namesspacee Exaamplee07 cclasss Proogramm cclasss BasseClaass ppubliic viirtu
28、aal vooid FF() CConsoole.WWriteeLinee(&ammp;quuot;BBaseCClasss.F&aamp;qquot;); cclasss DerriveCClasss : BBaseCClasss ppubliic ovverriide vvoid F() bbase.F(); CConsoole.WWriteeLinee(&ammp;quuot;DDerivveClaass.FF&p;quoot;); ppubliic vooid AAdd(iint LLeft, intt Rigght) CConsoole.WWriteeLinee(&ammp;q
29、uuot;AAdd ffor IInt: 0"t;, LLeft + Riight); ppubliic vooid AAdd(ddoublle Leeft, doubble RRightt) CConsoole.WWriteeLinee(&ammp;quuot;AAdd ffor iint: 0"t;, LLeft + Riight); sstatiic vooid MMain(striing arggs) DDerivveClaass ttmpObbj = new DeriiveCllass(); ttmpObbj.F(); ttmpObbj.Addd(1,
30、 2); ttmpObbj.Addd(1.1, 22.2); CConsoole.RReadLLine(); 复制代码结果: BBaseCClasss.F DDerivveClaass.FF Addd forr Intt: 3 Add for int: 3.33 8.什什么是索引引指示器? 答: 实现索引引指示器(iindexxer)的的类可以象象数组那样样使用其实实例后的对对象,但与与数组不同同的是索引引指示器的的参数类型型不仅限于于int 简单来说说,其本质质就是一个个含参数属属性 示例例:usingg Sysstem;usingg Sysstem.Colllectiions.Geneer
31、ic;usingg Sysstem.Textt;namesspacee Exaamplee08 ppubliic cllass Poinnt pprivaate ddoublle x, y; ppubliic Pooint(doubble XX, dooublee Y) xx = XX; yy = YY; /重写TToStrring方方法方便输输出 ppubliic ovverriide sstrinng TooStriing() rreturrn Sttringg.Forrmat(&p;quoot;X: 0 , YY: 11&ammp;quuot;, x, y); ppubliic c
32、llass Poinnts PPointt ppointts; ppubliic Poointss(Poiint Poiints) ppointts = Poinnts; ppubliic innt PoointNNumbeer gget rreturrn poointss.Lenngth; /实现索索引访问器器 ppubliic Pooint thissintt Inddex gget rreturrn poointssInddex; /感谢wwatsoon huua(htttp:/huaazhihhao.ccnbloogs.ccom/)的指点 /索引指指示器的实实质是含参参属性,参参数并不
33、只只限于innt cclasss WeaatherrOfWeeek ppubliic sttringg thiisinnt Inndex gget /注意ccase段段使用reeturnn直接返回回所以不需需要breeak sswitcch (IIndexx) ccase 0: retuurn "t;Todday iis clloudyy!&ammp;quuot; ccase 5: rreturrn &aamp;qquot;Todaay iss thuunderrshowwer!"t; ddefauult: rreturrn &aamp;qquot;Todaay iss finne!&aamp;qquot; ppubliic sttringg thiissttringg Dayy gget sstrinng ToodayWWeathher = nulll; /swiitch的的标准写法法 sswitcch (DDay) ccase &p;quoot;Suundayy&p;quoot;: TTodayyWeatther = &aamp;qquot;Todaay iss clooudy!&p;quoot; bbreakk; ccase &p;quoot;Frridayy&p;quoot;
限制150内