分享

C#基础(1)

 碧海山城 2010-06-08

1.程序的内存类型

C#程序能够使用三种类型的内存:堆栈(stack)、托管堆(managed heap)、非托管堆(unmanaged heap

a. 堆栈

每一个进程和线程都具有自己的一块堆栈内存,用它来存放私有的数据。不能被其他的进程和线程访问。

堆栈的一个重要特性就是 “后进先出”,如果堆栈指针超出了堆栈的范围,就会出现堆栈溢出错误。.NET框架的堆栈检查机制确保不会出现堆栈溢出错误,因为,.NET框架程序的堆栈是安全的。

堆栈的性能很高,但是不太灵活,只能分配固定大小的数据类型,而且数据的生存期必须是有序的。

b. 托管堆

托管堆是由.NET框架公共语言运行时的自动内存管理来实现的。初始化新进程时,公共语言运行时就会为进程保留一个连续的地址空间区域,就是托管堆。

托管堆维护着一个指针,用它指向将在堆中分配的下一个对象的地址。每创建一个对象,都会在上一个对象的后面的地址空间内为它分配内存。只要地址空间可用,垃圾回收器就会继续以这种方式来为新对象分配空间

垃圾回收器在执行回收的时候,会释放应用程序不再使用的对象的内存。它通过检查应用程序的根来确定不再使用的对象。每个应用程序都有一组根。每个根或引用托管堆中的对象,或者设置为空。应用程序的根包含全局对象指针、静态对象指针、线程堆栈中的局部变量和引用对象参数,以及CPU寄存器

垃圾回收器可以访问由即时编译和运行维护的活动根的列表。垃圾回收器对照列表检查应用程序的根,并在此过程中创建一个图表,图表中包含所有可以从这些根访问的对象。

c. 非托管堆

非托管堆不受.NET框架的控制,是windows管理内存,因此.NET框架的垃圾回收器不能回收释放非托管堆中的内存,需要程序员自己负责释放。

2.类型

C#是完全面向对象的语言,它的所有数据类型都是类。C#语言的类型划分为两大类:引用类型和值类型

值类型和引用类型的不同之处在于:值类型的变量直接包含数据,而引用类型的变量存储对数据的引用(reference)。于引用类型,两个变量可能引用同一个对象,因为对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响到另一个变量

C#的类型是统一的,每个类型都直接或者间接的从object类派生,而object是所有类型的最终基类。引用类型的值被当做“对象”来处理。值类型的值则通过执行装箱/拆箱操作按对象处理。由于这种统一性,使用object类型的通用库既可以用于引用类型,又可以用于值类型。

类别

说明

值类型

简单类型

有符号整型:sbyteshortintlong

无符号整型:byteushortunitulong

Unicode字符:char

IEEE浮点型:floatdouble

高精度小数:decimal

布尔型:bool

枚举类型

Enum E{....}形式的用户定义的类型

结构类型

Struct S{....}形式用定义的类型

引用类型

类类型

所有其他类型的最终基类:object

Unicode字符串:string

Class C{....}形式的用户自定义类型

接口

Interface I{....}形式的用户定义的类型

数组

一维和多维数组

委托

Delegate T D(....)形式

基本类型

编译器直接支持的类型叫做基本类型(primary type)。基本类型名都是关键字,代码可以使用简单的语法来操作基本类型,基本类型是构造其他类型的基础数据类型。

C#的基本类型实际都是.NET框架类库中的CTS类型的映射,都是从System.Object派生而来的。因此,一种基本类型实际上都是一种CTS类型的别名

3.

a. 隐藏方法

在子类中可以使用与基类的成员相同的名称或签名来声明成员,这种情形下,在子类中不可以访问基类的同名成员,这叫做子类成员的隐藏类基本成员。在子类成员的声明中使用new修饰符。

new public void F()

{

}

b. 虚方法和重写方法

虚方法带virtual修饰符,称为虚方法。不允许与staticabstractoverride修饰符同时使用。

如果实例中含有override修饰符,则称该方法为重写方法。重写方法只能用于重写基类的虚方法

4.结构、枚举

结构主要用于组织数据,它的优势是,由于是值类型,因此开销小,效率高。结构不支持继承,因此始终是密封的,但可以实现接口。

枚举是一种独特的数据类型,,可以显示的声明bytesbyteshortushortintunitlongulong。不能是char

System.Enum类型是所有枚举类型的抽象基类,它本身并不是枚举类型,而是一个类。System.Enum类的派生方法和属性可以用在枚举类型的值上。比如GetNames可以用来获取所有的枚举名,GetValues可以用来获取所有的枚举值。

5.集合

C#的集合是基于System.Collections.ICollection接口、System.Collections.IList接口、

System.Collections.IDictionary接口来实现的。IList接口和IDictionary接口都是从ICollection接口派生的,因此所有集合都间接或直接的实现了ICollection接口。

基于IList接口的集合(ArrayArrayListList)或者直接基于ICollection接口的集合(QueueStackSortedList)来说,每个元素只能包含一个值,对于基于IDictionary接口的集合(如HashtableSortedList)来说,每个元素都有一个键和一个值

System.Collections.ICollection继承了System.Collections.IEnumerable,并没有添加任何成员,完全等价于IEnumerable。因此所有的集合类都必须实现System.Collections.IEnumerable接口,实现了这个接口就能一一列举集合类包含的数据元素:

public interface IEnumerable{

IEnumerator GetEnumerator();

}

GetEnumerator方法返回一个能够访问集合中数组的列举器,必须实现System.Collections.IEnumerator 接口:

public interface IEnumerator {

Boolean MoveNext();

Object Current{get;}

Void Reset();

}

列举器用于读取集合中的数据,但不能轻易修改基础集合。创建集合对象后,列举器应首先定位于集合中第一个元素前。Reset方法用于将列举器返回到此位置,此时,调用Current属性会引发异常。

容量和计数

前者是可以包含的元素的数目。计数是它实际包含的元素的数目。

下限

集合的下限是其第一个元素的索引。System.Collections命名空间中的所有索引金和下限均为0Array下限默认也是0,但是使用CreateInstance创建Array类的实例可以定义不同的下限。

列举器

列举器用于循环访问集合的对象,可以看成是指向集合中任何元素的可移动的指针。一个列举器只能与一个集合关联,但一个集合可以具有多个列举器。

同步成员

同步在访问集合的元素时提供线程安全。默认情况下,集合不是线程安全的。System.Collections只有几个类提供Synchronize方法,该方法能够超越集合创建线程安全包装。但是,System.Collections命名空间中的所有类型都提供SyncRoot属性,可派生类创建自己的线程安全包装。还提供了IsSynchronized属性以确定集合是否是线程安全的。

CopyTo方法

CopyTo方法可将所有集合复制到数组中;但是,新数组中元素的顺序基于列举器返回他们的顺序。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多