




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#程序员参考手册知识点精选 1. 默认的命名空间命名空间是C#类、接口、委托、枚举和其他类型的一种逻辑上的组合。如果您没有定义自己的命名空间,代码会自动放入一个没有名称的全局命名空间中。命名空间的第一部分通常是一个公司或组织的名称,第二部分应该是相关技术的名称,后面跟可选的特性和设计名。比如,如果您在Acme Engines Corporation工作,您可以这样定义您好的命名空间:AcmeEngines.FuelInjector.Diesel。2. 类的默认访问控制符internal类有四种访问属性:internal、private、protected和public。在命名空间中声明的类只能有pubic或internal访问属性。没有指定访问修饰符时,类的访问类型默认为internal,即该类只能从同一个程序集(assembly)的其它类中访问。让我们来看看当类不指定访问修饰符时,其它程序集中的类对它的访问情况。首先在名为Quad.cs文件中定义一个Quad类,然后在名为Test.cs中定义一个Test类。我们试图在Test类中使用Quad类的一个实例。两个类的定义如下: Quad.cs文件的内容为:usingSystem;classQuaddoublewidth,height;publicQuad(doublew,doubleh)width=w;height=h;publicdoubleGetArea()returnwidth*height;Test.cs文件的内容为:usingSystem;public classTestpublicstaticvoidMain()Quadq=newQuad(2.0,3.0);Console.WriteLine(Areais0,q.GetArea();为了测试,我们将Quad.cs文件单独编译成.dll文件。方法是:第一步:把Quad.cs文件复制到安装的目录下面,即与C#编译器控制台csc.exe处于同一目录。笔者的系统装在D盘,所以把Quad.cs文件复制到D:WINDOWSMicrosoft.NETFrameworkv1.1.4322目录下面。 第二步:打开命令窗口-输入cmd到控制台-cd D:WINDOWSMicrosoft.NETFrameworkv1.1.4322转到安装的该目录下。第三步:执行csc命令csc /target:library Quad.cs把程序Quad.cs编译为一个库文件Quad.dll对文件Test.cs首先作第一步和第二步处理。由于Test类使用了Quad类的一个实例。要访问该类,使用下面的语法编译Test类:csc /Test.cs /reference:Quad.dll。但是,您会得到下面的错误信息: Test.cs(7,9):error CS0122:不可访问“Quad”,因为它受保护级别限制。Test.cs(8,42):error CS0246:找不到类型或命名空间名称“q”(是否缺少using指令或程序集引用?)这是因为Quad类和Test类位于不同的程序集中,而且Quad类是内部访问方式,所以Test类不能访问它。要解决这个问题,用public修改符定义Quad类就可以了:usingSystem;publicclassQuaddoublewidth,height;publicQuad(doublew,doubleh)width=w;height=h;publicdoubleGetArea()returnwidth*height;3. 三种方法创建一个类实例类的实例是一个引用类型的变量。因此,对象存放在堆中。实例化对象主要有三种方法: (1)使用new关键字。new关键字的作用是调用一个称为构造函数的特殊函数。要创建一个Test类的实例,可输入:Test mytest=new Test(); 这个语法实际上是把两个语句合二为一。语句的第一部分Test mytest创建一个Test类型的引用,名为mytest。语句的第二部分=new Test();创建一个与引用相关的Test对象,并调用没有参数的Test类的构造函数初始化该对象。(2) 有些类可能没有可访问的构造函数,这种情况下就不能用构造函数来实例化该对象。这些对象的实例一般是在.NET Framework的方法内部创建,这些方法返回对类实例的引用。例如:File类的Create()方法(一个静态方法)返回对FileStream对象的引用。可以用语法:FileStream fs=File.Create(data.inp);对一个名为data.inp的文件实例化一个FileStream对象。 (3) 实例化对象还有一种方式使用反射。我们可以使用System.Type类动态检索具体类型的ConstructorInfo对象,并调用它检索类的一个实例。例如:给定一个ReflectTest类,它有一个公有的、无参数的构造函数: publicclassReflectTestpublicReflectTest()可使用下面的代码实例化该类: usingSystem;usingSystem.Reflection;publicclassReflectTestpublicReflectTest()publicclassApplication/GettheTypeobjectfortheReflectTestclassTypet=Type.GetType(ReflectTest);/GettheparameterlessconstructorfortheclassConstructorInfoctor=t.GetConstructor(System.Type.EmptyTypes);/InvoketheconstructorwithanullparameterReflectTesttest=(ReflectTest)ctor.invoke(null);4. 将构造函数声明为私有如果没有显式定义构造函数,系统将提供一个默认的、不带参数的public构造函数,它将把数据成员初始化为默认值。如果希望拒绝对该构造函数的仅有访问(例如:如果只希望通过工厂类实例化该类),可以用一个不同的访问级别声明这个构造函数。如果定义了一个无参的private构造函数,我们将阻止该类被实例化(这种做法可以针对这样的类:它只有静态成员,而又不能声明为abstract,因为我们想把它像System.Math类一样声明为sealed)。 5. 调用基类的构造函数当创建类的实例时,它的创建工作包括它的基类的创建。从基类继承的任何数据成员必须进行初始化。派生类的构造函数的一个操作是从它的直接基类中调用一个构造函数。这个操作可以使用基类的默认(无参数)构造函数隐式进行,也可以让派生类的构造函数显式调用基类的构造函数。如果类没有定义无参构造函数,就必须显式地调用一个基类的构造函数。方法是使用 :base 关键字。如:usingSystem;publicclassQuaddoublewidth,height;publicQuad(doublew,doubleh)width=w;height=h;publicdoubleGetArea()returnwidth*height;publicclassNamedQuad:Quadstringname;publicNamedQuad(doublew,doubleh,stringstr):base(w,h)name=str;publicstringGetName()returnname;publicclassBaseConstDemopublicstaticvoidMain()NamedQuadnq=newNamedQuad(2.0,3.0,Harry);Console.WriteLine(Areaof0is1,nq.GetName(),nq.GetArea();运行结果:Area of Harry is 6这个例子中一个有趣的地方是如果我们是这样定义NamedQuad类构造函数的:publicNamedQuad(doublew,doubleh,stringstr)width=w;height=h;name=str;程序不会通过编译。这是因为NamedQuad构造函数将试图从Quad类调用一个无参数的构造函数,但Quad类没有定义一个无参数的构造函数。6. 结构和类的区别结构和类的主要不同在于:(1) 结构存放在栈中并按值传递。类的对象放在堆中,按引用传递。和类的对象相比,结构具有性能上的优势。原因之一是值类型的分配快于引用类型。原因之二是存放在栈中的值一离开作用域就立即被收回,不用等待垃圾收集器来处理。但是,结构作为参数传递给方法前会复制它的一个完整的副本,所以只能用来表示小的数据结构。而当引用类型传递给方法时,传递的只是对对象的引用。(2) 结构既不能定义无参数的构造函数,又不能定义析构函数。(3) 结构的隐式类型是sealed类型,不能被继承。虽然它们可以提供一个或多个接口的实现。7.接口默认的访问方式是internal接口为类或结构提供了蓝图。它是一个能声明属性、索引器、事件和方法的编程构造。它不为这些成员提供实现,只提供定义。实现接口的数据类型必须提供接口成员的实现。在命名空间中声明的接口可以被授予public或internal访问类型,默认的访问方式是internal。接口中声明的成员隐式地为public和abstract,它们声明时没有实现,没有访问修饰符。C#的约定是接口名以一个大写的字母“I”开始。8. 方法中参数的修饰符(params/ref/out)参数按值或按引用传递。未修饰的参数按值传递,方法中变量的改变不会影响到最初的变量。但是,因为对象变量是存放在堆中的,存放在栈中的只是该位置的一个引用,所以传递给方法的是这个内存地址,而不是实际的对象,对对象的任何改变将会反映在最初的变量中。引用参数按引用传递给方法。这意味着传递给方法的是对对象的一个引用。在方法内部对引用类型的改变都会影响到最初的变量。按值传递的引用类型参数和按引用传递的参数之间的差别是很微小的。但在处理字符串时这种差异则很明显。8.1 params关键字params关键字指明一个输入参数将被看作一个参数数组。参数数组将包含数量不定的指定类型的参数。因此params关键字用于可变的参数列表行为。params关键字只能用于参数列表中的最后一个参数。 示例:params关键字ParamsDemo类定义了Process()方法,它只打印一个Strings数组。如果没有使用params关键字,您必须在调用该方法前创建并加载Strings数组:usingSystem;publicclassParamsDemopublicstaticvoidMain()Strings=newString3;s0=Jackson;s1=Zachary;s2=Erica;ParamsDemo.Process(s);publicstaticvoidProcess(Stringstr)for(inti=0;istr.Length;+i)Console.WriteLine(stri);下面是在参数列表中使用params关键字时的程序:usingSystem;publicclassParamsDemopublicstaticvoidMain()ParamsDemo.Process(Jackson,Zachary,Erical);publicstaticvoidProcess(paramsStringstr)for(inti=0;istr.Length;+i)Console.WriteLine(stri);运行结果:JacksonZacharyErica 8.2 ref关键字ref关键字让一个值类型的输入参数按引用传递。在方法中对变量的任何修改也将改变最初变量的值。ref关键字放在参数列表中变量类型的前面。在调用方法时也必须使用ref关键字。ref关键字的一个作用是取消一个方法只能返回一个值的限制。引用参数既传入方法,又从方法中传出,在传入前必须初始化。 示例:ref关键字例子中定义了一个静态Scale(),它按指定量改变两个浮点数。两个浮点数使用ref关键字被传递给方法。当它们的值在Scale()方法内改变时,它们将在方法返回时保持这些变化。注意调用Scale()时ref关键字的使用:usingSystem;publicclassDemopublicstaticvoidScale(doublescale,refdoublea,refdoubleb)a*=scale;b*=scale;publicstaticvoidMain()doubled1,d2;d1=2.0;d2=3.0;Demo.Scale(1.5,refd1,refd2);Console.WriteLine(d1is0,d1);Console.WriteLine(d2is0,d2);Console.ReadKey();运行结果:d1 is 3d2 is4.5我们前面说过,引用类型按值传递,但这个值是对象在内存中存储的地址。因此对对象所做的任何修改将反映在调用作用域中的变量上。然而,字符串有一些不同。因为字符串在C#中是不可变的,每当修改字符串时就会创建一个新的字符串对象。这意味着最初的变量不会受到影响(它仍将引用最初的String对象)。相似的,如果使用new关键字显式创建一个新的对象并将一个值参数指向它,这不会影响到调用作用域中的原始变量。引用参数在这里就不一样了(引用参数是有效的输入/输出参数),如果参数的值在方法体内修改,或者如果参数指向一个不同的对象,在方法外部的原始变量也将被更新并指向新的引用。示例:按引用传递字符串为了演示引用参数和引用类型的值参数之间的不同,下面的代码调用了两个方法,每个方法带一个字符串参数并在方法体内修改这个字符串。第一个方法接受一个值参数,第二个方法使用ref关键字接受一个引用参数:usingSystem;publicclassStringDemostaticvoidDoSomethingByValue(strings)s=Adifferentstring;staticvoidDoSomethingByReference(refstrings)s=Anotherstring;staticvoidMain(stringargs)strings=Astring;Console.WriteLine(s);DoSome
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年会计硕士模考模拟试题附参考答案详解【满分必刷】
- 2025年中医内科中医诊断治疗技术综合考核试题答案及解析
- 2025年焊工考试题库试题(能力提升)附答案详解
- 2025年杭州市临平区事业单位紧缺专业人才招聘26人笔试备考题库及完整答案详解1套
- 农发行苏州市姑苏区2025秋招笔试创新题型专练及答案
- 2025年押题宝典执业药师之《西药学专业一》题库含答案详解(综合题)
- 农发行青岛市市南区2025秋招笔试英文行测高频题含答案
- 2025年漯河医学高等专科学校公开招聘工作人员22名笔试备考试题及答案详解(名校卷)
- 2025年施工员模拟题库附参考答案详解【黄金题型】
- 2025年执业药师之《西药学专业一》题库高频重点提升试题含完整答案详解【有一套】
- 2025年社区未成年人志愿服务项目计划
- 创业入驻孵化协议
- 中国自身免疫性胰腺炎诊治指南(上海2023)
- 邮政社招笔试题
- 节前物业安全培训
- 2024年-2025年《公路养护》知识考试题库与答案
- 与信仰对话 课件-2024年入团积极分子培训
- NB-T31052-2014风力发电场高处作业安全规程
- 国际地图语言学研究进展
- 《水利水电建设工程验收规程》-SL223-2008
- AIOT智能物联产业学院建设方案
评论
0/150
提交评论