第一章 .NET与C#
1.1初识C#
●2000年6月22日,微软公司正式推出其战略核心产品:Mcrosoft .NET(简称.NET)。.NET提供了一套含数据库服务器和web服务器在内的运行平台、一套全新的编程模型,一套可编程的web service和一种简单一致的访问应用程序、服务和设备方法。.NET致力于将手机、PDA、浏览器和门户应用程序集成在一起,形成一个统一的开发和运行环境。目前已经有了使用与pc、智能设备、嵌入式设备的.NET环境,而开发工具Visual Studio .Net则提供了开发web service和这些设备应用程序的统一环境。
●.NET是一个运行时平台也称为.NET框架(.NET Framework)。CLR(Common Language Runtime)通用语言运行时,是.NET应用可以扩展到不同平台和设备上,和java的虚拟机有点类似。
●.NET是一种开发平台,为了开发.NET应用,微软推出了强大的开发平台Visual Studio .NET,它包含了C#, Visual Basic .NET,Visual C++,.NET等多种开发语言。
●C#是.NET的核心开发语言。C#是专门为.NET量身定做的,因此是.NET的最佳开发语言,其次,C#是一种基于现代面向对象设计方法的语言。
1.2 C#的优势
C#简单,现代,面向对象;强大灵活,单词不多,模块化!
面向对象的语言最重要的是封装,继承和多态。封装指的是将功能放在单个组件中;继承是一种将已有的代码和功能扩展到新的程序和组件中的结构化方式;多态指的是适应所需完成的工作能力。
1.3 使用C#创建程序时,应该按类似下面的步骤进行:
1,确定目标;
2,确定编写程序时采用的方法;
3,创建程序,以解决问题;
4,运行程序,以查看结果。后两步,称为程序开发周其。
程序开发周期;
1,创建源代码;写包含源代码的文件,源代码是系列指示计算所执行完成的任务的语句和命令。
C#编辑器: CodeWrite 一个为Asp ,XmL HtmL C# Ped Python提供支持的编辑器. www.prernia.com下载
EditPlus JEdit java编辑器,也可以用于C#, Duncan Chen开发的Poonman IDE; SharpDevelop 开源编辑器!
2,执行C#程序:
C#程序在通用语言运行阶段环境CLR中运行;移植性好;程序必须由编译器把源程序翻译为机器语言编译器利用源代码生成一个磁盘文件,该文件包含与源代码 语句对应的机器语言指令。对于C#编译器,并不生成机器语言文件,而是生成一个中间语言文件IL,这种文件不能被计算所直接执行它需要进一步的翻译或编 译,以便计算机能直接执行它,这项工作由CLR运行阶段环境完成。CLR对IL文件做最终的编译,即可移植的IL代码转换为计算机能够理解运行的语言(机 器语言),CLR实际上只编译程序中将被使用的部分,这样就可以节省时间,另外IL文件中的某部分被转换为汇编语言后,便无需再次进行编译,因为编译后的 代码将保存,以后该部分被执行时,将直接使用编译后的代码。
由于运行阶段环境需要编译IL文件,首次执行后,会慢些一此,以后就不会存在这样的问题,因为被执行的将是完全被编译的版本。
C#程序在最后一刻编译的特性被称为即时编译。
3,编译C#源代码:
创建IL文件,要使用C#编译器, CSC命令;
编译后,将得到一个IL文件,查看目录中的文件清单,扩展名为 .exe 的新文件,该文件是编译后的程序,称为组合体Assembly,能够在CLR上运行。组合体文件包含CLR为执行程序所需要的所有信息。
4:完成开发周期:
程序被编译为IL文件后,使用可以在命令行下输入其名字来运行它。就像运行其它程序一样运行它。
C#开发周期:
1:使用编辑器写源代码 .cs
2: 使用C#编译器对程序进行编译。 生成一个.exe .dll组合体文件,
3:在安装了C#运行环境CLR机器上运行程序。
命令窗口运行的程序,必须在命令行窗口运行,不然,你会看不到运行结果,一闪就过了!
编译错误信息,有时显示某行而不是,还有时显示有多个错误,而只有一个错误点。编译器显示错误并不完成正确,有时他会做猜想。
1.4 C# 程序的类型:
C#可以创建的应用程序类型: 控制台应用程序, Windows应用程序,Web服务, Web表单,ASP.Net应用程序(在WEB服务器上执行)还可以创建库,控件。
1.5 C#应用程序的基本组成部分:
空白:空白可以由空格,制表符,换行符,回车组成! 这一术语源自在纸上看不到空格。编译器会忽略空白,使用空白有利于代码可读性。
C#关键字:
字面值:字面值是直观的硬编码值,它们的值与你看到的值一致,例如数字3和3.145都是字面值,被标记在双引号之间的字符串的文本,是字面文本。
标识符:变量的名字 C#应用程序的结构: C#表达式和语句: 表达式类似于短语,是由关键字组成的代码片段 Pi=3.145;
空语句:
单个分号可以自成一行,这种语句不执行任何操作,由于其中没有任何表达式需要执行,因此这种语句被称谓空语句。
分析程序清单:
注释;空白;Using语句;类声明;标点字符;Main();声明语句;赋值语句;调用函数;
面向对象编程:
面向对象的概念;封装;多态;继承;重用;
对象和类:
类是用于创建对象的定义。 类可以创建大量的对象。
显示基本信息:
{0} 是一值的占位符,花括号表明这是占位符,0是一个指示器,值和文本之间用逗号隔开;
使用变量存储信息:
变量: 变量名;使用变量;声明变量;给变量赋值;初始化变量;
第二章 C#编程基础
2.1 C#数据类型:
数据类型 |
值类型 |
引用类型 |
简单类型 |
枚举类型 |
结构类型 |
类(class) |
接口(interface) |
数组(array) |
Object |
委托(delegate) |
String |
简单类型:系统预置的,一共有13个数值类型,如下:
类型 | C#关键字 | 说明 | 范围和精度 |
布尔类型 | bool | 逻辑值(真或假) | true,false |
整数类型 | sbyte | 8位有符号整数类型 | -128—127 |
byte | 8位无符号整数类型 | 0—255 | |
short | 16位有符号整数类型 | -32768—32767 | |
ushort | 16位无符号整数类型 | 0—65535 | |
int | 32位有符号整数类型 |
| |
uint | 32位无符号整数类型 |
| |
long | 64位有符号整数类型 |
| |
ulong | 64位无符号整数类型 |
| |
char | 16位字符类型 | Unicode 字符 | |
实数类型 | float | 32位单精度浮点类型 |
|
double | 64位双精度浮点类型 |
| |
decimal | 128位高精度十进制数类型 |
|
sizeof(int)指出变量的大小;
int x=20; string s="hello" 20 hello 都是字面值,可以赋给变量;数值型字面值,整型字面值的默认类型int;浮点数字面值的默认类型double; 布尔型字面值 false true,字符串字面值;
常量:
将一个值存储到变量中,并固定它,不希望再改变它。 一旦赋值,就不能修改。
const PI =3.2455; 变量名全部大写,
引用类:
引用类中,string类和object类是比较特殊的类型,object类是c#中所有类型(包括所有值类型和引用类型)的根类。String类型是一个从object类直接继承的密封类型(不能再被继承),其实例表示unicode字符串。
引用类型的变量不存储他所代表的实际数据,而是存储实际数据的引用。引用类型分两步建立:首先在堆栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(即内存的首地址)赋值给引用变量。
例如:
String s1,s2;
s1=“abcd“;s2=s1;
装箱:值类型——>object类型
拆箱:相反,但是必须进行强行转换
使用运算符:
运算符的类型:
基本赋值运算符;算术运算符;关系运算符;条件运算符;其他运算符(is as 类型,大小)。
单目运算符,是指操作数只有一个;
双目运算符,操作数只有两;
三目运算符,操作数有三个,只有一个三元运算符;
标点符号:
分号,逗号,花括号,圆括号(能够改变执行顺序)--------常用于函数中。
复合赋值运算符=====算术赋值复合运算 += ,-=, *= , /= , %=
执行单目数学运算:
递增运算符++ ,递减运算符 --; ++前置,先递增,后执行, 后置 后递增.
if(x !=x); 后面有一个分号,下面的语句被执行
条件和运算符&& ,条件或运算符 || ;
逻辑接位运算符;
操作数的提升 : 是指数值类型之间的计算, byte a=2; int b= 3; int c=a+b; byte类型的a , 提升到int类型。
在内存中存储变量;
移位运算符; >> 右移, <<左移
逻辑运算符,逻辑按位运算符, | & ^ ~ 逻辑或按位运算符,逻辑与按位运算符.
控制语句:
控制程序流程:选择语句;循环语句。
if switch () 两个选择语句;
if语句是可以嵌套的,嵌套指的是一个语句包含别一个语句,几乎所有的C#流程命令都可以嵌套。
if语句的层叠;是指将else和另一个if组合在一起。
if()
....
else if() //这就是层叠
......
else if()
........
else
................
如果if或else内只有一条语句,则无需使用花括号将其括起来,仅当多条语句才这样做。
switch(value)
{
case 1:
......
break;
case 2: //冒号
.................
break; //不要忘记break 它指明了 case 语句的结束
default:
...............
break;
}
swith (value)
{
case 1: // case 语句分组的情况,也就是1 3 5将执行同样的语句
case 3:
case 5:
Console.WriteLine(" 值为1,3,5都会执行同样的语句");
break;
case 2:
case 4:
case 6:
Console.WriteLine(" 值为2,4,6都会执行同样的语句");
break;
}
以上结构要记住,Case 语句之间的代码不能被跳过,如果将 case 语句分组,则 case 语句之后不能有任何代码,只能将代码放在每组中最后一个 case 语句的后面。
执行多个case语句:
在C#使用goto命令来实现,跳转到别的 case 语句 ,或 default 命令。goto case 5;
switch ()语句的控制类型,是数值类型,字符类型,或者是enum 枚举类型。
使用循环语句:
while ()
{
}
do
{
}
while ();
for (; ; )
{
}
foreach ()
{
}
中断和继续while 语句,break continue 语句 进入到下一次的循环 continue 语句的作用会把程序控制直接转到 条件测试的语句,其后的语句不会被作用。即回到 while语句的开始位置,重机新检查条件。
for语句的某部分可以使用多个表达式,则需要用逗号将它们分开。
for(x=1,y=1;x+y<100; x++, Y++)
还可以省略某些部分
for(x=0 ; ++ x<=10 ; System.Console.WriteLine("{0},x"))
注意:不要在for 语句中完成太多的工作,这样会过于复杂,难以理解。
break 语句,跳出循环,执行其后面的语句; 退出当前循环,
continue 语句 返回到条件测试语句处; 开始下一个循环.(P135)
使用 goto 语句(使用不当会使结构混乱)
三种使用方式:
一是在 switch ()中,goto case ,二是goto default 三是,定义一个标签,goto label; 转到标签语句.
标签语句,只不过是一个指示位置的命令,格式, label _name : abc: 定义了一个abc 标签 可以实现在程序中跳转执行。
数组
数组分为:一维数组,二维数组,三维数组,多维数...
交错数组,数组的数组;
多维数组概念的理解;
int[,] arr2=new int[,]{{1,2,3},{4,5,6}}; //二维
int[,,] arr3=new int[,,]{{{1,2,3}},{{4,5,6}}}; //三维
int[,,,] arr4=new int [,,,]{{{{1,2,3}}},{{{4,5,6}}}};//四维
访问数值元素5
二维索引: arr2[1,1]
三维索引; arr3[1,0,1]
四维索引; arr4[1,0,0,1]
多维数组记忆总结:
1;方框号里有几个逗号, +1就是几维数组,几维数组下标索引访问,方框里的索引符就会有几个数字.
2;方框号里的逗号,表示数组初始化时的,最外层花括号里面每个数组元素,有几层花括号,二维就一层花括号。
3;注意:多维数组,是可以用for 或者 foreach 进行迭代读取访问的!
array.Length 多维数组的长度是指,数组元素的个数,不要被多维给迷惑了! 上例中的四维也就6个元素,长度为6;
交错数组(元素为数组的数组)
交错数组与多维数组可以混和使用;
int[][] aar2=new int[3][];
arr2[0]=new int[]{2,3,4};
arr2[1]=new int[]{1,2,4,5,6,7};
arr3[2]=new int[]{1};
arr2[0][1] 元素3
arr2[1][2] 元素4
第一个方括号代表交错数组的数组元素,第二个方括号代表,元素是数组的访问方括号
访问方法
arr2[1][1,1] 元素7
arr2[2][2,2] 元素8
三元运算符在数组中作为空格的使用
i<(arr.Length-1)?" " :""
记作上面的用法
//读取多维数组的方式
int[,] myarr=new int[,]{{2,3},{4,5},{6,7},{8,9},{0,1}};
for(int i=0; i<4;i++) //不要使用myarr.Length的长度来表示4,会出现异常
{
for(int j=0;j<2;j++)
{
Console.WriteLine("Element[{0},{1}]={2}",i,j,myarr[i,j]);
}
Console.WriteLine();
}
第二个方括号是有关元素数组的定义,int[3][,] arr2[1][1,1] 。
int[][][] aa=new int[2][][];
aa[0]=new int[1][]{new int[]{2,3}};
aa[1]=new int[2][]{new int[]{2},new int[]{2,3,4}};
还可以进行多数组进行声明定义,数组的数组的数组,
元素为交错数组
int[][][][] bb=new int[2][][][];都可以定义
ref out 关键字参数传递
ref 作参数传递之前,调用方必须先为其赋值初始化; //传递数组时,可以改变数组的值arr[0]=2;
out 作参数传递之前,调用方不必为其赋值初始化;
隐式类型的数组;
var arr=new[]{2,3,4};
var arr2=new[]{new []{2,3,4,5},new []{2,3,4}}; //交错数组
注意:new后面是没有类型说明符的 new[] ;
数组实例的类型是从数组初始值设定项中指定的元素推断而来的。
交错数组就像一维数组那样使用 new [] 进行初始化。不支持隐式类型的多维数组。
对象初始值设项中的使用隐式类型的数组;
创建包含数组的匿名类型时,必须在该类型的对象初始值设定项中对数组进行隐式类型化,new[]{}隐式
类型化,就是
指不包含类型符 new int[],不像这样使用。
readonly 关键字
只能在初始化时设定值,或在构造涵数中设定值!
readonly 数组,只读数组,可以改变数组的值。