课堂笔记c#.docx
- 文档编号:20269252
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:39
- 大小:36.78KB
课堂笔记c#.docx
《课堂笔记c#.docx》由会员分享,可在线阅读,更多相关《课堂笔记c#.docx(39页珍藏版)》请在冰豆网上搜索。
课堂笔记c#
考试大纲
C#
一、.NetFramework的组成:
1.CLR公共语言运行时(commonlanguagerun-time)负责内存的分配与回收,调试等。
a)CTS通用类型系统(commontypesystem):
所有语言共有的数据类型
b)CLS公共语言规范(commonlanguagespecification):
各语言如果相互调用,识别,所必须遵守的一组规定。
2.基础类库(FCL)foundationclasslibrary:
微软已经写好的一些类库---约1.3万。
二、基础知识:
1.常用的数据类型:
int,short,char等,注意:
可空数据类型
c)整数类型
i.有符号整数:
sbyte,short,int,long
●sbyte占有1个字节(8个二进制位),取值范围:
-128~127
●short占有2个字节(16个二进制位),取值范围:
-32768~32767
●int占有4个字节(32个二进制位),取值范围:
-2147483648~2147483647如:
intage=13;
●long占有8个字节(64个二进制位),取值范围:
9,223,372,036,854,775,808~9,223,372,036,854,775,807
longnum=31413L
ii.无符号整数:
byte,ushort,uint,ulong
●byte占有1个字节(8个二进制位),取值范围:
0~255
●ushort占有2个字节(16个二进制位),取值范围:
0~65535
●uint占有4个字节(32个二进制位),取值范围:
0~4294967295
●ulong占有8个字节(64个二进制位),取值范围:
0~18,446,744,073,709,551,615如:
ulongnum=3414324UL
d)浮点数(有小数点)
i.单精度:
float,有效位:
小数点后的7位。
如floatprice=3.0987392F
ii.双精度:
double有效位:
小数点后的15位。
如floatprice=3.0987392222D
iii.decimal有效位:
小数点后的28位。
如floatprice=3.0987392222M
备注:
decimal对应着数据库的money数据类型。
e)布尔数据类型:
bool
只有true和false
f)字符类型
i.单个字符(单引号):
char占有2个字节(16个二进制位)如:
charc=‘a’;
ii.字符串(双引号):
string如:
stringname=“张三”;
g)对象数据类型:
是所有数据类型最终的基类
只有object如:
objectobj=“123”;
h)可空数据类型:
?
如:
int?
age=null;
备注:
把大的数据类型的变量赋值给小的数据类型变量,须强制转换。
如下:
intb=10;
bytec=(byte)b;//强制转换
2.常用的运算符合:
+,-,*,/,%,空连接运算符
i.算术运算符
●一元运算符:
++,--
inti=10;
intj=--i;
intk=j++;i=9j=10k=9
●二元运算符:
+,-,*,/,%
10/3=3;10%3=1;10%4=2;10%5=0;
ii.逻辑运算符:
返回类型永远是布尔类型
●一元运算符:
取非(!
)
boolb=true;
boolr=!
b;rfalse;
●二元运算符:
条件与(&&),条件或(||)
条件与符号的两边都是true的时候,整个表达式是true,只要有一个为false,则整个表达式为false
if((5>3)&&(7>4))
{
//会执行语句
}
条件或(||)符号的两边都是false的时候,整个表达式是false,只要有一个为true,则整个表达式为true
if((5>3)||(4>7))
{
//会执行语句
}
iii.字符串运算符(+)
stringstr=“zhang”+“san”;//str=“zhangsan”;
iv.比较运算符:
==,!
=,>,>=,<,<=
●判断是否相等:
==。
如:
判断3和5是否相等:
3==5
●判断是否不等:
!
=。
如:
判断3和5是否不等:
3!
=5
●判断是否大于>:
如:
判断3是否大于5:
3>5
●判断是否大于等于>=:
如:
判断3是否大于等于5:
3>=5
●判断是否小于<:
如:
判断3是否小于5:
3<5
●判断是否小于等于<=:
如:
判断3是否小于等于5:
3<=5
v.赋值运算符:
=,+=,-=,/=,*=,%=
●给变量赋值:
=如:
intage=10;
●先加再赋值:
+=如:
age+=5;age=age+5;
●-=,/=,*=,%=的算法和上面的一样。
vi.空连接运算符:
?
?
规则:
判断其前面的数据是否为空(null),若不是整个表达式为其前面的数据,否则为其后面的数据。
int?
a=10;
int?
b=null;
int?
c=a?
?
b;
vii.三元运算符:
?
:
规则:
判断?
前面的表达式是否为真(true):
若是,则返回:
前面的那个数据,否则返回:
后面的数据。
简单的说,就是个if..else语句。
intc=(10>9)?
7:
6;
备注:
如果想让那两个数据先运行,则用小括号()括起来。
3.变量的定义:
根据定义的位置不同:
a)字段:
定义在类的里面,方法的外边的变量
b)局部变量:
定义在方法的里边的变量
c)变量的命名规则:
第一个位置必须是字母或下划线或@,但只能包括字母,数字,下划线。
d)格式:
数据类型变量名字(注意:
如果是字段的话,需要前边加上[访问修饰符]:
[访问修饰符]数据类型变量名字)
4.5个访问修饰符:
private,protected,internal,protectedinternal,public。
a)私有的(private):
修饰的变量只能在当前类中访问,而其他类中不能访问。
b)受保护的(protected):
修饰的变量只能在当前类中访问,或当前类的子类(派生类)中访问。
c)internal:
修饰的变量只能在当前程序集(项目)中所有类访问。
d)protectedinternal:
修饰的变量只能在当前类中访问,或当前类的子类(派生类)中访问,在当前程序集(项目)中所有类访问。
e)公共的(public):
修饰的变量在任何类中都可以被访问。
5.常量,只读字段。
常量:
在运行过程中,不能修改常量所保存的值。
关键字:
const,定义的时候必须初始化(给变量赋值)
定义格式:
字段常量和局部常量
字段常量:
[访问修饰符]const数据类型常量的名字=初始值如:
publicconststringsex=“男”;
局部常量:
const数据类型常量的名字=初始值。
如:
conststringsex=“男”;
只读字段:
在运行过程中,不能修改常量所保存的值,但唯一可以修改该变量的值是在类的构造函数中。
关键字:
readonly
一般情况下只有只读字段如:
privatereadonlystringconnStr=“datasource=.”
6.一维数组,多维数组,交叉数组(交错数组)
数组:
包含有相同数据类型的一组数。
格式:
数据类型[]数组的名字
a)一维数组:
方法一:
int[]ages=newint[2]{1,2};//声明并初始化一个一维数组,中括号里的数字为数组中元素的个数。
=ages[0]
方法二:
int[]ages;//声明一个一维数组
ages=newint[6];//初始化一维数组
方法三:
int[]ages={1,3,4};//直接赋值,创建一个含有3个元素的一维数组。
b)多维数组(大于等于2维的数组):
方法一:
int[,]ages=newint[2,3]{{1,2,3},{4,5,6}};//声明并初始化一个二维数组(一个逗号)
方法二:
int[,]ages;
ages=newint[2,3];
方法三:
int[,]age={{1,2,3},{4,5,6}};
Int[,,]三维数组(二个逗号),int[,,,]四维数组(三个逗号),。
。
。
。
。
c)交叉数组:
数组中的数组,其元素是个数组。
Int[][]ages=newint[2][]{newint[2]{1,2},newint[3]{3,4,5}};
7.4个循环。
循环:
重复执行相同的语句
a)for循环
for(数据类型(int)变量的名字=初值;逻辑表达式(循环的次数);循环变量的操作)
{
//循环体语句
}
执行过程:
首先,初始化变量,判读逻辑表达式;是否成立,如果成立,则执行循环体语句,不成立,则不执行循环体语句。
成立的时候,当循环体语句已执行完毕,则进行循环变量的操作,然后在判断逻辑表达式是否成立,
使用场合:
明确知道循环的次数。
b)while循环
while(逻辑表达式)
{
//循环体语句
//修改逻辑表达式
}
执行过程:
当逻辑表达式为真(true)的时候,则执行循环体,否则不执行。
使用场合:
不知道循环的次数,但是在循环的过程中会改变逻辑表达式的结果。
c)do….while(逻辑表达式);
do
{
//循环体语句
//修改逻辑表达式
}while(逻辑表达式);
执行过程:
先执行循环体,修改逻辑表达式的值,然后在判断逻辑表达式是否成立,如果成立,继续执行循环体,否则不执行
使用场合:
无论怎样先循环一次,然后再判断条件是否成立。
d)foreach循环
foreach(数据类型变量关键字(in)数组或集合类)
{
//循环体
}
执行过程:
首先把数组或集合类的第一个元素拿出来赋值给变量,然后进入循环体,完成之后,再把数组或集合类的第二个元素赋值给变量,进入循环体循环,三个,四个。
。
。
。
。
使用场合:
只看看数组或集合类每一个元素,而不能修改其元素值,若有修改的话,则要使用其他的循环。
8.控制结构:
if/else,switch…case语句
a)if…else
结构:
if(条件表达式)
{
//if语句
}
[else{}]
执行过程:
首先判断条件表达式是否为真(true),若是,则执行if语句,否则不执行,
如果有else语句的话,则执行else中的语句。
b)switch…case//代替超过4个if的时候
switch(表达式)
{
case常量1:
//case语句
break;
case常量2:
//case语句
break;
case常量3:
//case语句
break;
。
。
。
。
。
。
default:
//default语句;
break;
}
使用的场合:
当if…else语句超过4个的时候,就可以考虑是该语句。
执行过程:
首先计算表达式的值,然后和case语句后的常量进行比较,若有一个相同的,则执行该case语句,若没有,则执行default语句。
9.值类型,引用类型,拆,装箱,常用的引用类型,值类型。
栈:
一种先进后出(后进先出)的存储数据的结构体
堆:
一块连续的,自由的存储空间。
值类型:
变量直接保存其数据。
引用类型:
变量保存其数据的引用(地址),而不是具体的数据。
值类型:
所有的数值类型(int,short,byte,long,float,double,decimal),结构,枚举等。
引用类型:
所有的类,接口,委托,数组等。
装箱:
把值类型转换成引用类型的过程。
把一个值类型赋值给一个引用类型
拆箱:
把引用类型转换成值类型的过程。
把一个引用类型赋值给一个值类型(需要用装箱的数据类型转换)
objectobj;
shorti=123;
obj=i;//装箱操作
intj=(short)obj;//拆箱操作,需要用装箱的数据类型转换
Console.WriteLine(obj);
10.类,结构,枚举,注意:
结构和类之间的区别
a)类:
存储数据一种结构体,是面向对象编程的基础。
定义类的格式:
[访问修饰符][类的属性]关键字(class)类的名字(首写字母必须大写)如:
publicclassDemoStudent{}
备注:
类是创建对象的模板,只有有了类之后,才可以创建对象。
创建对象的格式:
类名对象名字=关键字(new)类名([参数]);
创建对象的过程:
通过调用类的实例(对象)构造函数,来创建对象。
构造函数可分为2类:
类构造函数和实例构造函数。
类构造函数:
负责在内存构建类,又称为静态构造函数,如果类在内存中不销毁的(也就是说没有被回收掉),只调用一次。
格式:
静态(static)类名(){//语句}
实例构造函数:
类似一个方法,但是没有返回类型。
每创建对象,就调用该函数。
具体格式:
访问修饰符类的名字([参数列表]){},一个类里面可以多个构造函数。
如果一类中没有显式定义一个构造函数,那么在编译的时候,编译器就会给该类创建一个没有参数并且访问修饰符是public的构造函数:
public类名(){},但是一旦给类定义了一个构造函数的话,哪么编译器就不会给该类添加任何的构造函数。
b)结构:
存储数据一种结构体,一般用在算数计算方面。
定义的格式:
[访问修饰符]关键字(struct)结构的名字(首写字母必须大写)如:
publicstructStudent{}
创建对象的格式:
结构名对象名字=关键字(new)结构名([参数]);或者:
结构名对象名字;
创建对象的过程:
通过调用结构的构造函数,来创建对象。
结构的构造函数:
类似一个方法,但是没有返回类型。
具体格式:
访问修饰符结构的名字([参数列表]){},一个结构里面可以多个构造函数。
在编译的时候,编译器总要给结构创建一个没有参数并且访问修饰符是public的构造函数,如果要给结构体添加构造函数的话,只能添加含有参数的构造函数,:
public类名(参数){}
c)枚举:
把所有可能取的数据全部都列举出来,存放到一个称为枚举的数据结构里,但是这些数据必须是整数,并且可一个这些数据起一个名字,用改名字代表具体的数据。
默认的情况下,第一个枚举值所代表的数字是0。
定义的格式:
访问修饰符关键字(enum)枚举的名字
{
枚举值1[=整数],
枚举值2[=整数],
。
。
。
枚举值n[=整数]
}
使用的方法:
枚举的名字枚举变量=枚举的名字.枚举值
11.定义(静态)方法,参数引用的传递:
out,ref,两者之间的区别。
params的使用
定义方法:
格式:
访问修饰符[方法的属性]方法的返回类型方法的名字([形参])
{
//方法体
}
备注方法的名字符合变量的命名规则,但是首写字母必须大写,若含有好几个单词,则需每一个单词的首写字母大写。
若方法不需要返回数据,则是void
如:
publicvoidSetValue(intval)
{
}
方法的调用:
格式:
方法名([实参]);
调用方法时,有传值和传引用的区分,对于传值只是把变量所对的数据传递给方法了,而对于传引用来说,是把把变量的引用(地址)传递给方法了,因此在方法中对变量进行了修改,那么原来的变量也会发生改变。
对于传递引用来说,可以通过,out或ref来完成。
当使用out传递引用的时候,在调用方法之前不必给变量赋值,而在被调用方法结束之前必须给变量赋值。
当使用ref传递引用的时候,在调用方法之前必须给变量赋值。
params:
在定义方法的时候,用来修饰传递可变数目参数,只能用在最后一个形参上,好处是调用方法的时候不必再定义一个数组,而是直接调用。
12.所有类的基类---System.Object
a)publicvirtualboolEquals(Objectobj)作用:
确定指定的Object是否等于当前的Object。
b)
13.字符串的操作
相加“+”如:
“123”+“456”=“123456”
三、面向对象的编程:
三个主要的性质:
封装性,继承性,多态性。
封装性:
把类的实现细节隐藏起来,对其他类来说,只关心方法的调用,而不必关注具体的实现。
System.Console.WriteLine(),对于这个方法来说,我们只知道调用该方法,就可以向控制台输出一句话,而方法的内部实现我们不必关心,这就是类的封装性。
1.由于类的封装性,不允许访问类的私有字段:
定义属性,索引器都有3个类型,对于08来说,要会定义自动化属性。
a)定义属性的格式:
public数据类型属性名字
{
get//获得私有字段所保存的值
{
return//私有字段
}
set//给私有字段赋一个新的值
{
私有字段=value;
}
}备注:
属性的数据类型必须和通过属性所封装的私有字段的数据类型完全一样。
对于属性来说可以分为3类:
如果只有get我们把属性称之为只读属性;如果只有set我们把属性称之为只写属性;如果既有get又有set我们把属性称之为可读可写属性;
怎样访问类的属性:
在其他类中,通过创建封装属性的类的实例(对象),通过该对象可以对属性的操作。
这样可以实现对类私有字段的间接操作(一方面获取字段所保存的值,另一方面给私有字段赋一个新的值)
b)索引器:
封装了类的私有数组的操作,没有名字
定义索引器的格式:
public数组中元素的数据类型关键字(this)[下标]
{
get//根据下标获取数组中该下标所对应的元素
{
//先判断下标是否越界
if(下标>=私有数组元素的个数)
{
thrownewIndexOutOfRangeException(“数组越界”)
}
return私有数组[下标]
}
set//根据下标获取给数组中该下标所对应的元素赋一个新值
{
//先判断下标是否越界
if(下标>=私有数组元素的个数)
{
thrownewIndexOutOfRangeException(“数组越界”)
}
私有数组[下标]=value;
}
}
怎样访问类的属性:
:
在其他类中,通过创建封装索引器的类的实例(对象),通过该对象[下标]的形式来访问索引器。
这样可以实现对类私有数组的间接操作(一方面获取字段所保存的值,另一方面给私有字段赋一个新的值)
2.继承性:
概念:
让派生类(子类)拥有基类(父类)所有的功能。
实现:
通过在派生类后加“:
”冒号,实现继承。
好处:
增加了代码的重用性。
如果一个类没有显示定义其父类,那么他的父类是System.Object,只能有一个基类。
创建派生类对象的时候,默认的情况的下,在派生类通过调用基类的默认构造(访问修饰符是public,并且没有任何的形参)函数来创建基类对象的。
如果基类没有默认的构造,则需要在派生类中显示调用基类的构造函数。
方式:
派生类构造函数():
base(实参)
{
}
a)构造函数:
类构造函数,对象构造函数,派生类调用基类的构造函数。
b)防止继承—密封类,关键字(sealed),该类就不能作为其他类的基类。
3.多态性:
概念:
拥有共同基类的派生类,从基类中继承的方法,都有不同的实现方式。
a)抽象类
抽象方法:
只有方法的声明,而没有具体的实现。
含有抽象方法的类,称之为抽象类。
抽象类或抽象方法都用到了关键字:
abstract
对于抽象类来说,只能作为其他类的基类(不能创建对象),而对于派生类来说,如果派生类不是抽象类的话,哪么要求派生类必须重写(关键字override)基类的所有抽象方法。
在抽象类中可以含有已经实现的方法,不能创建对象。
b)在派生类中使用new隐藏基类的方法。
如果基类不是抽象类,而是含有一个具体实现方法的类,则在派生类中,通过使用new关键字来实现多态。
c)基类是虚方法(virtual),派生类重写(override)基类的方法,注意:
方法的重载的区别。
d)重载:
同一个类中,方法的名字完全一样,但是参数不一样,包括:
1.参数的个数不一样,2。
参数的数据类型不一样
4.接口:
a)定义接口
格式:
访问修饰符(public)关键字(interface)接口的名字(开始字母是大写I)
{
//只能定义属性,索引器,方法和事件
voidPrint();
stringName{get;set;}
stringthis[intidx]{get;set}
}
b)接口的继承
接口之间也可以实现继承,和类与类之间的继承方式完全一样。
派生接口:
基接口
{
//
}
c)类实现接口(当类实现多个接口时,有可能要显式某个或某些实现接口的方法(名字相同))
如果一个实现了某个接口,则必须实现接口中定义的所有的内容。
d)接口作为方法的参数(形参)
凡是实现接口的类的对象都可以作为调用方法的实参进行传递。
e)接口作为方法的返回类型
凡是实现接口的类的对象,都可以作为方法返回值。
四、委托
概念:
类似方法在内存中的首地址,但是它是类型安全的,明确知道方法的返回值类型和参数。
可以这样理解:
对方法的一个间接调用。
定义了委托相当于定义了一个类。
格式:
访问修饰符关键字(delegate)所指向方法的返回类型委托的名字([形参]);
使用方式:
委托的名字委托对象=关键字(new)委托的名字(所指向方法的名字);
委托对象([实参]);
委托的分类:
单播委托,多播委托
单播委托:
所指向方法的返回类型是具体的数据类型(如:
int,short等);
多播委托:
所指向方法的返回类型不是具体的数据类型,而是空(void);
匿名委托,拉莫达表达式
五、异常:
概念:
程序处理不可预知错误的能力。
作用:
增加程序的容错能力。
格式:
Try
{
//把有可能出现错误的语句写在此处
}
Catch(具体的异常异常的变量)
{
//对错误的处理,如果想在把异常抛出的话,用throw;
}
Catch(具体的异常异常的变量)
{
//对错误的处理,如果想在把异常抛出的话,用throw;
}
Catch(Excepton异常的变量)
{
//对错误的处理,如果想在把异常抛出的话,用throw;
}
【Finally
{
//执行资源的清理工作。
如:
释放数据库的连接,释放文件流
}】
异常继承关系:
最重要的属性:
Message,该属性包含的出现错误的详细信息。
对于异常最终的基类:
Exception
异常的结构。
e.Message的使用
六、集合
首先必须添加System.Col
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课堂 笔记 c#