




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.NET专业,用Helloworld快速热身之四,1,值类型与引用类型的区别,.NET将数据类型分为值类型(valuetype)和引用类型(referencetype)一个具有值类型(valuetype)的数据存放在栈内的一个变量中。即是在栈中分配内存空间,直接存储所包含的值,其值就代表数据本身。值类型的数据具有较快的存取速度。一个具有引用类型(referencetype)的数据并不驻留在栈中,而是存储于堆中。即是在堆中分配内存空间,不直接存储所包含的值,而是指向所要存储的值,其值代表的是所指向的地址。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。引用类型的数据比值类型的数据具有更大的存储规模和较低的访问速度。值类型和引用类型的区别,就在于当函数参数传递的时候.值类型是把自己的值复制一份传递给别的函数操作.无论复制的值怎么被改变.其自身的值是不会改变的而引用类型是把自己的内存地址传递给别的函数操作.操作的就是引用类型值的本身.所以值被函数改变了.,2,值类型与引用类型的区别,值类型(1)这个类型分配在哪里?分配在栈上(2)变量是怎么表示的?值类型变量是局部复制(3)基类型是什么?必须继承自System.ValueType(4)这个类型能作为其他类型的基类吗?不能。值类型是密封的,不能被继承(5)默认的参数传递是什么?变量是按值传递的(也就是,一个变量的副本被传入被调用的函数)(6)这个类型能重写System.Object.Finalize()吗不能。值类型不好放在堆上,因此不需要被终结。(7)我可以为这个类型定义构造函数吗?是的,但是默认的构造函数被保留(也就是自定义构造函数必须全部带有参数)(8)这个类型的变量什么时候消亡?当它们越出定义的作用域时,3,值类型与引用类型的区别,引用类型(1)这个类型分配在哪里?分配在托管堆上(2)变量是怎么表示的?引用类型变量指向被分配得实例所占的内存(3)基类型是什么?可以继承自除了System.ValueType以外的任何类型,只要那个类型不是sealed(sealed(C#中的修饰符)当对一个类应用sealed修饰符时,此修饰符会阻止其他类从该类继承)的(4)这个类型能作为其他类型的基类吗?是的。如果这个类型不是密封的,它可以作为其他类型的基类(5)默认的参数传递是什么?变量是按引用传递(例如,变量的地址传入被调用的函数)(6)我可以为这个类型定义构造函数吗?当然!(7)这个类型的变量什么时候消亡?当托管堆被垃圾回收时。,4,值类型与引用类型的区别,值类型:单元直接存放“有效值”如:inta=3;则a内存单元就放的是3引用类型:单元放的是另外一个对象的引用(地址)如:Formform1=newForm();就是说,在内存中开辟了一个对象newForm(),form1内存单元存放的是那个对象的地址,并非对象本身一个是现金,一个是存折。,5,值类型与引用类型的区别,classPersonpublicintBlood=10;publicstaticvoidAdd(intx)x+=10;Console.WriteLine(值类型当参数被传递并修改之后:+x);publicstaticvoidAdd(Personperson)person.Blood+=10;Console.WriteLine(引用类型当参数被传递并修改之后:+person.Blood);,6,值类型与引用类型的区别,/值类型变量inti=10;Console.WriteLine(i的原值:+i);Add(i);Console.WriteLine(但是i的值并没有因为函数的修改而修改:+i);/引用类型变量Personperson=newPerson();Console.WriteLine(Blood的原值:+person.Blood);Add(person);Console.WriteLine(但是Blood的值因为函数的修改而修改:+person.Blood);Console.ReadLine();,7,继承,继承是指一个对象直接使用另一对象的属性和方法.继承(加上封装和多态性)是面向对象的编程的三个主要特性(“支柱”)之一。继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。其成员被继承的类称为“基类”,继承这些成员的类称为“派生类”。定义一个类从其他类派生时,派生类隐式获得基类的除构造函数和析构函数以外的所有成员。因此,派生类可以重用基类中的代码而无需重新实现这些代码。可以在派生类中添加更多成员。派生类以这种方式扩展基类的功能。C#中提供了类的继承机制,但只支持单继承,而不支持多继承,即在C#中一次只允许继承一个类,不能同时继承多个类。,8,继承,classTestintnum1,num2;publicTest()num1=1;num2=2;publicvoidPrint()Console.WriteLine(-);Console.WriteLine(0+1=2,num1,num2,num1+num2);Console.WriteLine(我是基类的Print方法n-);,9,继承,classTest2:Test/如果子类方法的方法名和基类的方法名相同时,系统将隐藏基类同名方法,自动调用子类的同名方法publicvoidShow()Console.WriteLine(-);/派生类会继承基类所有的成员,但是不能显示调用基类的是有成员/在派生类中不可以调用基类的是有成员,如num1,num2,但是可以实现调用基类方法Print();Console.WriteLine(我是子类的Show方法n-);,10,继承,Test2ts2=newTest2();/可以调用基类的Print方法ts2.Print();Console.WriteLine();/调用自己的Show方法ts2.Show();Console.Read();,11,封装,对于一个具有丰富结构化程序设计经验的程序员来说,面向对象的程序设计可能会给他们带来非常不自然的感觉。封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。在本文中,我们将详细学习属性的特性。,12,封装的概念,可以把程序按某种规则分成很多“块“,块与块之间可能会有联系,每个块都有一个可变部分和一个稳定的部分。我们需要把可变的部分和稳定的部分分离出来,将稳定的部分暴露给其他块,而将可变的部分隐藏起来,以便于随时可以让它修改。这项工作就是封装.例如:在用类实现某个逻辑的时候,类就是以上所说的块实现功能的具体代码就是可变的部分,而public的方法或者属性则是稳定的部分。,13,封装的意义,封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的原素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(private)在很多方面会更好。,14,封装的意义,私有的数据可以用两种方式来间接的控制。下面我们看一些c#例子来学习这两种方法用以封装数据。第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。无论我们使用哪种的方法,我们的目标是在使用数据的同时不能使它受到任何的破坏和改变。有如下好处使用者只需要了解如何通过类的接口使用类,而不用关心类的内部数据结构和数据组织方法。高内聚,低耦合一直是我们所追求的,用好封装恰恰可以减少耦合只要对外接口不改变,可以任意修改内部实现,这个可以很好的应对变化类具有了简洁清晰的对外接口,降低了使用者的学习过程,15,用传统的读、写方法封装,让我们来看一个例子有一个类Department,为了操纵这个类中的数据(stringdepartname)我们定义了一个读方法和一个写方法。publicclassDepartmentprivatestringdepartname;./读方法publicstringGetDepartname()returndepartname;/写方法publicvoidSetDepartname(stringa)departname=a;,16,用传统的读、写方法封装,通过上面的方法,我们可以保护私有数据不被外部程序所破坏。现在我们使用两个不同的方法来写和读数据publicstaticintMain(stringargs)Departmentd=newDepartment();d.SetDepartname(ELECTRONICS);Console.WriteLine(TheDepartmentis:+d.GetDepartname();return0;在上面的例子中,我们不能直接访问类Department的实例d中的私有数据(stringdepartname),我们只能通过这两个方法来访问。,17,用属性来实现封装,属性是c#引入的一种语言成分,只有很少的语言支持属性。通过对属性的读和写来保护类中的域。第一种方法本身也是一种好的方式,但用属性来实现封装会更方便。现在我们来看一个例子:publicclassDepartmentprivatestringdepartname;publicstringDepartnamegetreturndepartname;setdepartname=value;,18,用属性来实现封装,publicclassDepartmentmainpublicstaticintMain(stringargs)Departmentd=newDepartment();d.Departname=Communication;Console.WriteLine(TheDepartmentis:0,d.Departname);return0;通过上面的例子,我们可以看到如何通过属性来实现封装。属性具有两种操作get和set。Get用来返回属性域的值。Set通过value这个变量来给属性域赋值。属性可以设为只读的(read-only)。这只需属性只具有一个set操作。,19,只读属性,publicclassReadDepartmentprivatestringdepartname;publicReadDepartment(stringavalue)departname=avalue;publicstringDepartnamegetreturndepartname;,20,只读属性,publicclassReadDepartmainpublicstaticintMain(stringargs)ReadDepartmentd=newReadDepartment(COMPUTERSCIENCE);Console.WriteLine(TheDepartmentis:0,d.Departname);return0;,21,只读属性,在上面的例子中我们看到了如何来实现一个只读的属性。类ReadDepartment拥有一个Departname属性只实现了get操作。它省略了写操作。这个特别的类拥有一个构造器,用来接受一个字符串变量。类ReadDepartmain中的Main方法创建了一个新的对象d。对像d的实例使用了类ReadDepartment带有一个字符串参数的构造器。因为上面的属性是只读的,所以我们不给给域departname赋值并且我们只侧读取此域中的值。当然属性也可以是只写的(write-only),这只需属性只具有一个get操作。,22,只写属性,publicclassWriteDepartmentprivatestringdepartname;publicstringDepartnamesetdepartname=value;Consol
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年3D打印在建筑领域的应用
- 品牌经理品牌推广考核试卷及答案
- 锯床安全操作培训总结课件
- 键盘使用课件
- 年产磁芯30000万只改扩建项目环评报告表
- 2025年五邑大学纺织试卷及答案
- 保税科技外服公司资产评估报告
- 2025年高化期末考试试题及答案
- 深度解读:2025年智能快递驿站无人化服务技术发展现状
- 通信工程本科-培养方案(3篇)
- 2025年护士执业资格考试题库(社区护理学专项)-社区护理护理法律法规试题
- 消化道出血护理查房课件(完整版)
- 2024年同等学力申硕《英语》试题真题及答案
- 胃疡病中医护理查房
- 2024-2025学年重庆市九龙坡区五年级(上)期末数学试卷(含答案)
- 2024外墙喷涂机器人
- 《管理咨询实践》课件
- 《eva培训资料》课件
- 第四届全国冶金矿山行业职业技能竞赛(电气设备点检员赛项)理论参考试题库(含答案)
- 酒店保洁员培训
- 【MOOC】软件度量及应用-中南大学 中国大学慕课MOOC答案
评论
0/150
提交评论