随笔分类 -  基础知识

谈谈.NET中常见的内存泄露问题——GC、委托事件和弱引用
摘要:其实吧,内存泄露一直是个令人头疼的问题,在带有GC的语言中这个情况得到了很大的好转,但是仍然可能会有问题。一、什么是内存泄露(memory leak)?内存泄露不是指内存坏了,也不是值内存没插稳漏出来了,简单来说,内存泄露就是在你期待的时间内你程序所占用的内存没有按照你想象中的那样被释放。因此什么是你期待的时间呢?明白这点很重要。如果一个对象占用内存的时间和包含这个对象的程序一样长,但是你并不期望是这样。那么就可以认为是内存泄露了。用具体例子来说明如下:class Button { public void OnClick(object sender, EventArgs e) { ..... 阅读全文
posted @ 2013-05-22 11:12 一路转圈的雪人 阅读(4761) 评论(11) 推荐(14) 编辑
说说什么是表达式树,如何使用表达式树(未完)
摘要:Lambda表达式可以转换成为委托或者表达式树,转换成表达式树以后,我们可以通过解析表达式树来按需求实现自己的逻辑。 比如想表达加法,用中文写就是 “二大于一” ,用数学来表达就是 "2>1",我们想表达的抽象概念就是大于,和具体的形式无关。因此表达式树中就有表示GreaterThan的一种Type,表达的就是这么一种大于的抽象概念。它可以由编译器把lambda表达式 ()=> 2>1 编译成我们所需的表达式树,然后我们再通过解析这个表达式树,把抽象概念翻译成我们所需的“二大于一”这种中文的具体形式。 阅读全文
posted @ 2012-12-30 14:09 一路转圈的雪人 阅读(1311) 评论(3) 推荐(0) 编辑
指向指针的指针和对引用对象使用ref
摘要:把引用对象作为参数传进一个方法,实际上是在栈上新分配了一块内存保存传入的地址。如图所示,把局部变量name传入M2方法后,栈上新开了一块内存S,用来保存"joe"的地址。其实拿string来说明不太合适,因为string类是不可变的。但是为借用CLR VIA C#中现成的图咱们就将就一下了。这时如果能够直接修改s所指向的内容的话(在C#中string是不可变类,无法演示),外部的局部变量name由于和形参s指向的是同一个对象,因此name也会改变。(图1)但是如果把s指向一个新的的string时,比如:void M2(string s){ s = "new str 阅读全文
posted @ 2012-03-11 21:43 一路转圈的雪人 阅读(1852) 评论(2) 推荐(0) 编辑
还要谈谈Equals和GetHashcode
摘要:这篇随笔和上篇随笔《从两个数组中查找相同的数字谈Hashtable》都是为了下面分析Dictionary的实现做的铺垫一.两个逻辑上相等的实例对象。两个对象相等,除了指两个不同变量引用了同一个对象外,更多的是指逻辑上的相等。什么是逻辑上相等呢?就是在一定的前提上,这两个对象是相等的。比如说某男生叫刘益红,然后也有另外一个女生叫刘益红,虽然这两个人身高,爱好,甚至性别上都不相同,但是从名字上来说,两者是相同的。Equals方法通常指的就是逻辑上相等。有些东西不可比较,比如说人和树比智力,因为树没有智力,所以不可比较。但是可以知道人和树不相等。二.Object的GetHashcode方法。计算Ha 阅读全文
posted @ 2012-02-26 13:28 一路转圈的雪人 阅读(5581) 评论(2) 推荐(1) 编辑