C#入门经典第三版读书笔记全2.pdf
《C#入门经典第三版读书笔记全2.pdf》由会员分享,可在线阅读,更多相关《C#入门经典第三版读书笔记全2.pdf(223页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用,在结构的构造上函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用在C#系统中,t h i s实际上是一个常量,所以不能使用t h i s+这样的运算t h i s保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身1 .类和结构的区别?答:类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存;类有构造和析构函数;类可以继承和被继承。结 构:结构是值类型在栈上巡己(虽然栈的访问速度比
2、较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。结构没有构造函数,但可以添加。结构没有析构函数。结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口。2 .抽象类和接口的区别?答:抽 象 类(a b s t r a c t c l a s s)可以包含功能定义和实现,接口(i n t e r f a c e)只能包含功能定义抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”为外部提供调用或功能需要扩充时优先使用接口。接
3、口一般只有方法,而没有数据成员或属性。抽象类有方法,也有数据成员或属性,一般情况下,优先考虑用接口,只有当可能要访问到数据成员或属性时,用抽象类。3.概述深度复制和浅度复制深度复制就是将引用成员指向的对象也进行复制。实际的过程是创建新的引用成员指向的对象,然后复制对象包含的数据。浅度复制的时候,对于值类型成员,会复制其本身(值类型变量本身包含了所有数据,复制时进行按位拷贝);对于引用类型成员(注意它会引用另一个对象),仅仅复制引用,而不创建其引用的对象。结果就是:新对象的引用成员和 复制对象的引用成员指向了同一个对象第十章定义类成员本章内容1 .定义类成员2 .类成员的其他议题3 .接口的实现
4、4.部分类知识点1.定义字段字 段(一般首字母小写,或下戈钱开头):在类中直接定义的变量。变量一定要先声明,再赋值,才能使用.命名规则:1)必 须 以“字母”_ 或 符号开头.一不要以数字开头2)后面可以跟任意“字母”、数字、下划线.定义变量时,变量名要有意义注意:1)你起的变量名不要与c#系统中的关键字重复.2)在c#中,大小写是敏感的 字段用标准的变量声明格式和前面介绍的修饰符来声明(也可以初始化),例如:c l a s s m y C l a s s(p u b l i c i n t M y l n t;)公共字段推荐用P a s c a l C a s i n g 的形式来命名,私有
5、字段没有推荐的命名形式,一般使用c a m e I C a s i n g 的形式来命名。字段可以使用关键字r e a d o n l y,表示这个字段只能在执行构造函数的过程中赋值,或由初始化语句赋值,例 如:c l a s s m y C l a s sp u b l i c r e a d o n l y i n t M y l n t=1 7;)字段也可以使用s t a t i c 声明为静态的:c l a s s m y C l a s s(p u b l i c s t a t i c i n t M y l n t;)2,定义属性属性(一般首字母大写):定义一个p u b l i
6、 c 变量,这个变量里含有g e t,s e t 两个方 法(属性不是变量,其实质是函数)。g e t 读取属性,r e t u r n 返回读取值,s e t 写属性,关键字v a l u e 存储用户赋的值。字段与属性的区别就是可以进行非法值的判断。允许外部访问的变量一定要声明为属性。它是代表类的实例或类中的一个数据项的成员。像 字 段:它是命名的类成员、有类型、可以被赋值和读取;不像字段:它是函数成员、不为数据存储分配内存、它执行代码。属性可以使用v a r t u a l、o v e r r i d e 和a b s t r a c t 关键字,但是不能将这几个关键字用于字段。语 法:
7、访问修饰符类型名 属 性 名 g e t r e t u r n 字段;set(私有字段-valuei)功 能:允许外部访问的变量必须设为属性,可以防止用户设非法值,用来保护私有字段赋值的正确性。g e t 块一般有一个属性类型的返回值,简单的属性一般与一个私有字段相关联,用来控制对这个字段的访问,这是get块可以直接返回该字段的值;上面的字段外部不能访问,只能通过属性来访问该字段。se t函数以类似的方式把一个值赋给字段,这里可以使用关键字value引用用户提供的属性值;value值等于类型和属性相同的一个值,如果属性的类型和字段的类型相同,就不用进行类型转换。静态属性:不能访问类的实例成员
8、,虽然它们能被实例成员访问;它总是存在,不管类是否有实例;当从类的外部访问时,必须使用类名引用,而不是实例名;其设计目的主要是为了实现面向对象(0 0)中的封装思想。根据该思想,字段最好设为private,一个精巧的类最好不要直接把字段设为公有提供给客户调用端直接访问。3,定义方法方法使用标准的函数格式,以及可访问性,和可选的s ta tic 修饰符来声明,例如:class myClasspublic string MyStringOreturn 这是一个方法”;)解 析:class myClass(开始声明方法代码public string MyStringO(return 这是一个方法”;
9、)结束声明方法代码)公共方法也用Pasca ICasing的形式来命名。注 意:如果声明了s ta tic 关键字,这个方法就只能通过类来访问,而不能通过对象实例还访问。也可以在方法定义中使用下面的关键字:v irtu al-方法可以重写;abstract一一方法必须在非抽象的派生类中重写(只用于抽象类)o v e r r i d e一一方法重写了一个基类方法(要重写方法,必须用这个关键字)e x t e r n 方法定义在其他地方;构造方法是一种创建对象的特殊方法,方法名和类名一样,没有返回值,连v o i d都不用,就是为了初始化类的成员。构造方法不能被o v e r r i d e。构造
10、函数可以有参数,n e w对象的时候传递函数参数即可。如果不指定构造函数,则类有一个默认的无参构造函数。如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写。构 造 函数可以鳏,也就是有多个参数不同的构造函数。使用构造方法的好处:1.对多个属性进行赋值时,不需要重复的写实例名。2.可以保证用户在n e w一个对象的时候必须对某一个属性进行赋值。3.在n e w 一个对象时,对只读属性进行初始化。在方法定义中,被v i r t u al修饰的方法称为虚函数。是没有实现的,可由子类继承并重写的函数。在方法定义中,被修饰的方法称为虚函数抽象函数:规定其非虚子类必须实现
11、的函数,必须被重写定义方法一般有以下几种:/有返回值方法调用例子:/i n t i =2;/i n t r e s u l t =A d d(i);/C o n s o l e.W r i t e L i n e(r e s u l t);/C o n s o l e.W r i t e L i n e(i);/输出后结果为3和2/参数为值类型,原值不被修改p u bl i c s t at i c i n t A d d(i n t T o N u m be r)(i n t s u m =0;f o r (i n t i =1;i =T o N u m be r;i+)(s u m 十=i
12、;r e t u r n s u m;无返回值方法调用例子:/A d d V o i d(2);/输出后结果为3p u bl i c s t at i c v o i d A d d V o i d(i n t T o N u m be r)i n t s u m =0;f o r (i n t i =1;i Cow 和 Chicken。(3)修改Animal.cs中的代码,如下所示:namespace ChllExOlpublic abstract class Animalprotected string name;public string Name(get(return name;set
13、(name=value;)public Animal()name=The animal with no name”;)public Animal(string newName)(name=newName;public void Feed()(Console.WriteLine(H0 has been fed”,name);)(4)修 改Cow.cs中的代码,如下所示:namespace ChllExOl(public class Cow:Animal(public void Milk()Console.WriteLine(0 has been milked.,name);)public Cow
14、(string newName):base(newName)(5)修改Chicken.cs中的代码,如下所示:namespace ChllExOl(public class Chicken:Animal(public void LayEgg()Console.WriteLine(0 has laid an egg.,name);public Chicken(string newName):base(newName)(6)修改Program.es中的代码,如下所示:using System;using System.Collections;using System.Collections.Gen
15、eric;using System.Linq;using System.Text;namespace ChllExOl(classProgram(static void Main(string args)(Console.WriteLine(HCreate an Array type collection of Animalobjects and use it:);Animal animalArray=new Animal2;Cow myCowl=new Cow(Deirdre”);animalArray0=myCowl;animalArray1=new Chicken(nKenn);fore
16、ach(Animal myAnimal in animalArray)Console.WriteLine(New 0 object added to Array collectionzn+Name=1”,myAnimal.ToString()r myAnimal.Name);)Console.Writ eLine(H Ar ray collection contains 0 objects.n,animalArray.Length);animalArray0.Feed();(Chicken)animalArray1).LayEgg();Console.WriteLine();Console.W
17、riteLine(HCreate an ArrayList type collection ofAnimal”+Hobjects and use it:H);ArrayList animalArrayList=new ArrayList();Cow myCow2=new Cow(Hayley);animalArrayList.Add(myCow2);animalArrayList.Add(new Chicken(Roy);foreach(Animal myAnimal in animalArrayList)(Console.WriteLine(HNew 0 object added to Ar
18、rayListcollection,”+Name=1“,myAnimal.ToString(),myAnimal.Name);)Console.WriteLine(ArrayList collection contains 0objects.,animalArrayList.Count);(Animal)animalArrayList0).Feed();(Chicken)animalArrayList1).LayEgg();Console.WriteLine();Console.WriteLine(Additional manipulation ofArrayList:H);animalArr
19、ayList.RemoveAt(0);(Animal)animalArrayList0).Feed();animalArrayList.AddRange(animalArray);(Chicken)animalArrayList2).LayEgg();Console.WriteLine(The animal called 0 is at index 1.n zmyCowl.Name,animalArrayListIndexOf(myCowl);myCowl.Name=n Janice H;Console.WriteLine(The animal is now called 0.”,(Anima
20、l)animalArrayList1).Name);Console.ReadKey();)(7)运行该应用程序,其结果如图11-1所示。S3 file:/C:AJsers/Karii/AppData/Locairremporary Projects/Ch11 ExO1/bin/Debug/Ch11 ExO1.EXECreate an Array type co llectio n of Aninal objects and use i t:New ChllExOl.Cow object added to Array c o lle c tio n.Name-DeirdieNew ChllExO
21、l.Chicken object added to Array c o lle c tio n.Name=KenArray c o llectio n contains 2 o b jects.Deirdre has been fed.Ken has la id an egg.Create an ArrayList type c o llectio n of Animal objects and use i t:New ChllExOl.Cow object added to ArrayList c o lle c tio n,Nane=HayleyNew ChllExOl.Chicken o
22、bject added to Arrai/List co llectio n*Name RoyArrat/List co llectio n contains 2 o b jects.Hayley has been fed.Roy has la id an egg.A dditional manipulation of A rrayList:Ro9 has been fed.Ken has la id an egg.The animal ca lled Deirdre is at index 1.The animal is now ca lled Jan ice.图 11-1示例的说明这个示例
23、创建了两个对象集合,第一个集合使用System.Array类(这是一个简单的数组),第二个集合使用System.Collections.ArrayList类。这两个集合都是Animal对象,在 Animal.cs中定义。Animal类是抽象类,所以不能进行实例化。但通过多态性(详见第8 章),可以使集合中的项成为派生于Animal类的Cow和 Chicken类实例。这些数组在Classi.cs的 Main。方法中创建好后,就可以显示其特性和功能。有几个处理操作可以应用到Array和 ArrayList集合上,但它们的语法略有区别。也有一些操作只能使用更高级的ArrayList类型。下面首先通过
24、比较这两种集合的代码和结果,讨论一下这两种集合的类似操作。首先是集合的创建。对于简单的数组来说,必须用固定的大小来初始化数组,才能使用它。下面使用第5 章介绍的标准语法创建数组animalArray:Animal animalArray=new Animal2;而 ArrayList集合不需要初始化其大小,所以可以使用下面的代码创建列表animal ArrayList:ArrayList animalArrayList=new ArrayList();这个类还有另外两个构造函数。第一个构造函数把现有的集合作为一个参数,把现有集合的内容复制到新实例中;而另一个构造函数通过一个参数设置集合的容量(
25、capacity)。这个容量用一个in t值指定,设置集合中可以包含的项数。但这并不是真实的容量,因为如果集合中的项数超过了这个值,容量就会自动增大一倍。因为数组是引用类型(例如,Animal和 Animal派生的对象),所以用一个长度初始化数组并没有初始化它所包含的项。要使用一个指定的项,该项还需要初始化,即需要给这个项赋予初始化了的对象:Cow myCowl=new Cow(Deirdre);animalArray0 =myCowl;animalArray1 =new Chicken(nKenn);这段代码以两种方式完成该初始化任务:用现有的Cow对象来赋值,或者通过创建一个新的Chick
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 入门 经典 第三 读书笔记
限制150内