C#基础(1)

news/2024/7/20 12:39:05 标签: c#, 内存管理

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类型的通用库既可以用于引用类型,又可以用于值类型。

类别

说明

值类型

简单类型

有符号整型:sbyte、short、int、long

无符号整型:byte、ushort、unit、ulong

Unicode字符:char

IEEE浮点型:float、double

高精度小数: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修饰符,称为虚方法。不允许与static、abstract、override修饰符同时使用。

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

 

4.结构、枚举

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

枚举是一种独特的数据类型,,可以显示的声明byte、sbyte、short、ushort、int、unit、long或ulong。不能是char。

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

 

5.集合

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

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

基于IList接口的集合(如Array、ArrayList、List)或者直接基于ICollection接口的集合(如Queue、Stack、SortedList)来说,每个元素只能包含一个值,对于基于IDictionary接口的集合(如Hashtable、SortedList)来说,每个元素都有一个键和一个值

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命名空间中的所有索引金和下限均为0。Array下限默认也是0,但是使用CreateInstance创建Array类的实例可以定义不同的下限。

列举器

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

同步成员

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

CopyTo方法

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

转载于:https://www.cnblogs.com/bhsc881114/archive/2009/05/17/1458713.html


http://www.niftyadmin.cn/n/1816389.html

相关文章

常用的分隔符有哪三种_土豆、玉米和红薯三种淀粉各有不同,了解本质,不再用错...

文/咖啡小芝士土豆、玉米和红薯三种淀粉各有不同,了解本质,不再用错!淀粉和面粉都是我们生活中,最常见也最常用的两种东西,通常,第一次下厨房的人哪管什么淀粉,还是面粉,在他们眼里样…

教学思路SQL之入门习题《学生成绩》 五、使用视图完成多表查询

视图的概念: 视图对象是一个虚拟的表,虚拟表所包含的结果集是对一个或多个表的查询。视图本身不保存这个结果集,而是保存查询的定义。视图的定义是对已经存在表的查询。使用视图和使用表很类似,可以把视图当做一个表来查询&#x…

shell here文档

原文链接:http://t.zoukankan.com/finlay-p-3265911.html Shell中的here文档  1.名词解释:   以下是维基百科解释: here文档[1],又称作heredoc、hereis、here-字串或here-脚本,是一种在命令行shell(如sh…

multiprocessing python_python进程池:multiprocessing.pool

Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结…

JS Event 鼠标拖拽事件

<!DOCTYPE html><html> <head> <meta charset"UTF-8"> <title>JS Event鼠标拖拽事件</title> <style> #box{width:200px;height:200px;background:#000;position:absolute;} …

shell Linux软件使用记录

shell的工具/功能实在太多了&#xff0c;深感“只有想不到的&#xff0c;没有做不到的”&#xff0c;为了防止以后想不起来&#xff0c;从今天起遇到新的命令就记录一下。 1.here文档 适用于命令行交互 2.translate-shell 翻译 3.jq 解析json 4.readelf 观察elf文件各段格式 5…

二级类别可以随一级类别的变化而变化的下拉选择框

<html><head><title></title><meta http-equiv"Content-Type" content"text/html; charsetgb2312"><meta name"keywords" content"免费资料网:Power By 13886.Com"><link rel"stylesheet…

numpy 矩阵乘法_矩阵乘法的纯Python实现 | 离开Python库!!

点击关注我哦一篇文章带你了解矩阵乘法的纯Python实现在《这篇文章》中&#xff0c;我们有简单提到“矩阵乘法”的相关知识&#xff0c;如果你不记得了&#xff0c;可以复习一下这张图片。想起来了没&#xff1f;本篇文章将深入探讨在没有机器学习库的情况下如何从零实现矩阵乘…