深入.NET平台和C#编程复习
1.
.NET框架的核心结构:
*CLR是.NET框架的基础;
*FCL用于支持开发各种各样的.NET程序;
*CLS是为了规范各个语言间的最低语言标准;
*CTS是用于解决不同语言数据类型的不同的问题。
2. 面试:.NET应用可以跨平台吗?
可以。通过开源项目Mono,可实现在Unix和Linux下运行.NET应用程序。
3. 封装的好处:
● 保证数据安全
● 提供对外接口
● 类内部修改后不影响其他类
*类的私有方法也是一种封装。
1. 数据类型:
分为:值类型 和 引用类型。
值类型:
值类型都存放于单独的内存区域中。存放值类型的内存区域称为“栈”(Stack)。诸如:入栈、出栈、堆栈等。
主要包括基本数据类型和枚举类型。
引用类型:
针对于赋值操作来说,就是将原对象的引用传递到另一个引用。操作的时同一块内存区域。则当此块内存区域的值改变后,相引用关联的对象的值也会一起改变。
引用类型包括数组、类和接口等。
值类型和引用类型对照表
类别 |
描述 |
|
值类型 |
基本数据类型 |
int 整型 |
long 长整型 |
||
float 浮点型 |
||
double 双精度型 |
||
char 字符型 |
||
bool 布尔型 |
||
枚举类型 |
enum 枚举 |
|
结构类型 |
struct 结构 |
|
引用类型 |
类 |
System.Object 基类 |
string 字符串 |
||
class 自定义类 |
||
接口 |
interface 接口 |
|
数组 |
int[],string[]…… 数组 |
*string虽然属于引用类型,但在使用中表现出值类型的特征,即string的值可以被更改。
例如:
int[] infoZhang = new int[]{170,60};
int[] infoLi = infoZhang;
则只要infoZhang或infoLi的任意一个数组改变,则两者都会发生改变,因为他们两个变量都操作同一块内存区域。若两者不互相影响,则new新对象即可。
2. 结构:
为何要使用?
● struct继承于System.ValueType命名空间,属于值类型,值类型存储于内存的堆栈(Heap-Stack)中,速度快;
● class继承于System.Object命名空间,属于引用类型,存储于堆(heap)中,速度没有在栈(Stack)中快。
特点:
● 可具有字段和方法
● 字段不能赋初值
● 可以不用new关键字直接定义结构的对象
● 声明了结构的对象后必须赋初值
使用场合:
struct适合处理较少的字段,因为Heap-Stack资源很有限,不像Heap那样具有较大的空间;否则大量数据应继续采用class来完成,而不是struct。
3. 装拆箱
关系:
*拆箱时,原来装箱的值是何种类型则拆箱时也必须是这种数据类型,否则在强转时会抛出异常。
例如:
int i = 123;
object o = i; //装箱
int j = (int)o; //拆箱
4. 值传递和引用传递
规律:
● 使用值方式传递值类型参数时,修改不保留;
● 使用值方式传递引用类型参数时,保留修改;
● 使用引用方式传递值类型参数或引用类型参数时,保留修改。
只要是对参数进行引用类型的传递或者用ref关键字修饰参数进行传递的,都会保留更改。
注意
看如下例子:
针对String类型的改变值的例子。
未使用ref:
使用了ref:
可以看得出,虽然String类型属于引用类型,原本应该修改掉String变量本身的值,可结果却没有修改掉。
推出结论:虽然String为引用类型,但实际使用中却表现出值类型的特点。(其实,从更本质的方面来说,String根本就不算一种数据类型。)
若想改变字符串的值,则变量前使用ref关键字修饰即可。
1. ArrayList
ArrayList相当于动态数组,称为“数组列表”。既然属于数组,则必定可通过索引访问。且可动态扩充容量,且会将放入的数据装箱。
若要指定大小则在实例化后的括号内填写指定的容量大小即可。
数据的添加
[ArrayList对象] . Add( [数据] );
获取实际元素数
[ArrayList对象] . Count .ToString();
删除元素
● 按照索引删除:
[ArrayList对象] . RemoveAt( [索引位置]);
● 按照对象名称删除:
[ArrayList对象] . Remove( [对象名称]);
2. 集合初始化器
…… = newArrayList()
{
new SE(){Name = “张三”,Gender=26,Height=183} ,
new SE(){Name = “李四”,Gender=17,Height=175},
…………
}
3. HashTable
一种名为“哈希表”的数据结构。其通过键(Key)-值(Value)对来组织数据的,且会将放入的数据装箱。
添加元素
[HashTable对象] . Add( [键] , [值/实际对象/实际值] );
获取元素
String names = (String)[HashTable对象] [ “[键名称]” ];
删除元素
[HashTable对象] . Remove [ “[键名称]” ];
4. ArrayList和HashTable的异同点
|
描述 |
ArrayList |
HashTable |
异 |
访问元素的方式 |
索引、对象名 |
键名称 |
容量自动扩充 |
支持 |
不支持 |
|
遍历方式 |
for、foreach |
foreach |
|
同 |
装箱 |
是 |
是 |
部分属性和方法 |
Count、Clear()、Remove() |
Count、Clear()、Remove() |
5. 泛型和泛型集合
泛型集合可对集合中的元素类型进行约束,提高数据安全性和性能。
泛型集合List
List
既然进行了约束,就不会出现各种各样的数据类型,所以List
泛型集合Dictionary
Dictionary
泛型类
泛型类中可以容纳任意数据类型。此数据类型由程序运行时决定。
public classClassName<T>
{
private T_VALUES; //值类型不定
public TvALUES //运行时由程序决定数据类型
{
get { return _VALUES; }
set { _VALUES = value; }
}
}
1. 构造函数
特点:
● 方法名与类名相同
● 无返回值类型
● 作用是初始化对象
种类:无参构造函数和 带参构造函数 。
执行过程:构造函数当在new时(调用时)就已经执行过了。构造函数先于类的其他方法执行。
系统默认情况下会为类分配一个无参构造函数(隐式构造函数,无方法体);
当手动编写了任意一个类的构造函数后,C#为类默认分配的无参构造函数就失效了,若仍想启用,则只能手动编写无参构造函数。
MSDN官方文档:在C#中,一旦类有了构造函数,就不再自动分配构造函数。
带参构造函数以传参的方式完成对象的初始化工作。
2. 方法重载
方法名相同、参数列表不同的方法称为“重载”。
*重载的方法与方法的返回值毫无关系。
构造函数的重载
构造函数可带有各种各样的参数,所以可以在同一个类中构成重载。
3. 对象的交互
对象间通过 属性和 方法 进行交互。
【第6章】