摘要:在动态编程时,我们常常需要运行时确定调用对象的哪个属性或哪个方法。这个任务通常可以用反射来解决。但众所周知,反射的性能要比静态指定的方式低很多,因为反射要通过运行时复杂的机制完成。能否获得性能和灵活性兼备的动态调用?我在开发VBF的最新功能时反复考虑了这个问题。我们通常动态调用一个对象的属性是采用这样的手法,假设对象a有一个属性叫做MyProp: Type t = a.GetType();Pro...
阅读全文
摘要:从今天起,我将分享一些我在.NET泛型方面的研究心得。这些心得大都是我在设计VBF中思考发现的,还受了很多C++模板与JAVA泛型的启发。其中相当多的技巧和概念都是大部分“深入C# 2.0”类文章也见不到的。我考虑把其中概念性的部分系统地整理成书,而技巧性的东西则通过我这个系列不定期地分享到Blog上。希望用到.NET泛型的人能从我这些技巧中受益。 首先我要介绍的技巧是如何提供类型参数之间的转换...
阅读全文
摘要:在上一篇《来一点反射,再来一点Emit —— 极度简化Entity!》中,Teddy运用反射和Emit极度简化了Entity的定义方式。本文将在上文的基础上,用自定义KeyValueCollection类代替原来的Dictionary类承载Entity的数据,从而改善Entity的读写性能,并保持Dictionary的方便的使用接口。为什么Dictionary的性能不好?当然,这里说的性能不好主要...
阅读全文
摘要:BS开发中常用的Javascript技术 一、验证类 1、数字验证内 1.1 整数 1.2 大于0的整数 (用于传来的ID的验证) 1.3 负整数的验证 1.4 整数不能大于iMax 1.5 整数不能小于iMin 2、时间类 2.1 短时间,形如 (13:04:06) 2.2 短日期,形如 (2003-12-05) 2.3 长时间,形如 (2003-1...
阅读全文
摘要:泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,其的具体参数可延迟到客户代码中声明、实现。这意味着使用泛型的类型参数T,写一个类MyList,客户代码可以这样调用:MyList, MyList或 MyList。这避免了运行时类型转换或装箱操...
阅读全文
摘要:在前一篇文章《没有ORM或代码生成数据就不能持久化了? - 用范型技术代替代码生成!》中,Teddy尝试运用泛型极大简化了一个轻量级持久化框架对代码生成的依赖,并且为了保证性能,整个持久化组件没有使用反射。在本文中,Teddy将在保证性能的基础上,加一点反射和加一点Emit,从而进一步简化Entity的定义和使用,当然也就进一步降低了组件对传统代码生成的依赖。读者可以对比前文阅读本文,看看改进的效...
阅读全文
摘要:昨天看到了叶漂兄的Post:《Hashtable的烦恼!》,文中提出有关Hashtable中键值对(key/value pair)排序的问题。其实所谓键值对的排序问题,实质上就是键(key)排序的问题。而一直以来,我都认为Hashtable中的键排序是随机的,因为自己有限的编程经验告诉我:键值对插入的顺序不同会影响键值对的输出顺序,实际上就是影响到键值对的输出顺序了。在quitga...
阅读全文
摘要:.NET 提供的反射(Reflection)机制可以很方便的加载插件。本文提供一种方法,可以灵活的正确的载入所需的插件。 .NET的插件机制的简单实现 沐枫网志在.NET中,一个完整的类型名称的格式如 "类型名, 程序集名"。 例如:"System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Cult...
阅读全文
摘要:由于看的人多,参与讨论的人少,我想可能是我写的过于简略了,所以今天重新编辑了一下。 模版方法的关键是在父类中的非抽象方法中调用抽象方法,子类各自实现自己父类的抽象方法。子类的区别仅仅是实现方法的不同,其自身原来的优势就是可以在有新的具体类的增加时不用修改抽象类,而客户端的调用则只是通过多态来执行抽象类的方法。在.NET中,我们可以采用委托方法实现相同的目的。 我...
阅读全文
摘要:今早起床北京天灰蒙蒙的一片,在来实验室的路上有不易察觉到的雪花从眼前飘过。深呼吸一口,能嗅到年的味道,让人想到家乡。这种感觉很好。 (一)垃圾回收器的基本假定 (1)最近被分配内存空间的对象最有可能需要被释放。在方法被执行前,通常需要为该方法所使用到的对象分配内存空间,搜索最近被分配的对象集合有助于花费最少的工作来释放进可能多的空闲内存空间。 (2)生命期最长的对象需要释放的可能性...
阅读全文
摘要:一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—全局变量和静态变量的存...
阅读全文
摘要:面试的时候遇到有这么一题:您在什么情况下会用到虚方法(虚函数)?它与接口有什么不同? 当不同的人面对这个问题的时候应该是有不同的反应,因为每个人对以上提到的知识点的理解程度不同。绝对有人迷惑,也有人似乎明白,有人不屑的撇撇嘴。迷惑的人因为不知道面试官想问什么,虚方法和接口在不同的讨论范围真是有点风马牛不相及;明白的人似乎知道有这么几个东西,并侃侃而谈:“由于Java不支持多继承,而有可能某个类或...
阅读全文
摘要:虛函數:由virtual聲明,它允許在派生類中被重寫,要重寫方法,必須先聲名為virtual public class myclass { public virtual int myint() { 函數体; } } class myclass1:myclass { public override int myint() { 函數体1; } } 抽象類、抽象函數:由...
阅读全文
摘要:1、开闭原则 :一个模块对扩展是开放的,对修改是关闭的。 2、完全替换原则 :派生类应该能完全替换掉基类。在需要一个基类指针或引用的地方,传一个派生类的指针或引用,代码也能正常工作。 3、依赖倒置原则 :依赖于抽象,而不要依赖于具体。在一般的设计中,基类的任务是为派生类提供服务,派生类通过调用基类提供的服务 来扩展基类的行为。这种设计方法是正向的依赖关系。而依赖倒置原则强调的是一种反向依赖关系。在...
阅读全文
摘要:当设计大型程序的时候,您必须时刻留心不同设计选项对诸如性能和可扩展性这样的特征的影响。随着软件产品的日渐复杂及其无所不在的部署,软件的“可测试性”也成了更重要的考虑事项。 彻底测试代码的重要性是显然的。花在编写测试和测试代码上的时间和精力给您带来的回报是维护成本的大幅降低。 然而,除非您很小心,否则您花在测试代码上的精力可能会首先达到花在编写代码上的精力的几倍!我曾看到程序员们齐心协力...
阅读全文
摘要:估计这篇对很多朋友都是有用的!!依赖是和变化紧密联系在一起的概念。由于依赖关系的存在,变化在某处发生时,影响会波及开来,造成很多修改工作,这就是依赖的危害。可以说变化是始作俑者,依赖是助纣为虐。我们可以不去拥抱变化吗?不可以。未来将是越来越不可预测,这是新经济最具挑战性的方面之一。商务和技术上的瞬息万变会产生变化,这既可以看作要防范的威胁,也可以看作应该欢迎的机遇。既然变化不可避免,我们所能做的...
阅读全文