C#编程从基础到应用笔记

基础—>进阶->应用
概念->语法描述->实例描述->实例应用->运行结果->示例分析

第1章 C#入门基础

1.1 C#语言简介

1.2 .net Framework简介

C#是微软2000年6月发布的一种新的编程语言。
C#4.0伴随着.NET Framework 4.0 (或者说Visual Studio 2010)应运而生。

1.2.1 .NET Framework概述

任何程序语言的运行都需要一个开发环境,C#语言的开发环境就是.NET Framework,简称为.NET,也叫.NET 框架。
.NET Framework主要有两个组件:公共语言运行时和.NET Framework类库。公共语言运行时是.NET Framework的基础。.NET Framework类库是一个综合性的面向对象的可重用类型集合,包含很多种类。

1.2.2 公共语言运行时

CLR能够提供内存管理、线程管理和远程处理等核心服务。
CLR包括两个部分:CLS(Common Language Specification,公共语言规范)和CTS(Common Type System,通用类型系统)。

C#数据类型

CLS是指确定公共语言运行时如何定义、使用和管理类型的规范。
CLS定义的规则如下:
	CLS定义了原数据类型,如Int32、Int64、Double和Boolean等。
	CLS禁止无符号数值数据类型。有符号数值数据类型的一个数据位被保留来指示数值的正负,而无符号数据类型没有保留这个数据位。
	CLS定义了对支持基于0的数据的支持。
	CLS指定了函数参数列表的规则,以及参数传递给函数的方式。
	CLS禁止内存指针和函数指针,但是可以通过委托提供类型安全的指针。

1.2.3 类库

核心部分主要包括:
	基础数据类库	例如String类、StringBuilder类、集合和泛型类。
	安全控制	它为.NET安全机制提供一系列的功能。
	数据访问	利用ADO.NET开发数据库的应用程序。
	I/O访问		主要用于文件操作。
	XML			用于描述数据的一种文件格式。

1.3 程序集

1.3.1 程序集概述

1.3.2 程序集内容

静态的程序集可以由4个元素组成:
程序集清单
类型元数据
实现这些类型的Microsoft中间语言
资源集

1.3.3 程序集清单

1.3.4 全局程序集缓存

1.4 命令空间

System	可叫做根命令空间,它包含.NET Framework类库中的其他所有命名空间
System.Data	包含提供数据访问功能的命名空间和类
System.Drawing	包含了提供与Windows图形设备接口的接口类
System.IO	包含了用于读写数据流/文件和普通输入/输出(I/O)功能的类
System.Windows.Forms	定义了包含工具箱中的控件及窗体自身的类
System.Net	包含了用于网络通信的类或命名空间
System.Xml	包含用于处理XML数据的类
System.Text	包含表示ASCII/Unicode和UTF-8等字符编码的类
Using关键字有两个用途,分别表示指令和语句。
Using主要作用为命名空间创建别名或导入其他命名空间中定义的类型。
Using作为语句时,可以用于定义一个范围,在此范围的末尾将释放对象。

1.5 安装Visual Studio 2010

1.6 项目案例1:使用记事本创建应用程序

1.7 项目案例2:创建第一个控制台应用程序

1.8 项目案例3:创建第一个窗体应用程序

1.9 习题

1.10 实践疑难解答

1.10.1 安装Visual Studio 2010的问题

1.10.2 安装Visual Studio2010的配置要求

第2章 C#基础语法

2.1 变量

2.1.1 变量概述

	必须明确变量的命名、类型、声明以及作用域。
	C#中有一点例外,就是允许在变量名前加前缀“@”。这种情况下可以使用“@”加上关键字作为变量的名称。一般情况下不推荐使用前缀“@”作为变量名的一部分。

2.1.2 声明变量

2.1.3 初始化变量

	以下六类中的变量属于初始已赋值的变量
	静态变量、初始已赋值的实例变量、数组元素、值参数、引用参数、在catch字句或foreach语句中声明的变量。

	一下三类中的变量属于初始未赋值的变量
	初始未赋值结构变量的实例变量、输出参数、局部变量,在catch子句或foreach语句中声明的那些除外。

2.1.4 变量分类

	1、静态变量	静态变量默认值为0。
	2、实例变量 没有使用static关键字声明的变量。又称为非静态变量或对象变量。
	3、数组元素	将数组作为成员参数的元素。
	4、值参数
	5、引用参数 
	6、输出参数 
	7、局部变量 如果全局变量和局部变量同名时,则在局部变量的范围内,外部(外面的全局)变量被“屏蔽”,即它在子程序中不起作用,在其他地方起作用。局部变量不会初始化。

2.2 常量

2.2.1 常量概述

2.2.2 声明常量

2.3 数据类型

2.3.1 数据类型分类

	1、值类型	变量直接包含数据
	2、引用类型	变量直接存储其数据的访问地址
	3、指针类型 智能作用在不安全的代码中,和C/C++语言中的指针类似。而且C#中很少使用指针类型。

2.3.2 值数据类型

	所有的值类型都源自System.ValueType家族。
	值类型包括:基本数据类型、结构类型、枚举类型。
	
								常见的整数类型
数据类型说明取值范围对应于System程序集中的名称
Sbyte有符号8位整数-128~127System.SByte
byte无符号8位整数0~255System.Byte
short有符号16位整数-32768~32767System.Int16
ushort无符号16位整数0~65535System.UInt16
int有符号32位整数-2147473648~2147483647System.Int32
uint无符号32位整数0~42994967295System.UInt32
long有符号64位整数-263~263System.Int64
ulong无符号64位整数0~2^64System.UInt64
char无符号16位整数0~65535System.Char

常见的实数类型

数据类型说明取值范围
Flaot32位单精度实数1.5*10-45~3.4*1038
Double64位双精度实数
Decimal128位十进制实数
使用float类型声明变量的值时,必须在数值后面添加后缀F;使用decimal类型声明变量的值时,必须在数值后面添加后缀M(不区分大小写),否则编辑会出错。

布尔类型表示布尔逻辑量:在计算机中占4个字节,即32位存储空间。

2.3.3 引用类型

包括:数组、字符串、类、接口和委托等。
4.接口
5.委托可以说是一个类,它定义了方法的类型(可以说是函数原型),可以将方法当作一个参数传入另一个方法。

值类型和引用类型主要区别:
内存分配不同	值类型分配在栈上,而引用类型分配在对上。
继承不同		值类型继承自System.ValueType,引用类型继承自System.Object。
表示形式不同	值类型有装箱和拆箱两种形式,引用类型只有装箱一种形式。
回收方法		值类型的内存不由GC控制,作用域结束时,值类型会自动释放,减少托管的压力;引用类型的内存会回收,由GC来完成。
继承问题		值类型是密封的,因此不能作为其他任何类型的基类,但是可以继承(实现)接口;引用类型一般都有继承性。
多态性		值类型不具有多态性,引用类型有多态性。
默认值		值类型变量自动初始化值为0,引用类型变量默认情况下的值为null。

2.4 运算符与表达式

2.4.1 运算符

	根据操作数的个数:
	一元运算符
	二元运算符
	三元运算符 (?:)
	根据运算符执行的操作类型:
	算数运算符
	比较运算符
	条件运算符
	赋值运算符
	逻辑运算符
	特殊运算符

2.4.2 运算符优先级

2.4.3 表达式

2.5 数据类型转换

2.5.1 隐式转换

2.5.2 显示转换

	布尔类型不能转换为其他任何数据类型,其他数据类型也不能转为布尔类型。	
	隐式转换和显示转换一般都应用在之数据类型之间,如果用户想要将字符串转换为int类型或double类型,可以使用parse()方法或使用Convert类。

2.5.3 装箱和拆箱

	1、装箱
	将值类型转换为引用类型就叫做装箱。装箱需要三步:
	首先从托管堆中对新生成的引用对象分配内存;然后将值类型的数据复制到刚刚分配的内存中;最后返回托管堆中新分配对象的地址。

2.6 注释

2.7 项目案例1:把整数转换为二进制数

2.8 项目案例2:求圆的面积

2.9 习题

2.10 实践疑难解答

2.10.1 使用引用参数ref

2.10.2 类型转换

2.10.3 三元运算符

第3章 流程控制语句

3.1 基本语句

3.1.1 空语句

3.1.2 语句块

3.1.3 声明语句

3.1.4 表达式语句

3.2 选择语句

3.2.1 if语句

3.2.2 if else 语句

3.2.3 if else_if else 语句

3.2.4 嵌套if语句

3.2.5 switch语句

3.3 循环语句

3.3.1 for语句

3.3.2 while语句

3.3.3 do while语句

3.3.4 foreach语句

3.4 跳转语句

3.4.1 break语句

3.4.2 continue语句

3.4.3 return语句

3.4.4 goto语句

3.5 项目案例1:实现简单的计算器

3.6 项目案例2:百钱买百鸡

3.7 习题

3.8实践疑难解答

3.8.1 多重循环输出等腰三角形

3.8.2 do while的使用

3.8.3 李白喝酒的问题

第4章 数组

4.1数组概述

4.2一维数组

4.2.1 生命数组

4.2.2 初始化数组

type[ ]	arrayName = new type[num] {value1,vlaue2,...,valuen};	
type[] arrayNmae = new type[ ] {value1,vlaue2,...,valuen};
type[ ] arrayName = {value1,vlaue2,...,valuen};;

4.3 二维数组

4.3.1 声明数组

4.3.2 初始化数组

4.4 多维数组

初始化交错数组时,首先设置该数组包含的行数,定义各行中元素个数的第二个括号设置为空,因为这类数组的每一行包含不同个数的元素。

4.5 数组操作

4.5.1 访问数组元素

下标

4.5.2 使用foreach语句遍历数组

4.5.3 对数组排序

冒泡排序速记口诀(升序):N个数字来排队,两两相比小靠前,外层循环N-1,内层循环N-1-i。

4.6 静态数组

由System.Array类来实现。

4.6.1 属性

属性描述
Length数组的长度,即数组所有维度中元素的总数。该值为32位整数
LongLength数组的长度,即数组所有维度中元素的总数。该值为64位整数
Rank数组的秩,即数组的维度数
IsReadOnly表示数组是否为只读
IsFixedSize表示数组的大小是否固定
IsSynchronized表示是否同步访问数组
SyncRoot获取同步访问数组的对象

4.6.2 方法

方法描述
GetValue()获取指定元素的值
SetValue()设置指定元素的值
Clear()清楚数组中的所有元素
IndexOf()获取匹配的第一个元素的索引
Sort()对一维数组中的元素排序
Reversee()反转一维数组中元素的顺序
GetLength()获取指定维度数组的元素数量。该值为32为整数
GetLongLength()获取指定维度数组的元素数量。该值为64为整数
FindIndex()搜索指定元素,并获取第一个匹配元素的索引
FindLastIndex()搜索指定元素,并获取第一个匹配元素的索引
Copy()将一个数组中的一部分元素复制到另一个数组
CopyTo()将一维数组中的所有元素复制到另外一个一维数组
Clone()复制数组
ConstrainedCopy()指定开始位置,并复制一系列元素到另外一个数组中
BianrySearch()二进制搜索算法在一维的排序数组中搜索指定元素
GetLowerBound()获取数组中指定维度的下限
GetUpperBound()获取数组中指定维度的上限

4.6.3 获取数组长度和数组元素的值

4.6.4 数组排序

冒泡排序:速记口诀(升序):N个数字来排队,两两相比小靠前,外层循环N-1,内层循环N-1-i。

4.6.5 复制数组

4中方法:for语句;copy()语句;copyto()方法以及clone()方法。

4.7 动态数组

动态数组由System.ArrayList类实现。

一些方法
方法迷哦奥数
Add( )添加元素到数组的末尾
AddRange( )将集合中的元素添加到数组的末尾
BinarySearch( )使用二分查找法搜索已排序的数组中指定元素
Clear( )清空数组中的所有元素
Contains( )判断数组中是否存在指定的元素
Insert( )插入元素到数组的 指定位置
InsertRange( )将集合中的元素添加到数组的指定位置
Remove( )从数组移除指定的元素
RemoveRange( )从数组中移除一定范围的元素
RemoveAt( )从数组中移除指定的元素
GetRange( )获取数组的一个子集
SetRange( )将集合中的元素复制到数组中一定范围的元素上
IndexOf( )获取指定元素在数组中的第一个索引位置,从数组的开头处开始查找
LastIndexOf( )获取指定元素在数组中的最后一个索引位置,从数组的结尾处开始查找
Sort( )对数组或一部分数组元素进行排序
Reverse )将数组或一部分元素进行反转
CopyTo( )将数组或其一部分中的元素复制到数组中
ToArray( )将数组的元素复制到新数组中

4.7.1 属性

4.7.2 方法

4.7.3 增加元素

4.7.4 删除元素

4.8 项目案例1:求3*4矩阵的所有外侧元素的和

4.9 项目案例2:输出学生的成绩

4.10 习题

4.11 时间疑难解答

4.11.1 数组初始化

4.11.2 数组降序排列

4.11.3 交错数组

4.11.4 for语句数组遍历

第5章 集合

5.1 集合概述

5.2 C#的内置集合

5.2.1 ArrayList集合

5.2.2 Hashtable集合

5.2.3 Stack集合

5.2.4 Queue集合

5.2.5 BitArray集合

5.2.6 SortedList集合

5.3 自定义集合

5.3.1 声明集合

5.3.2 向集合中添加对象

5.3.3 从集合中删除元素

5.3.4 在集合中检索元素

5.4 项目案例:模拟购物车

5.5 习题

5.6 实践疑难解答

5.6.1 Hashtable遍历元素

5.6.2 GetEnumerator()方法的返回值问题

第6章 类编程

6.1 面向对象简介

6.1.1 对象唯一性

6.1.2 抽象性

6.1.3 继承性

6.1.4 多态性

一般情况下派生类会拥有所有积累的属性、方法以及字段等一切特性,如果要改变基类动作有两种解决方案:一种是使用派生类代替基类成员,另一种是重写基类中的虚拟成员。

6.2 类

6.2.1 类声明语法

修饰符	class	类名 [基类或者接口] {类成员}
修饰符可以是:public、	sealed、abstract、protected、internal、private。

6.2.2 类字段

public 可以在任何地方访问该对象字段。
internal	能在本项目中访问该对象字段。
private	智能在本类中访问该对象字段。
protected	能在子类或者基类中访问该对象字段。
static	该修饰符讲一个字段成员指定为静态成员。如果一个字段成员是静态成员,则它将同常量成员一样,属于类本身。如果外界访问该对象字段则需使用“类名.成员名”方式访问。
read only	该字段成员的值只能读,不能写。除了赋予初始值外,在程序的任何一个部分都无法更改这个字段成员的值。
const	将字段声明为常量类型,和read only声明的字段相似。

字段声明为read only和cost的区别:read only所定义的字段在程序运行

6.2.3 属性

属性可以说是字段的延伸,属性有两个核心的代码块,分别是get访问器和set访问器。设置属性的值时会执行set代码块、取属性的值时访问get代码块。

6.3 方法

C#中类的方法分为:无参方法、有参方法、静态方法和非静态方法(实例方法)。

6.3.1 无参方法

修饰符	返回类型	方法名() 
{方法体}

方法的修饰符可以是public、private、internal等。

6.3.2 有参方法

6.3.3 重载方法

在C#语言中两个或者两个以上具有相同方法名称、不同参数个数、不同参数类型的方法称为重载,方法重载与放回类型无关。

6.3.4 Main()方法

6.4 构造方法

构造方法的名称与类名相同,能够在构造方法中定义参数,但是不能有返回类型。

6.4.1 无参构造方法

6.4.2 有参构造方法

6.5 静态方法

定义静态方法时需要在返回类型前加上static关键字,静态方法不属于类的某一个具体的实例,二十属于类本身,所以对静态方法不需要创建一个类的实例。所以当调用静态方法时,只需通过类名便可以实现。

静态成员存在于内存,飞静态成员需要实例化才会分配内存,静态成员不能访问非静态的成员,但是非静态成员可以直接访问静态类中的成员。

6.6 析构方法

析构方法与构造方法相反,当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构方法。析构方法往往用来做清理垃圾碎片的工作(例如在建立对象时用new开辟的一片内存空间,应在推出前在析构方法中将其释放)。

析构方法:智能存在于类中,不能存在于结构中,析构方法没有任何修饰符,不能被显示地调用,没有参数,也就意味着析构方法不能有重载。
使用析构方法的条件是:没有任何代码但是要使用一个实例。

6.7 项目案例:输出不同图形

6.8 习题

6.9 实践疑难问答

6.9.1 访问静态方法出错

6.9.2 返回值出错

第7章 继承及多态

7.1 抽象类和抽象方法

C#中可以使用abstract关键字把类和方法定义为抽象类和抽象方法。抽象类不能实例化,而且抽象方法不能执行代码,必须在非抽象的派生类中重写抽象方法。

抽象类特点:
抽象类智能做父类
抽象类不能实例化,即不能用new关键字来产生属于抽象类的对象。
抽象类中除了抽象方法和普通方法不一样外,其他的部分和普通类一样。即抽象类是普通类的特例,它的特殊之处只是有抽象方法。所以它里面可以有字段、属性、普通方法。

抽象方法特点:
抽象方法是没有方法内容的,只有一个方法名和参数列表。
在方法的返回类型前加abstract。
抽象方法的内容由它的继承类根据继承类自身情况去写。重写这个方法时把abstract替换成override。

如果类中包含抽象方法,则该类为抽象类,但是抽象类中不一定包含抽象方法。

7.2 继承

7.2.1 虚方法和虚属性

7.2.2 隐藏方法

在C#中,当派生类和基类拥有相同的方法(方法名、参数列表以及返回类型相同)时,派生类可以隐藏基类方法,即在派生类中可以创建与基类完全相同的方法,但是执行的过程却不同,并且派生类中使用new关键字显示地声明。

7.2.3 调用基类

7.3 实现继承

7.3.1 继承抽象类

7.3.2 继承中的构造方法

每个类都有一个默认的构造方法,如果想要调用基类有参数的构造方法可以使用Base()方法。

实例化对象时,系统会调用默认构造方法,如果在类中显示定义有参数的构造方法,在这种情况下系统将不会为该类创建默认构造方法。

7.4 实现类的多态

7.5 项目案例1:计算电阻值

7.6 项目案例2:选择不同的商品

7.7 习题

7.8 实践疑难解答

7.8.1 重写基类方法时出错

7.8.2 调用构造方法时出错

第8章 结构枚举和接口

8.1 结构

8.1.1 结构概述

结构是值类型,它对于具有值语义的小型数据结构特别有用。

结构特点:
结构是值类型,分配在栈中,而且结构的实例化可以不用new。
声明结构成员时,不能使用protected或protected internal修饰符。结构类型永远不是抽象的,并且始终是隐士密封的,因此在结构声明中不允许使用abstract和sealed修饰符。
结构不能声明默认构造函数(没有参数的构造函数)或析构函数,但可以声明带参数的构造函数。
结构可以实现接口,但不能从另一个结构或类继承,而且不能作为一个类的基类。

8.1.2 结构成员

8.1.3 结构和类的区别

a|-结构|类
|类型|值类型|引用类型
结构
类型值类型引用类型
分配空间分配在栈中分配在堆中
结构成员所有的结构成员都默认为public变量和常量默认为private
构造函数支持(无参的构造函数不能自定义,默认提供)支持(可以自定义
析构函数不支持支持
初始化变量不支持初始化操作支持
基类所有的结构都继承自System。ValueType它的基类是System.Object
继承不支持,不能继承,也不能被继承支持
初始化可以不使用new进行初始化必须使用new进行;初始化

8.2 枚举

8.2.1 枚举声明

8.2.2 枚举成员

8.2.3 枚举类型转换

基础类型不能隐士地向枚举类型转换,枚举类型也不能隐式地向基础类型转换。枚举类型和基础类型之间必须使用强制类型转换。

8.2.4 枚举的优势和特点

8.3 接口

8.3.1 接口概述

8.3.2 接口成员

8.3.3 接口和抽象类的区别

8.4 项目案例1:实现坐标系统中的点

8.5 项目案例2:简单地使用枚举和接口

8.6 习题

8.7 实践疑难解答

8.7.1 C#中的枚举问题

8.7.2 接口变量为普通对象赋值问题

第10章 构建窗体应用程序

10.1 Windows窗体控件概述

普通窗体
MDI父窗体
大多数的控件都派生于Control类。
基本控件、按钮类控件、图形图像控件、列表类控件以及容器类控件。
属性说明
Name用来表示控件的名称
Text获取或设置控件上的文本
Size控件的大小(以像素为单位)
Location控件左上角相对于其容器左上角的坐标
Font用于显示控件中文本的字体
BackColor控件或组件的背景色
ForeColor控件或组件的前景色,用于显示文本
Cursor指针移过该控件时显示的光标
Enabled指示是否启用该控件,默认为True
Visible确定控件是可见的还是隐藏的,默认为True
事件说明
Click单击组件时触发该事件
MouseUp在鼠标指针在组件上方并释放鼠标按钮时发生
MouseMove鼠标指针移过组件时发生
MouseLeave在鼠标离开控件的可见部分时发生
Validated在成功验证控件后发生
Validating在控件验证时发生
VisibleChanged在更改控件的可见性时发生

10.2 基本控件

10.2.1 Label控件

10.2.2 LinkLabel控件

10.2.3 TextBox控件

10.2.4 MaskedTextBox控件

10.2.5 RichTextBox控件

10.3 按钮类控件

10.3.1 Button控件

10.3.2 RadioButton控件

10.3.3 CheckBox控件

10.3.4 NotifyIcon控件

10.4 项目案例1:用户注册功能的实现

10.5 图形、图像和计时类控件

10.5.1 ImageList控件

10.5.2 PictureBox控件

10.5.3 Timer控件

10.6 列表类控件

10.6.1 ListBox控件

10.6.2 CheckedListBox控件

10.6.3 ListView控件

10.6.4 ComboBox控件

10.7 容器类控件

10.7.1 Panel控件和GroupBox控件

10.7.2 TabControl控件

10.8 项目案例2:图书馆管理系统

10.9 习题

10.10 实践疑难解答

10.10.1 TextBox控件按Enter键进入一下TextBox控件

10.10.2 Notifycon控件的问题

10.10.3 ComboBox控件实现级联菜单问题

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值