深入了解C#
.NET框架
什么是.NET框架
- 它是开发.NET应用程序的核心基础
- 它提供了一个面向对象的编程环境,完全支持面向对象编程
- 对Web应用的强大支持
- 对Web Service(Web服务)的支持
- 实现SOA,支持云计算
- 支持构建.NET程序的炫彩外衣
.NET框架体系结构
.NET框架运行在操作系统之上,是.NET最基础的框架,它提供了创建、部署和运行.NET应用的环境,主要包含公共语言运行时(CLR)和框架类库(.NET Framework类库,FCL),并且支持多种开发语言。
CLR
CLR的全称是公共语言运行时(Common Language Runtime),它是所有.NET应用程序运行时环境,是所有.NET应用程序都要使用的编程基础。CLR包含两个组成部分:CLS(公共语言规范)和CTS(通用类型系统)。
CTS
CTS通用类型系统(Common Type System)用于解决不同语言数据类型不同的问题。
CLS
CLS公共语言规范(Common Language Specification)限制了由这些不同点引发的互操作性问题,是一种最低的语言标准。
FCL
FCL是.NET框架的一个重要部分,即框架类库。在.NET框架中提供了非常丰富实用的类库,这些类库都是我们进行软件开发的利器例如
System; //此命名空间包含所有其他的命名空间
System.Collections.Generic;//支持泛型操作
System.IO;//支持对文件的操作
System.Net;//支持对网络协议的编程
System.Data;//提供对表示ADO.NET结构的类的访问
System.Windows.Forms;//用于开发Windows应用程序
System.Drawing;//支持GDI+基本图形操作
以上都是一些.NET框架的核心类库及其2功能。
面向对象回顾
类和对象
我们都知道关于类和对象之间的关系:
- 对象是类的具体化;
- 类是对象的抽象化
对于类的属性,我们通过get和set访问器进行访问和设置,用来保障类中数据的安全,如:
- 只写属性:只包含set访问器;
- 只读属性:只包含get访问器;
- 读写属性:同时包含set访问器和get访问器
封装
封装被称为信息隐藏,是指利用抽象数据类型将数据和数据的操作结合在一起,使其构成一个不可分割的独立实体,尽可能隐藏内部的细节,只保留一些对外接口,使之与外部发生联系。
封装主要给我们带来了如下好处:
- 保证数据的安全性
- 提供清晰的对外接口
- 类内部实现可以任意修改,不影响其他类
将字段封装为属性是封装的一种方式,类的私有方法也是一种封装。
C#数据类型
常用的数据类型:
常用数据类型 | Java | C# |
---|---|---|
整型 | int | int |
浮点型 | float | float |
双精度型 | double | double |
字符串 | String | string |
布尔型 | boolean | bool |
枚举型 | menu | menu |
值类型
值类型源于System.ValueType家族,每个值类型的对象都有一个独立的内存区域用于保存自己的值,值类型数据所在的内存区域称为栈(Stack)。
引用类型
引用类型源于System.Object家族,在C#中引用类型主要包括数组、类和接口等。
注意:值类型的值保存在栈中,一旦在代码中修改它的值,它保存在栈中的值都会发生改变。引用类型的值保存在堆中,同时会在栈中保存堆的地址,是指向性的,在修改同一个堆中的值时,才会改变。
结构
当发现一个类中具有的字段都是值类型的,而且个数比较少,此时我们可以用C#为我们提供的结构(Structure)这个数据类型。
结构的定义:
访问修饰符 struct 结构名
{
//结构体
}
注意:结构中可以有字段,也可以有方法。定义时,结构中的字段不能被赋初值。不能手写构造函数,定义构造函数时有多少字段就要有多少个参数,为字段赋值。
关于结构的使用:
注意:
- 可以不用new,直接定义结构的对象即可
- 声明结构的对象后,必须给结构的成员赋初值
- 不new的时候不可以直接调用属性赋值,会报错
装箱和拆箱
装箱:将值类型转换为引用类型的过程
拆箱:将引用类型转换为值类型的过程
注意:在拆箱时,被转换引用类型的数值必须能够转换为目标值类型。其次在实际的开发中,应该尽量减少不必要的装箱和拆箱,因为二者的存储方式不同,转换时性能损失较大。
参数传递
在C#中传递分为:1.值传递 2.引用传递
值传递
- 当使用引用类型作为参数时,当参数被修改时,值也会被修改(String除外)。
- 当使用值类型作为参数时,当参数被修改时,值不会被修改。
引用传递
- 在使用引用传递时,需用ref修饰。
- 当使用引用传递时,不管是值类型或引用类型时,参数所作修改,值都会被修改。
使用集合
数组是一组具有相同类型的数据的集合,但是数组的大小是固定的。从此我们可以想到是否能建立一个动态的“数组”,有了集合。
关于集合
ArrayList
ArrayList非常类似于数组,也有人称它为数组列表,ArrayList可以动态维护。
ArrayList类属于System.Collections命名空间,这个命名空间包含接口和类,这些接口和类定义各种对象的集合。
注意:ArrayList是动态可维护的,因此定义时即可以指定容量,也可以不指定容量。
定义:
using System.Collections;//使用前必须导入System.Collections命名空间
//创建容量为0的ArrayList对象
ArrayList students = new ArrayList();
//创建容量为5的ArrayList对象
ArryaList students = new ArrayList(5);
ArrayList的常用方法及属性
属性名称 | 说明 |
---|---|
Count | 获取ArrayList中实际包含的元素数 |
方法名称 | 说明 |
int Add(Object value) | 将对象添加到ArrayList的结尾处 |
void RemoveAt(int index) | 移除ArrayList指定索引处的元素 |
void Remove(Object value) | 从ArrayList中移除特定对象 |
void Clear() | 从ArrayList中移除所有元素 |
ArrayList获取一个元素的方法和数组是一样的,也是通过索引(index)来访问,ArrayList中的第一个元素索引是0。
注意:由于给ArrayList添加的元素都会被转换为Object型,所以在访问这些元素时必须把它们转化回原来的数据类型。
在遍历ArrayList中的元素,我们可以通过for循环和foreach循环,因为它是通过索引访问的。
//SE为自定义类
//for循环遍历
for(int i = 0; i < engineers.Count; i++)
{