C#书概念整理Word格式.docx
《C#书概念整理Word格式.docx》由会员分享,可在线阅读,更多相关《C#书概念整理Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
do…while的体循环至少执行一遍,而且与条件表达式无关;
while的体循环只有在条件表达式为true后,才执行。
foreach(stringsinArray);
五.二面向对象的概念
面向对象的程序设计是以要解决的问题中多涉及的各种对象为主要矛盾。
万物皆对象。
类的定义就是具有相同或相似性质的对象的抽象。
因此,对象的抽象就是类,类的具体化就是对象,也可以说类的实例是对象。
对象间的关系:
1包含,当对象A是对象B的属性时,称对象B包含对象A.
2继承,它代表了一种层次关系,当对象A是对象B的特例时,就说对象A继承了对象B。
3关联,当对象A的引用是对象B的属性时,称对象A和对象B之间是关联关系。
五.三面向对象程序设计
抽象:
是科学研究中常用的一种方法,即去掉被研究对象中与主旨无关的次要部分,或是暂时不考虑的部分,而仅仅抽象出与研究工作有关的实质性的内容并加以研究,“抓主丢次”。
分为过程抽象{面向过程编程采用的},数据抽象{面向对象编程采用的}……
封装:
是指使用抽象数据类型将数据和基于数据的操作包装在一起。
数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能与这个抽象数据类型进行交互。
封装的主要目的:
达到接口和实现的分离。
通过封装,对内将实现细节隐藏起来,对外则通过接口向其他单元提供服务。
在面向对象程序设计中,抽象数据类型是使用“类”来实现的。
每个类里面都封装了相关的数据和操作。
在实际的开发过程中,类多用来构建系统内部的模块,由于封装特性把“类”内的数据保护的很严密,模块与模块之间仅通过严格控制的接口进行交互,使得他们之间的耦合和交叉大大减少,从而降低了开发过程的复杂性,提高了效率和质量,减少了可能的错误,同时也保证了程序中数据的完整性和安全性。
4个访问级别:
Public:
公有成员,最高访问级别,对所有类都可见;
Protected:
受保护成员,在它的类或者派生类中可访问;
Internal:
表示只有在同一程序集内,内部类型或成员才可访问;
Private:
私有访问是允许的最低访问级别。
私有成员只有在声明它们的类和结构体中才是可访问的。
Protectedinternal:
.NetFramework2.0中还引入部分(Partial)类这一概念,即在一个文件里定义一个类的某部分,然后在另一个文件里进一步定义这个类。
这种方法在整合用户编码和系统自动生成编码时尤其有用。
自定义类:
以下定义一个公共类,其中包含一个字段,一个方法和一个称为构造函数的特殊方法。
PublicclassPerson
{
Publicstringname;
PublicPerson()
{Name=“unknown”;
}
PublicvoidSetName(stringnewName)
{Name=newName;
}
//这个Person类:
访问修饰符public表示该类具有最高访问级别;
该类有一个public的字符串类型的字段成员,叫做name,用于表示这个Person的姓名;
此外还包含一个构造函数Person(),它的功能是在该类实例化的时候默认初始化这个人的姓名为“unknown”;
此外还看到一个叫做SetName()的方法,此方法接受一个字符串类型的参数,并把此参数赋值给内部的字段name,这个方法用来完成对人名的修改。
类成员:
字段,属性,事件,索引器,方法
“类”是C#的主要数据抽象类型,为了能表示出现实世界中复杂的事物,他必须也具有丰富的内容。
“字段”是包含在类或结构中的对象或值。
字段使类和结构可以封装数据。
字段通常应为private。
外部类应当通过方法、属性或索引器来间接访问字段。
可以将字段声明为static[静态],表示该字段是类的属性,而非对象的属性。
这使得调用方在任何时候都能通过类来使用字段,即使类没有任何实例。
注意:
{静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。
静态类成员可用于分离独立于任何对象标识的数据和行为:
无论对象发生什么更改,这些数据和函数都不会随之变化。
当类中没有依赖对象标识的数据或行为时,就可以使用静态类。
另外,还可以将字段声明为readonly(只读)。
只读字段只能在初始化期间或在构造函数中赋值。
Staticreadonly字段非常类似于常量(const)。
它们之间的区别是C#编译器不会在编译时将该静态字段的值编译到代码中去(const的值在编译时直接被编译到代码中),而是在每次运行时动态解析(就像对待一个普通变量一样)。
也就是说,const字段的值在编译时就已经确定了,而staticreadonly字段的值在运行时才确定。
常量被声明为字段,声明时在字段的类型前使用const关键字。
常量必须在声明时初始化,如下:
ClassCalendar1
Publicconstintmonths=12;
属性:
前面提到,类中的字段,一般都要设置成private,这样在类外面就无法访问这个字段。
如果想修改这个字段,简单的说有两种方法:
公共方法或者公共属性。
因为private的字段只能在类的内部访问和修改,那么就在类中编写两个public的方法:
Get()和Set()用来返回和设置私有字段的值。
另一种方法就是添加一个public的属性,使用属性中的Get和Set来设置私有字段。
那么属性又是什么呢?
实际上上述的Get()和Set()方法就是属性,只不过编译器代劳了将属性转换为方法的工作。
最终的代码还是会被编译成类的Get()和Set()方法。
我们可以像使用公共数据成员一样使用属性,这使得数据在可被轻松访问的同时,仍能提供方法的安全性和灵活性。
事件:
是能够在代码中对其进行响应(或处理)的操作。
用户的操作可以产生事件。
事件也可以通过编程来产生。
Windows应用程序和Web应用程序都是基于事件驱动的应用程序,即根据事件来执行代码。
每个窗体及控件都提供了一个预定义的事件集,开发人员可以根据这个事件集来编程。
事件类型:
最常用的事件有键盘事件,鼠标事件,属性事件;
若应用程序支持拖放操作,那么它就需要处理拖放事件。
索引器:
就是一类特殊的属性,通过他们就可以像引用数组一样引用自己的类。
显然,这一功能在创建集合类的场合特别有用,而在其他某些情况下,比如处理大型文件或者抽象某些有限资源等,能让泪具有类似数组的行为当然也是非常有用的。
属性和索引器的区别:
1,类的每一个属性都必须拥有唯一的名称,而类中定义的每一个索引器都必须拥有唯一的签名(signature)或者参数列表(这样就可以实现索引器的重载)。
2,属性可以是静态的,而索引器则必须是实例成员。
3,为索引器定义的访问函数可以访问传递给索引器的参数,而属性的访问函数则没有参数。
属性
索引器
允许调用方法,如同它们是公共数据成员
允许调用对象上的方法,如同对象是一个数组
可通过简单的名称进行访问
可通过索引器进行访问
可以为静态成员或实例成员
必须为实例成员
属性的get访问函数没有参数
索引器的get访问函数具有与索引器相同的形参表
属性的set访问函数包含隐式value参数
除了value参数外,索引器的set访问函数还具有与索引器相同的形参表
方法:
“方法”是类中包含一系列语句的代码块。
在C#中并非在程序中的任何地方都能编写方法,只能在类或结构中声明方法。
声明时需要指定访问级别、返回值、方法名称,以及方法参数。
方法名称前加void表示此方法不需要返回任何值。
为了将方法和属性相区别,方法名称的每个单词的首字母要大写;
而属性名称的首单词的首字母一般是小写,其他单词首字母大写。
如:
方法名GetTable(),属性名yourName。
方法中return值的类型必须与方法的类型相符。
VoidPaintRandomLine()
画一条随机的线;
Return;
//此时可以省略return
return语句后面的语句将不会被执行,程序执行完return语句后立刻退出方法。
当程序调用一个发放时,执行流程就跳转到该方法,于是该方法开始执行。
当执行到return语句或到达方法的终点后,执行流程就返回到调用该方法的地方。
方法参数可以是引用类型或者值类型。
当值类型数据作为参数传递给方法时,方法将会复制该数据的一个副本在方法内部使用。
作为参数的数据本身不会因为方法的内部操作而发生改变。
当引用类型数据作为参数传递给方法时,方法将会直接操作该引用所指向的那个数据。
作为参数的数据本身会因为方法内部操作产生变化。
如果在为方法声明参数时,未使用关键字ref或out,则该参数会获得当前传入值的副本。
可以在方法中更改该值,但当控制权返还调用过程时,不会保留更改的值。
通过使用方法参数关键字,可以更改这种行为。
声明方法参数时,可以使用的关键字。
①,params关键字:
用于方法参数列表长度不定的情况。
需要注意:
在方法中使用params关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个params关键字
②,ref[或者out]关键字:
表示使用引用类型参数。
其效果是,在方法中对参数所做的任何更改都将反映在该变量中。
若使用ref[或者out]参数,则方法的定义和调用都必须显式使用ref[或者out]关键字。
Ref与out很类似,区别在于ref要求变量在作为参数传递之前进行初始化,而out无需进行初始化。
尽管ref和out在运行时的处理方式不同,但在编译时的处理方式相同。
因此,如果一个方法采用ref参数,而另一个方法采用out参数,则无法重载这两个方法。
ClassCS063_Example
//编译错误CS0663:
不能仅使用ref和out进行方法的重载
因为从编译的角度来看,这两个方法完全相同
PublicvoidSample(refinti){}
PublicvoidSample(outinti){}
属性不是变量,因此不能作为out参数输出。
当希望方法返回多个值时,声明ref或out方法很有用。
若使用return,只能返回一个值,那么只能创建一个结构或者数组之类的容器来容纳这些变量。
然而,这样不仅麻烦,而且容易出错。
使用out或ref参数的方法仍然可以将变量用做返回类型,但它还可以将一个或多个对象作为out或ref参数返回给调用方法。
构造函数:
构造函数是一种特殊的成员方法,它主要用于在创建指定类型的对象时执行类的方法,构造函数具有与类相同的名称,它通常初始化新对象的数据成员。
PublicclassTaxi
PublicboolisInitialized=false;
PublicTaxi()
{isInitialized=true;
ClassTestTaxi
StaticvoidMain()
Taxit=newTaxi();
Consol.WriteLine(t.isInitialized);
不带参数的构造函数称为“默认构造函数”。
无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用构造函数。
除非类是静态的,否则C#编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。
静态类是密封的,因此不可被继承。
静态类不能包含构造函数,但仍可声明静态构造函数,以分配初始值或设置某个静态状态。
通过将构造函数设置为私有构造函数,可以阻止类被实例化。
如下:
ClassMLog
//私有构造函数
PrivateMLog()
{
Publicstaticdoublee=System.Math.E;
//2.71828…
类可以定义具有参数的构造函数。
带参数的构造函数必须通过new语句或base语句来调用。
类还可以定义多个构造函数。
并且二者均不需要定义默认构造函数。
如:
PublicclassEmployee
PublicintSalary;
PublicEmployee(intannualSalary)
{salary=annualSalary;
}
PublicEmployee(intweeklySalary,intnumberofweeks)
{Salary=weeklySalary*numberofweeks;
此类可以使用下列语句中的任一个来创建:
Employeee1=newEmployee(3000);
Employeee2=newEmployee(300,45);
构造函数可以标记为public,protected,internal或protectedinternal。
使用static关键字可以将构造函数声明为静态构造函数。
在该类第一次被使用(使用静态成员或实例化对象)之前,如果有静态构造函数,那么他将执行一次且仅执行一次。
构造函数具有一些特殊的性质:
·
构造函数的名字必须与类名相同;
构造函数没有返回类型,可带参数,也可不带;
【无返回值】
声明类对象时,系统自动调用构造函数,构造函数不可被显式调用;
构造函数可以重载,从而提供初始化类对象的不同方法;
若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空。
Main()方法:
Main()方法是程序的入口点,程序控制在该方法中开始和结束;
该方法在类或结构的内部声明,它必须为静态方法;
它可以具有void或int返回类型;
声明Main()方法时,既可以使用参数,也可不使用;
参数可以作为从0开始索引的命令行参数来读取;
与C和C++不同,程序的名称不会被当做第一个命令行参数。
变量的作用域:
是指变量在程序中能够被识别的范围;
变量可以在类中定义,也可以在方法中定义。
局部变量,在C#中,在方法内部创建的变量只能在方法内部使用,所以这种变量对于方法而言是局部的,被称为“局部变量”(LocalVariable)。
所谓的作用域(Scope)就是指变量能够被识别或者有效的那段程序。
在这段程序之外,该变量无法被访问和使用,所以在一个作用域内不能定义两个或者多个同名变量,但是在其他作用域,可以定义与其同名的变量。
全局变量:
与局部变量相对的,还有一个概念,即“全局变量”(GlobalVariable),由位于方法外的语句来声明和初始化(分配内存等资源)。
所有在物理上位于全局变量声明之后的程序代码都可以调用并使用它。
classLion
{
intAge;
//全局变量
intWeight;
publicLion(intage,intweight)
this.Age=age;
this.Weight=weight;
publicoverridestringToString()//重写:
自动出来的
//returnbase.ToString();
return"
这只狮子有"
+this.Age.ToString()+"
岁,体重"
+this.Weight.ToString()+"
Kg。
"
;
}
ClassTestGlobalVariable
intAge=20;
//局部变量
intWeight=200;
Lionlion=newLion(Age,Weight);
Console.WriteLine(lion.Tostring());
由于在Lion构造函数之前声明了两个全局变量Age和Weight,所以能够在构造函数中直接使用它们。
变量的作用域不会影响或者限制变量的数据类型,无论变量在哪里被声明都可以是字符、字符串、整数或浮点数等。
注意,全局变量可以和局部变量具有相同的名称,但是在局部变量的作用域调用此变量名的时候,默认情况下将调用局部变量。
如果需要添加前缀[即类名]进行说明。
全局变量的作用:
方法所界定的作用域使各个方法内部的变量相互隔离和独立,并能够严格控制其生存周期。
谨慎使用全局变量。
方法重载:
在讲解方法重载之前需要事先介绍一个概念——方法签名。
方法签名由方法名称和一个参数列表(方法的参数和类型)组成。
在C#中,同一个类中的两个或两个以上的方法可以有同一个名字,只要他们的参数声明不同即可。
在这种情况下,该方法就被称为重载(overload),这个过程称为方法重载(methodoverload)。
方法重载是C#中最有用的特性之一。
当一个重载方法被调用时,C#用方法签名确定调用哪个方法。
因此重载方法的参数列表必须不同。
虽然每个重载方法可以有不同的返回类型,但返回类型并不足以区分所调用的是哪个方法。
当C#调用一个重载方法时,参数与调用参数相匹配的方法被执行。
构造函数作为一种方法也可以被重载。
重载方法没有什么区别。
请参考一下标准来决定是否使用方法重载:
当需要设计一些功能相似的方法,而这些方法需要不同的参数时,应该使用方法重载。
方法重载是在现有代码中添加新功能的一种好方法。
使用方法重载只是为了实现类中那些具有相似功能的方法。
结构方法
结构的特点:
结构是值类型,而类是引用类型;
向方法传递结构时,结构是通过传值方法传递的,而不是作为引用传递的;
与类不同,结构的实例化可以不使用new运算符;
结构可以声明构造函数,但他们必须带参数;
一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。
所有结构都直接继承自System.ValueType类,System.ValueType类继承自System.Object类;
【结构不可继承或被继承】
结构可以实现接口;
在结构中初始化实例字段是错误的。
结构可在一个地方存储多个数据元素。
其实结构可以做的工作远不止此,一个重要的功能就是结构可以包含函数和数据。
系统DateTime结构的使用:
DateTime.Now:
获取一个DateTime对象,该对象设置为此计算机上的当前日期和时间,表示为本地时间。
DateTime.UtcNow:
获取一个DateTime对象,该对象设置为此计算机上的当前日期和时间,表示为通用协调时间(UniversalTimeCoordinated,UTC)。
DateTime的Add()方法不更改DateTime的值,而是返回一个新的DateTime。
委托:
C\C++中的函数指针。
在C#中,考虑到安全性,用了一个新概念——委托(delegate)来代替。
委托是一种引用方法的类型,从System.Delegate继承而来。
一旦为委托分配了方法,委托将为该方法具有完全相同的行为。
一个委托实例包含一个调用列表,该列表中包含一个或多个方法。
当委托被调用时,列表中的所有方法都被按照顺序调用一遍。
委托方法的使用可以像其他任何方法一样,具有参数和返回值。
PublicdelegatevoidTestDelegate(stringmessage)
delegate关键字用于声明一个引用类型,该引用类型可用于封装命名方法或匿名方法。
委托类似于C++中的函数指针,但它是类型安全和可靠的。
委托时事件的基础。
通过将委托与命名方法或匿名方法关联,可以实例化委托。
delegatevoidSampleDelegate(stringmessage);
//声明委托定义所需要的签名
classMainClass
//在类中定义两个具有与委托相同参数列表的方法
staticvoidSampleMethod1(stringmessage)
Console.WriteLine("
sampleMethod1\t"
+message);
staticvoidSampleMethod2(stringmessage)
sampleMethod2\t"
//声明一个委托对象d1,并以SampleDelegateMethod为引用赋值给它
SampleDelegated1=MainClass.SampleMethod1;
d1("
Hello"
);
d1=MainClass.SampleMethod2;
World"
使用委托,就可以像操作变量一样操作方法。
与委托的签名(由返回类型和参数组成)匹配的任何方法都可以分配给该委托。
这样就可以通过编程的方法来更改方法调用,还可以向现有类中插入新代码。
只要知道委托的签名,便可以分配自己的委托方法。
将方法作为参数进行引用的能力使委托成为定义回调方法的理想选择。
可以向排序算法传递对比较两个对象的方法的引用。
分离比较代码使得可以采用更通用的方法编写算法。
委托具有以下特点:
委托类似于C++中的函数指针,但它是类型安全的;
委托允许将方法作为参数进行传递;
委托可用于定义回调方法;
委托可以连接在一起,如:
可以对一个事件调用多个方法;
方法无须与委托签名精确匹配;
VisualC#2005中引入了匿名方法的概念,此类方法允许将代码块作为参数传递。
以代