NET平台和C#编程北大青鸟学习笔记.docx
《NET平台和C#编程北大青鸟学习笔记.docx》由会员分享,可在线阅读,更多相关《NET平台和C#编程北大青鸟学习笔记.docx(64页珍藏版)》请在冰豆网上搜索。
NET平台和C#编程北大青鸟学习笔记
478第一章.NETFramework概述
1、.NETFramework简介
.NETFramework包含以下两个主要组件:
▲公共语言运行时(CLR)▲统一的类库集
除了CLR和类库之外,.NETFramework还包括编程语言和ASP.NET。
其中支持.NETFramework的一些编程语言为C#、VC++、VB.NET和Jscript。
2、.NETFramework的组件
.NETFramework由框架类库(FCL)和公共语言运行时(CLR)这两个主要组件组成。
3、C#中常用的命名空间
命名空间用来将具有相关功能的相似类在逻辑上进行分组。
.NETFramework中所有命名空间基本上都是从称为System的公共命名空间形成的,System命名空间又称为根命名空间。
下表是System根下的部分二级命名空间:
命名空间
说明
System.Data
处理数据访问和管理;在定义ADO.NET技术中起重要作用
System.IO
管理对文件和流的同步和异步访问
System.Windows
处理基于窗体的Windows创建
System.Reflection
包含用于从程序集里读取元数据的类
System.Threading
包含用于多线和编写的类
System.Collections
包含不同的接口和类,这些接口和类用来定义不同对象
第二章VisualStudio.NET2003
1、C#应用程序文件简介
创建项目后将在“解决方案资源管理器”窗口显示该项目的内容,其中包括这些文件:
▲HelloWorld.csproj:
它是执行应用程序时运行的启动项目。
因此,在方案资源管理顺中,引文件显示为粗体。
▲App.ico:
它是与项目关联的默认空白图标文件。
▲AssemblyInfo.cs:
该文件包含通用程序集信息。
所有程序集属性都放置在些文件中。
▲Class1.cs:
包含类声明的认,也是我们编程中书写代码的主要文件,并且通常我们会将其重新命名。
第三章C#基础知识
1、C#的基本数据类型:
C#数据类型
大小
默认值
示例
Int
有符号的32位整数
0
Intrating=20
Float
32位浮点数,精确到小数点后7位
0.0F
Floattemperature=40.6F
Double
64位浮点数,精确到小数点后15~20位
0.0D
DoublepressurePoint=
30000.56641D
Decimal
128位浮点数,精确到小数点后28~29位
0.0M
DecimalcashPaid=1200M
Byte
无符号的8位整数
0
Bytegpa=2;
Short
有符号的16位整数
0
Shortsalary=3400;
Long
有符号的64位整数
0L
Longpopulation=23451900;
Bool
布尔值,true或false
False
BoolIsManager=true;
String
Unicode字符串
-
Stringcolor=”Orange”
char
单个Unicode字符
‘\0’
Chargender=’M’;
▓注意:
对于某些数据(如年龄),只就指定为正数。
这种情况下就应使用无符号数据类型。
例如,uint为无符号整型,ulong为长整型。
2、C#中的变量
访问修饰符数据类型变量名称;
C#语言中的变量按如下方式声明:
数据类型后面是一个名,它应符合下面编码规范。
编码标准:
变量命名
▲内联变量(在方法内声明的变量)必须以骆驼命名法声明,而类变量(也称为成员变量)也必须以骆驼命名法声明,但应以一个下划一开头。
▲不应使用匈牙利命名法(如strName或iCount)命名变量。
▲避免使用单个字符(如“x”或“y”)作为变量名,但for循环中除外。
示例1:
3、C#中的常量
<访问修饰符>const数据类型常量名称=常量值;
常量以const关键字时行声明,后面接C#数据类型之一和赋值语句。
ConstintmaxMarks=100;
例如,
编码标准:
常量命名的规则如下:
▲带有私有访问修饰符的常量必须以骆驼命名法声明,并以一个下划线开头。
▲带有修饰符、受保护修饰符的常量必须以帕斯卡命名法声明。
示例2:
演示如何计算钟摆周期。
▓提示:
示例中的程序用Math类的Sqrt()方法计算平方根。
4、C#中数据类型的分类
C#中的数据类型分为两个基本类别,即值类型和引用类型。
值类型的数据存储在内存的堆栈中,因此,值类型表示实际数据。
引用类型表示指向存储在内存堆中的数据的指针或引用。
值类型和引用类型的基本区别在于它们在内存中的存储方式。
值类型只将值存放在内存中,这些值类型数据都存储在堆栈中。
原始数据类型(如int和bool)都属于此类别。
引用类型的内存单元中只存放内在堆中对象的地址,而对象本身存放在内在堆中。
如果引用类型变量的内容赋值是null,则表示未引用任何对象。
将一个数值类型变量的内容赋值给另一个数据类型变量时,变量值被拷贝。
将一个引用类型变量的内容赋值给另一个引用类型时,只是变量的内存地址被拷贝。
示例3:
演示值类型数据类型的用法。
在Test()方法内修改变量val的值不会反映到Main()方法内。
这是因为int型是一种值类型,将该变量传递给Test()方法时,只传递该变量的副本。
因此,即使在Test()方法内该变量的值改变了,由于它属于值类型,也不会反映到Main()方法内
示例4:
演示引用数据类型的用法
变量Val的值是200,这是因为传递给方法的参数属于object类型。
Object类型属于引用数据类型,因此在传递该参数时,不是传递变量值的副本,而是传递该对象的引用(又称地址)。
在“ReferenceDemo.cs”的Test()方法内所做的修改会反映到Main()方法内
下表总结了值类型和引用类型的一般特点:
特点
值类型
引用类型
变量存放的内容
实际值
引用
内存单元
内联(堆栈)
堆
默认值
0
空
传递给方法的参数
复制值
复制引用
第四个特点表明,对值类型执行“=”运算将把值复制给目标变量,而对引用类型执行赋值去运算将把对象的引用复制给目标变量。
5、装箱和拆箱
装箱是允许将值类型(如整数)作为引用类型(如对象)进行处理的过程,而拆箱是允许将引用类型作为值类型进行处理的过程。
代码片段1和2演示装箱和拆箱的概念。
Intval=100;
Objectobj=val;
Console.WriteLine(“对象的值={0}”,obj);
代码片段1:
Intval=100;
Objectobj=val;
Intnum=(int)obj;
Console.writeline(“num:
{0}”,num);
这里,int变量val的值被赋给object变量obj。
将值类型(显式或隐式)转换为引用类型的一过程就称为装箱。
代码片段2:
当将val的值赋给obj对象时,不需要进行显式装箱,系统将自动装箱。
但是将obj对象的值赋给num时,则需要进行拆箱,因为obj属于引用类型,而num属于值类型。
6、运算符的分类
一元运算符公一个操作数。
++和--都是C#语言中的一元运算符。
二元运算符用于处理两个操作数。
C#中常用的二元去处符为+、-、*、/和%
表:
前置和后置自加/自减运算符
表达式
类型
计算方法
结果(假定num1的值为5)
Num2=++num1;
前置自加
Num1=num1+1;
Num2=num1;
Num2=6;
Num1=6;
Num2=num1++;
后置自加
Num2=num1;
Num1=num1+1;
Num2=5;
Num1=6;
Num2=--num1;
前置自减
Num1=num1-1;
Num2=num1;
Num2=4;
Num1=4;
Num2=num1--;
后置自减
Num2=num1;
Num1=num1-1;
Num2=5;
Num1=4;
表:
运算符的分类
类别
运算符
说明
表达式
算术运算符
+
用于加法运算(如果两个操作数是字符串,则该去处符用作字符串连接运算符,将一个符串添加到另一个字符串的末尾)
操作数1+操作数2
-
用于执行减法运算
操作数1-操作数2
*
用于执行乘法运算
操作数1*操作数2
/
用于获得进行除法运算并得到商
操作数1/操作数2
%
用于获得进行除法运算后的余数
操作数1%操作数2
++
用于将操作数加1
操作数1++或++操作数1
--
用于将操作数减1
操作数1――或――操作数1
~
用于将一个数按位取反
~操作数1
比较运算符
>
用于检查一个数是否大于另一个数
操作数1>操作数2
<
用于检查一个数是否小于另一个数
操作数1<操作数2
>=
用于检查一个数是否大于或等于另一个数
操作数1>=操作数2
<=
用于检查一个数是否小于或等于另一个数
操作数1<=操作数2
==
用于检查两个值是否相等
操作数1==操作数2
!
=
用于检查两个值是否不等
操作数!
=操作数2
三元运算符(条件运算符)
?
:
检查给出的第一个表达式expression是否为真。
如果为真,则运算结果为operand1,否则运算结果为operand2。
这是唯一带有三个操作数的运算符
表达式?
操作数1:
操作数2
赋值运算符
=
给变量赋值
操作数1=操作数2
逻辑运算符
&&
对两个表达式执行逻辑“与”运算,该运算符用于检查是否两个表达式都为真
操作数1&&操作数2
||
对两个表达式执行逻辑或运算,该运算符用于检查两个表达式中是否至少有一个为真
操作数1||操作数2
!
对表达式执行逻辑“非”运算。
该运算符用于检查特定表达式取反后是否为真
!
操作数1
强制转换运算符
()
用于将操作数强制转换为给定的数据类型
(数据类型)操作数
成员访问运算符
.
用于访问数据结构的成员
数据结构或者对象成员
表:
快捷运算符
运算符
计算方法
表达式
求值
结果(假定X=10)
+=
运算结果=操作数1+操作数2
X+=5
X=X+5
15
-=
运算结果=操作数1-操作数2
X-=5
X=X-5
5
*=
运算结果=操作数1*操作数2
X*=5
X=X*5
50
/=
运算结果=操作数1/操作数2
X/=5
X=X/5
2
%=
运算结果=操作数1%操作数2
X%=5
X=X%5
0
7、运算符的优先级
优先级(1为最高级)
说明
运算符
结合性
1
括号
()
从左到右
2
自加/自减运算符
++/--
从右到左
3
乘法运算符
除法运算符
邓模运算符
*
/
%
从左到右
4
加法运算符
减法运算符
+
-
从左到右
5
小于
小于等于
大于
大于等于
<
<=
>
>=
从左到右
6
等于
不等于
=
!
=
从左到右
从左到右
7
逻辑与
&&
从左到右
8
逻辑或
||
从左到右
9
赋值运算符和快捷运算符
=+=*=/=%=-=
从右到左
8、C#中的选择语句
①ifelseC#中if结构的语法如下:
If(表达式)
{
//表达式的计算结果为真时执行的一个或多个语句
}
else
{
//表达式的计算结果为假时执行的一个或多个语句
}
在C#中,表达式的计算结果必须为布尔类型。
代码片段3将有助于理解这一点。
Stringval=“hello”;
If(val)
{
Console.WriteLine(“该值为True”);
}
If(val==“hello”)
{
Console.WriteLine(“该值为Trre”);
}
代码片段3:
如果编译器遇到第一个if语句,将出现以下错误:
错误CS0029:
无法将”string”类型隐式转换为”bool”类型
由于第一个if语句中的表达式str的计算结果不是一个布尔值,因此出错。
由于第二个if语句的计算结果为True或False,因此该语句未出现任何编译错误。
②switchcaseC#中switch结构的语法为:
Switch(变量)
{
Case值1:
//语句
Break;
Case值2:
//语句
Break;
Case…
//…
Default:
//语句
Break;
}
在C#中,必须为每个case块指定一个跳转语句(如
Goto语句或break语句),否则,将出现编译器错误。
但是,如果case标签堆叠在一起,则不必指定任何
跳转语句,如下所示:
Switch(variable)
{
Case0:
Case1:
//执行某操作;
}
在两个case标签之间,可以有一个或多个语句。
不必用大括号将这些语句组合起来。
Default子句用于指定找不到匹配项的情况下将执行的动作。
Switch(weekDay)
{
Case1:
Console.WriteLine(“您已选择星期一”);
Break;
Case2:
Console.WriteLine(“您已星期二”);
Break;
Default:
Console.WriteLine(“默认情况下选择星期日!
”);
Break;
}
代码片段4:
9、C#中的循环结构
C#语言中的switch语句与C语言中的swithc语句的一个主要区别在于,前者允许使用string类型的表达式。
与C和Java中的循环结构不同的是,C#中的循环必须包含布尔条件,就像C#的if结构一样,可以在循环中指定一个break语句,便于随时中断循环。
Continue语句可用于跳过当前循环并开始下一循环。
代码片段5:
演示了如何使用break语句和continue语句。
Intcount=0;
Inti=1;
While(true)
{
Cont+=I;
//如果i能被10整除,则此轮循环路过,执行下一轮循环
If(i%10=0
{
Continue;
}
//如果count大于等于100则终止循环
If(count>=100)
{
Break;
}
i++;
}
Do
{
//语句
}while(条件)
While(条件)
{
//语句
}
①while循环②do…while循环
For(初始值;条件;增/减)
{
//语句
}
③for循环
④foreach循环
Foreach(类型元素(变量名)in集合或者数组)
{
//语句
}
Foreach循环一般用于遍历整个集合或数组。
该循环不能用于改变集合或数组的内容。
Foreach结构的语法如下:
示例5:
演示如何在C#中声明和使用foreach循环。
示例5中,foreach循环用于遍历用户提供的字符串input。
此循环使用Char结构的内置方法IsLetter()、IsDigit()、IsPunctuation()检查该字符串中的字母、数字和标点符号。
10、数组
数据类型[数组的大小或者容量]变量名;
数组是同一数据类型的一组值。
C#中的数组属于引用类型。
数组声明如下:
Int[6]arrayHere;
代码片段6:
String[]array2;
Array2=newstring[5];
在代码片段6中,整型数组已被声明含有6个元素。
但在C#中,声明数组时是否定义数组大小是可选的。
这意味着数组中的元素个数也可以稍后在程序中指定。
代码片段7:
代码片段8:
演示在数组声明阶段初始化数组
String[]array3={“top”,”down”,”left”,”right”};
数组命名的编码标准:
数组必须以骆驼命名声明。
例如:
string[4]nameArray=newString();
示例6:
演示如何在C#中声明和使用数组
11、结构
类对实现对象很有用。
但是,胃时候需要将一个对象用作一种内置数据类型,以使加快分配,而不会出现过多的引用重载和开销。
C#的结构可以在其内部定义方法。
学习代码片段9以理解此概念。
……
StructStructName
{PublicintstructDataMember;
//结构中显示声明的构造函数必须带有参数
PublicvoidStructMethod(参数列表)
{
//实现
}
}
……
代码片段9:
从代码片段9可以看出,StructName结构包含一个方法和一个数据成员。
结构确实具有某些局限性。
结构无法像类一样实现继承。
其次,结构属于值类型,而类属于引用类型。
在C#中,值类型实际上是System命名空间中的结构。
例如,long类型是System.Int64结构的别名。
结构命名的编码标准如下:
▲结构必须以帕斯卡命名法声明。
▲用名词或名词短语作为结构名称。
11、枚举
枚举是一组已听数值常量,它们有助于定义具有一组特定值的数据类型。
假设一个程序只要求接收5个值(如Monday、Tuesday、Wednesday、Thursday和Friday)作为工作日的值。
通过指定一个由这些特定值组成的枚举(如WeekDays),并编写一个只接收此枚举作为参数的方法,就可以实现。
……
PublicclassHoliday
{PublicenumWeekDays
{
Monday,Tuesday,Wednesday,Thursday,Friday
}
PublicvoidGetWeekDays(StringEmpName,WeekDaysDayOff)
{
//处理工作日
}
PublicstaticvoidMain()
{HolidayobjHoliday=newHoliady();
objHoliday.GetWeekDays(“Richie”,Holiday.WeekDays.Wednesday);
}
}
……
代码片段10:
C#中的枚举与C中的枚举一样,包含与值关联的数字。
默认情况下,将0值赋给枚举对象的第一个元素,然后对每个后续的枚举元素按1递增。
但是,也可以在初始化阶段将其指定为其他值。
因此,代码片段10可以修改为代码片段11
......
PublicenumWeekDays
{
Monday=1,
Tuesday=2,
Wednesday=3,
Thursday=4,
Friday=5
}
……
代码片段11:
枚举命名的编码标准如下:
▲枚举必须以帕斯卡命名法声明▲枚举符中的可选项也必须以帕斯卡命名声明
第四章在C#中实现OOP概念
1、C#的对象和类
[访问修饰符]class<类名>
{
//类的主体
}
类是对一组具有相同属性和行为的对象的描述。
类的内容称为类的成员。
声明类的语法如下:
其中修饰符可以是私有访问修饰符、受保护的访问修饰符、公共访问修饰符或内部修饰符,它是可选的。
▓注意:
不公简单变量(非引用型变量)可以作为类的成员变量,复杂变量(其他的类,引用型变量)也可以作为类的成员变量,也就是说类的成员变量也可以是一个类。
类命名的编码惯例如下:
给类使应使用帕斯卡命名法。
确保类的名称是一个名词。
Customer、Book、User、Employee、Student和UserName等是有效的类名代码片段1显示现实对象Employee声明为一个类。
……
ClassEmployee
{
//类的主体
}
……
代码片段1:
类的主体包含成员变量和成员方法。
声明成员变量的语法如下:
[访问修饰符]数据类型成员变量;
编码惯例:
成员变量命名
给公共成员变量、受保护的成员变量或内部成员变量命名应使用帕斯卡命名法。
如Score、Name和Status均为有效的成员变量名。
给私有成员变量命名应使用骆驼命名法,并以下划线开头。
例如_age、_length和_radius等。
代码片段2显示如何声明包含成员变量的类。
……
ClassEmployee
{
Privatestring_name;
Privatechar_gender;
Privatestring_qualification;
Privateuint_salary;
}
……
代码片段2:
此时,Employee类包含4个成员变量:
_name、_gender、_qualification和_salary
代码片段3:
显示如何创建对象访问该对象的成员变量
.......
//创建Employee类的对象
EmployeeobjEmployee=newEmployee();
//访问成员变量
objEmployee._name=”张亮影”:
objEmployee._gender=’M’;
objEmployee._salary=5500;
objEmployee._qualification=”ACCPS3”;
…...
2、访问修饰符
表:
访问修饰符(从上到下为可访性由大到小)
访问修饰符
说明
Public
可被所属类的成员以及不属于类的成员访问
Internal
可当前程序集访问
Protected
可被所属在或派生自所属类型访问
private
仅所属类的成员才可以访问
PublicstringemName=”张亮影”;//public变量
Protectedbooldepartment//protected变量
PrivateintempCode;//private变量
以下声明说明如何在C#程序中使用访问修饰符。
如果对类不指定访问修饰符,则类的默认访问修饰符为internal,但是类成员的默认访问修饰符为private。
3、构造函数和析构函数
[访问修饰符]ClassName()
{
//构造函数的主体
}
代码片段3说明了如何初始化成员变量,但这些变量都是使用点符号来显式初始化的。
有时候可能需要将变量初始化为某个默认值。
例如,大多数公司要求的招聘条件为“大学毕业生”。
在这种情况下,需要有一种机制自动将_qualification变量初始化为默认值“大学毕业生”。
C#提供