




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
当初学C#时是找个人大概问了一下数据类型和分支语句就开始做项目了。这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题: 1.静态变量和非静态变量的区别? 2.const和staticreadonly区别? 3.extern是什么意思? 4.abstract是什么意思? 5.internal修饰符起什么作用? 6.sealed修饰符是干什么的? 7.override和overload的区别? 8.什么是索引指示器? 9.new修饰符是起什么作用? 10.this关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗? 12.密封类可以有虚函数吗? 13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有get和set两个呢? 14.abstract可以和virtual一起使用吗?可以和override一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的区别? 17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别? 19.别名指示符是什么? 20.如何释放非托管资源? 21.P/Invoke是什么? 22.StringBuilder和String的区别? 23.explicit和implicit的含义? 24.params有什么用? 25.什么是反射? 以下是我做的一份参考答案(C#语言范畴之内),如果有不准确、不全面的,欢迎各位朋友指正! 1.静态变量和非静态变量的区别? 答: 静态变量: 静态变量使用static修饰符进行声明 在所属类被装载时创建 通过类进行访问 所属类的所有实例的同一静态变量都是同一个值 非静态变量: 不带有static修饰符声明的变量称做非静态变量 在类被实例化时创建 通过对象进行访问 同一个类的不同实例的同一非静态变量可以是不同的值 示例: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample01 classProgram classClass1 publicstaticStringstaticStr=Class; publicStringnotstaticStr=Obj; staticvoidMain(stringargs) /静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值 Console.WriteLine(Class1sstaticStr:0,Class1.staticStr); Class1tmpObj1=newClass1(); tmpObj1.notstaticStr=tmpObj1; Class1tmpObj2=newClass1(); tmpObj2.notstaticStr=tmpObj2; /非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值 Console.WriteLine(tmpObj1snotstaticStr:0,tmpObj1.notstaticStr); Console.WriteLine(tmpObj2snotstaticStr:0,tmpObj2.notstaticStr); Console.ReadLine(); 结果: Class1sstaticStr:Class tmpObj1snotstaticStr:tmpObj1 tmpObj2snotstaticStr:tmpObj2 2.const和staticreadonly区别? 答: const 用const修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序 staticreadonly 用staticreadonly修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化 示例: 测试类: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample02Lib publicclassClass1 publicconstStringstrConst=Const; publicstaticreadonlyStringstrStaticReadonly=StaticReadonly; /publicconstStringstrConst=ConstChanged; /publicstaticreadonlyStringstrStaticReadonly=StaticReadonlyChanged; 客户端代码: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingExample02Lib; namespaceExample02 classProgram staticvoidMain(stringargs) /修改Example02中Class1的strConst初始值后,只编译Example02Lib项目 /然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录,执行Example02.exe /切不可在IDE里直接调试运行因为这会重新编译整个解决方案! /可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变 /表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的 Console.WriteLine(strConst:0,Class1.strConst); Console.WriteLine(strStaticReadonly:0,Class1.strStaticReadonly); Console.ReadLine(); 结果: strConst:Const strStaticReadonly:StaticReadonly 修改后的示例: 测试类: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample02Lib publicclassClass1 /publicconstStringstrConst=Const; /publicstaticreadonlyStringstrStaticReadonly=StaticReadonly; publicconstStringstrConst=ConstChanged; publicstaticreadonlyStringstrStaticReadonly=StaticReadonlyChanged; 结果 strConst:Const strStaticReadonly:StaticReadonlyChanged 3.extern是什么意思? 答: extern修饰符用于声明由程序集外部实现的成员函数 经常用于系统API函数的调用(通过DllImport)。注意,和DllImport一起使用时要加上static修饰符 也可以用于对于同一程序集不同版本组件的调用(用extern声明别名) 不能与abstract修饰符同时使用 示例: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Runtime.InteropServices; namespaceExample03 classProgram /注意DllImport是一个AttributeProperty,在System.Runtime.InteropServices命名空间中定义 /extern与DllImport一起使用时必须再加上一个static修饰符 DllImport(User32.dll) publicstaticexternintMessageBox(intHandle,stringMessage,stringCaption,intType); staticintMain() stringmyString; Console.Write(Enteryourmessage:); myString=Console.ReadLine(); returnMessageBox(0,myString,MyMessageBox,0); 结果: 4.abstract是什么意思? 答: abstract修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员 abstract不可以和static、virtual、override一起使用 声明为abstract成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,通常用于强制继承类必须实现某一成员 示例: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample04 #region基类,抽象类 publicabstractclassBaseClass /抽象属性,同时具有get和set访问器表示继承类必须将该属性实现为可读写 publicabstractStringAttribute get; set; /抽象方法,传入一个字符串参数无返回值 publicabstractvoidFunction(Stringvalue); /抽象事件,类型为系统预定义的代理(delegate):EventHandler publicabstracteventEventHandlerEvent; /抽象索引指示器,只具有get访问器表示继承类必须将该索引指示器实现为只读 publicabstractCharthisintIndex get; #endregion #region继承类 publicclassDeriveClass:BaseClass privateStringattribute; publicoverrideStringAttribute get returnattribute; set attribute=value; publicoverridevoidFunction(Stringvalue) attribute=value; if(Event!=null) Event(this,newEventArgs(); publicoverrideeventEventHandlerEvent; publicoverrideCharthisintIndex get returnattributeIndex; #endregion classProgram staticvoidOnFunction(objectsender,EventArgse) for(inti=0;i(DeriveClass)sender).Attribute.Length;i+) Console.WriteLine(DeriveClass)sender)i); staticvoidMain(stringargs) DeriveClasstmpObj=newDeriveClass(); tmpObj.Attribute=1234567; Console.WriteLine(tmpObj.Attribute); /将静态函数OnFunction与tmpObj对象的Event事件进行关联 tmpObj.Event+=newEventHandler(OnFunction); tmpObj.Function(7654321); Console.ReadLine(); 结果: 1234567 7 6 5 4 3 2 1 5.internal修饰符起什么作用? 答: internal修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程集内访问 接口的成员不能使用internal修饰符 示例 Example05Lib项目的Class1 usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample05Lib publicclassClass1 internalStringstrInternal=null; publicStringstrPublic; 结果 Example05Lib项目的Class2类可以访问到Class1的strInternal成员 Example05项目的Program类无法访问到Class1的strInternal成员 6.sealed修饰符是干什么的? 答: sealed修饰符表示密封 用于类时,表示该类不能再被继承,不能和abstract同时使用,因为这两个修饰符在含义上互相排斥 用于方法和属性时,表示该方法或属性不能再被继承,必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员 通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱 恰当的利用sealed修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员 示例: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample06 classProgram classA publicvirtualvoidF() Console.WriteLine(A.F); 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(stringargs) newA().F(); newA().G(); newB().F(); newB().G(); newC().F(); newC().G(); Console.ReadLine(); 结果: 类B在继承类A时可以重写两个虚函数,如图所示: 由于类B中对F方法进行了密封,类C在继承类B时只能重写一个函数,如图所示: 控制台输出结果,类C的方法F只能是输出类B中对该方法的实现: A.F A.G B.F B.G B.F C.G 7.override和overload的区别? 答: override表示重写,用于继承类对基类中虚成员的实现 overload表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现 示例: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample07 classProgram classBaseClass publicvirtualvoidF() Console.WriteLine(BaseClass.F); classDeriveClass:BaseClass publicoverridevoidF() base.F(); Console.WriteLine(DeriveClass.F); publicvoidAdd(intLeft,intRight) Console.WriteLine(AddforInt:0,Left+Right); publicvoidAdd(doubleLeft,doubleRight) Console.WriteLine(Addforint:0,Left+Right); staticvoidMain(stringargs) DeriveClasstmpObj=newDeriveClass(); tmpObj.F(); tmpObj.Add(1,2); tmpObj.Add(1.1,2.2); Console.ReadLine(); 结果: BaseClass.F DeriveClass.F AddforInt:3 Addforint:3.3 8.什么是索引指示器? 答: 实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int 简单来说,其本质就是一个含参数属性 示例: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample08 publicclassPoint privatedoublex,y; publicPoint(doubleX,doubleY) x=X; y=Y; /重写ToString方法方便输出 publicoverridestringToString() returnString.Format(X:0,Y:1,x,y); publicclassPoints Pointpoints; publicPoints(PointPoints) points=Points; publicintPointNumber get returnpoints.Length; /实现索引访问器 publicPointthisintIndex get returnpointsIndex; /感谢watsonhua(/)的指点 /索引指示器的实质是含参属性,参数并不只限于int classWeatherOfWeek publicstringthisintIndex get /注意case段使用return直接返回所以不需要break switch(Index) case0: returnTodayiscloudy!; case5: returnTodayisthundershower!; default: returnTodayisfine!; publicstringthisstringDay get stringTodayWeather=null; /switch的标准写法 switch(Day) caseSunday: TodayWeather=Todayiscloudy!; break; caseFriday: TodayWeather=Todayisthundershower!; break; default: TodayWeather=Todayisfine!; break; returnTodayWeather; classProgram staticvoidMain(stringargs) PointtmpPoints=newPoint10; for(inti=0;itmpPoints.Length;i+) tmpPointsi=newPoint(i,Math.Sin(i); PointstmpObj=newPoints(tmpPoints); for(inti=0;itmpObj.PointNumber;i+) Console.WriteLine(tmpObji); stringWeek=newstringSunday,Monday,Tuesday,Wednesday,Thursday,Friday,Staurday; WeatherOfWeektmpWeatherOfWeek=newWeatherOfWeek(); for(inti=0;i6;i+) Console.WriteLine(tmpWeatherOfWeeki); foreach(stringtmpDayinWeek) Console.WriteLine(tmpWeatherOfWeektmpDay); Console.ReadLine(); 结果: 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操作符是两个概念 new修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。而new操作符用于实例化一个类型 new修饰符只能用于继承类,一般用于弥补基类设计的不足 new修饰符和override修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥 示例: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample09 classBaseClass /基类设计者声明了一个PI的公共变量,方便进行运算 publicstaticdoublePI=3.1415; classDervieClass:BaseClass /继承类发现该变量的值不能满足运算精度,于是可以通过new修饰符显示隐藏基类中的声明 publicnewstaticdoublePI=3.1415926; classProgram staticvoidMain(stringargs) Console.WriteLine(BaseClass.PI); Console.WriteLine(DervieClass.PI); Console.ReadLine(); 结果: 3.1415 3.1415926 10.this关键字的含义? 答: this是一个保留字,仅限于构造函数和方法成员中使用 在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用,在结构的构造上函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用 this保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化 在C#系统中,this实际上是一个常量,所以不能使用this+这样的运算 this保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身 示例: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceExample10 classClass1 privatedoublec; privatestringvalue; publicdoubleC get returnc; publicClass1(doublec) /限定同名的隐藏成员 this.c=c; publicClass1(Class1value) /用对象本身实例化自己没有意义 if(this!=value) c=value.C; publicoverridestringToString() /将对象本身做为参数 returnstring.Format(0Celsius=1Fahrenheit,c,UnitTransClass.C2F(this); /由于好奇,在这做了一个效率测试,想看看到底哪种方式访问成员变量更快,结论:区别不大。 publicstringTest1() longvTickCount=Environment.TickCount; for(inti=0;i10000000;i+) this.value=i.ToString(); returnstring.Format(Havethis.:0MSEL,Environment.TickCount-vTickCount); publicstringTest2() longvTickCount=Environment.TickCount; for(inti=0;i10000000;i+) value=i.ToString(); returnstring.Format(Donthavethis.:0MSEL,Environment.TickCount-vTickCount); classUnitTransClass publicstaticdoubleC2F(Class1value) /摄氏到华氏的转换公式 return1.8*value.C+32; classProgram staticvoidMain(stringargs) Class1tmpObj=newClass1(37.5); Console.WriteLine(tmpObj); Console.WriteLine(tmpObj.Test1(); Console.WriteLine(tmpObj.Test2(); Console.ReadLine(); 结果: 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 实习和工作补充协议编写指南3篇
- 安全授权代表委托书3篇
- 出版行业劳动合同英文版3篇
- 家具家装材料购销合同3篇
- 废旧铁料买卖协议3篇
- 悔过保证书怎么写3篇
- 装饰公司述职报告大全7篇
- 2025年安全生产工作总结(16篇)
- 少先队工作总结
- 工作成果保证信范文3篇
- 2023年小型水库雨水情测报和大坝安全监测设施项目-实施方案
- (2024年)面神经炎课件完整版
- 减盐减油健康教育教案反思
- 特斯拉国产供应链研究报告
- 如何进行医疗垃圾的安全运输
- 公共停车场建设项目可行性研究报告
- 保安服务标准及工作流程
- 2024年中考数学几何模型归纳(全国通用):18 全等与相似模型之十字模型(学生版)
- 外科疾病分级目录
- 国家级教学成果的培育提炼与申报
- 海南师范大学《高等数学》2020-2021期末试卷B
评论
0/150
提交评论