摘要:摘要:今天我们漫谈C#中的垃圾回收机制,本文将从垃圾回收机制的原理讲起,希望对大家有所帮助。 GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。 但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度。...
阅读全文
摘要:SortedList :有序集合SortedList是和Array的混合。当使用Item索引器属性按照元素的键访问元素时,其行为类似于hashtable,当使用索引访问元素时,其行为类似于Array.Sortedlist在内部维护了两个数组以将数组存储在列表中,一个数组用于键,另一个用于相关联的值,每个元素都可以作为一个DictionaryEntry对象进行访问,因此SortedList一共有三种访问方式。SortedList列表的容量会根据其所拥有的元素个数进行调整,随着向SortedList中添加元素,容量通过重新分配,按需自动增加。索引顺序基于排序顺序,当添加元素时,元素按正确的排序顺序
阅读全文
摘要:定义:所谓泛型,即通过参数化类型实现在同一份代码上操作多种类型的数据,泛型编程是一种范式的转化(在这里体现为类型的晚绑定),他利用参数化类型,将类型抽象化,从而实现代码的灵活复用,精简代码。泛型的好处: a.减少了对对象进行装箱和拆箱所导致的性能成本,提高了效率。 b.赋予了代码更强的类型安全。 c.实现了更为灵活的代码复用。注:1.NET参数化类型不是编译(JIT编译)时被实例化,而是运行时被实例化。 2.由微软在产品文档中提出建议,所有的泛型参数名称都以T开头,这是作为一种编码的通用规范。在定义泛型时,可以对客户端代码在实例化类时用于类型参数的类型施加一些限制,如果客户端代码尝试使用某..
阅读全文
摘要:理解堆与栈对于理解.NET中的内存管理、垃圾回收、错误和异常、调试与日志有很大的帮助。垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存,但这并不代表程序员就无需了解分配的对象是如何被回收的,在一些特殊的场合仍需要程序员手动进行内存管理。在32位的处理器上,每个进程的虚拟内存为4GB,.NET会在这4GB的内存块中开辟出3块内存,分别作为栈、托管堆、和非托管堆堆(heap):堆是从下往上分配,所以已用的空间在自由空间下面,C#中所有引用类型的对象分配在托管堆上,托管堆在内存上是连续分配的,并且内存对象的释放受垃圾收集机制的管理,效率相对于栈来说要
阅读全文
摘要:数据库事务处理是以一个单一的逻辑单元完成一系列的操作,他可以由一系列的Sql语句组成,如果在该事务中包含的操作在执行的过程中没有发生错误,那么他对数据库所作的改变就是永久的,如果一旦有错误发生,它就不会对数据库作任何修改和改变。事务必须是原子工作单位,对于其数据的修改,要么全部执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的,如果系统只执行这些操作中的一个子集,则会破坏事务的总体目标,事务具有ACID属性: Atomic(原子性):事务应作为一个工作单元,事务处理完成,所有的工作要么都在数据库中保存下来,要么完全退回,全部不保留。 Consistent(一致性)
阅读全文
摘要:我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到“面向接口编程”这个短语,那么它是什么意思?有什么思想内涵?和面向对象编程是什么关系?本文将一一解答这些疑问。1.面向接口编程和面向对象编程是什么关系首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。2.接口的本质接口,在表面上是由几个没有主体代码的方法定义组成的集
阅读全文
摘要:先谈谈StringBuilder与String的区别System.String具备不可修改性,在程序中这样的特性容易产生性能问题。针对这一问题,.NET提供了StringBuilder类可以解决类似的问题String与StringBuilder均可以对字符串进行处理,它们具备不同的特点,下面将分别进行说明。String具备以下4个特点: 1.String为引用类型,在堆上分配内存。 2.String对象一旦生成,无法进行修改,如果进行修改操作(并非真正意义上的修改),则会在堆上产生新的对象,同时栈上的引用将指向新的对象。 3.String对象提供了大量字符串操作函数。 ...
阅读全文
摘要:首先我想了解一下什么是装箱和拆箱在类型系统中,任何值类型和引用类型都可以和object类型进行转化,装箱转化是指将一个值类型显式或者隐式的转化为一个object类型,或者是转化成一个被该值类型应用的接口类型,将一个值类型装箱,就创建了一个object实例,并且将这个值赋值给了object,object对象的数据位于堆中,在栈上有对该对象的引用,而被装箱的类型的值是被作为一个复制的文件赋给对象的,所谓拆箱,就是装箱操作的反操作,复制堆中的对象至栈中,并且返回其值。性能损失:相比于简单的赋值操作,装箱和拆箱需要进行大量的计算,对值类型进行装箱时,需要分配并构造一个全新的对象。为了解决装箱与拆箱带来
阅读全文
摘要:1.托管代码首先我们需要了解一下.NET的编译机制,在.NET框架下,编译分为两个步骤完成,第一阶段编译和JIT编译,在第一阶段编译过程中,任何语言都会被编译成中间语言(IL)代码,即托管代码。托管代码实际上就是中间语言(IL)代码,代码编写完以后进行编译,此时C#编译器将代码编译成中间语言,而不是直接在计算机上运行的机器码,程序集(Assembly)的文件负责封装中间语言。托管代码在公共语言运行库(CLR)中运行,这个运行库给运行代码提供各种服务,当代码中的某些方法被调用的时候,CLR把具体的方法编译成适合本地计算机运行的机器码,并且将编译好的机器码缓存起来,以备下次调用时使用,这个过程就叫
阅读全文
摘要:Template Method设计模式主要运用的是虚函数的一些思想,因此我们可以通过这个模式对虚函数的有一个更深刻的认识,首先我们需要了解Template Method 模式它解决的是哪一类的问题:定义一个操作中算法的骨架,而将一些步骤(虚函数)延迟到子类中去实现,Template Method模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。首先我们来提出一个问题:我们需要开发一个程序,程序库(Library)开发人员开发1、3、5三个步骤,应用程序(Application)开发人员开发2、4两个步骤,然后将五个步骤连接起来首先来看一下在Template Method模式没
阅读全文
摘要:singleton模式是所有设计模式当中最简单的一种模式,也是最基本的一种模式在软件系统中,经常有这样一些特殊的类,必须保证它们在系统只只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率,如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例,下面就此问题展开分析。 有人可能会想:我只创建一个对象,然后告诉使用者你只能使用我创建的这个对象,你要是自己创建对象,你去死吧!!,我们要清楚一点,我们写的注释很少有人会去看(除了我们自己),所以如果你让别人去死,别人会活的很潇洒,因此我们不能用这种方式去保证系统的正确性,而是应该使其从语言上就做不到,这就是作为一个设计者的责任。 好吧,既..
阅读全文
摘要:属性使用起来像字段,本质上是方法,属性是类成员重要的组成部分,访问属性和访问公共数据成员一样方便,但是属性的访问机制和公共数据成员的访问机制完全不同,它实际上是调用了内部相应的方法,那我们为什么不直接使用公共数据成员,而要使用属性了,首先我想说一下属性和字段的区别,C#是面向组件的编程,而字段是一个组件的实现细节,实现细节应该隐藏起来,,是不能暴露在组件外部的,应该定义为私有的,而属性是组件提供给外部的访问接口,必须公开。首先我想定义一个学生类,为了紧扣主题,该学生类暂时只包含学生的基本信息:年龄、姓名、学生人数(静态只读)。不用充分考虑,我们肯定会写出这样的一段代码:class Studen
阅读全文
摘要:我为了更好的理解C#中的委托,、泛型委托、匿名方法和Lambda表达式,我把它们的演变过程通过自己的理写了出来,各位高手要是看到有什么不妥的地方,还望指出。首先,我从一个C语言中很简单的一个问题开始,比较两个数的大小,并将最大的数以string 型输出首先来看比较常规的写法:public delegate string DelegateCompare(int Num1,int Num2); //定义委托 class Compare { public static string NumCompare(int Num1, int Num2) { return Num1 >...
阅读全文