摘要: 对于经常设计web页面的技术人员来说,javascript和css是必备的行囊,可能很多人都会运用这门技术。但是,试想一下,对于一个大型的web应用程序,可能包含大量的javascript和css文件,我们都知道加载这些文件需要网络带宽的,而且每个页面都去手动引入很多<script>或<link>等文件,对于开发人员来说可能是件费力不讨好的事情。而且,在项目维护后期,改动一个文件可能会影响到几个页面效果,自己加的文件也许别人在master或其他地方已经加载过,造成多余的文件浪费。因此,我们需要一种机制(或接口)来控制文件的引入,以便我们更方便的维护,以后这些维护工作专门 阅读全文
posted @ 2011-12-12 11:55 Miracle He 阅读(4833) 评论(6) 推荐(1) 编辑
摘要: 并不是所有的应用程序都需要复杂的体系结构来封装业务逻辑,只有深入理解所有的领域逻辑模式的优缺点及使用场景,才能应用最合适的模式去解决你所面临的问题。目前最流行的领域逻辑模式有:Transaction Script(事务脚本)、Active Record(活动记录)、Domain Model(领域模型)和Anemic Domain Model(贫血领域模型)。下面我将分别讲述这几种模式的优缺点及使用场景,希望大家可以在实际项目中加以利用发挥一定作用。1. Transaction Script(事务脚本):所谓事务脚本,是一种面向过程而非面向对象的业务逻辑方法。在该过程中包含相对独立的业务事务,为 阅读全文
posted @ 2011-12-01 16:13 Miracle He 阅读(1701) 评论(1) 推荐(0) 编辑
摘要: 首先我们从一个示例谈起,有一家商店当节日来临时,将对顾客实行打折优惠。基于此需求,我们按照传统方式来实现。新建一个Web项目并添加一个页面default.aspx。前台设计页面<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="Web.pages._default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi 阅读全文
posted @ 2011-12-01 12:07 Miracle He 阅读(4461) 评论(17) 推荐(4) 编辑
摘要: 首先,我们虚拟一个系统环境(e-Shop),即网上商店的应用程序,其中有一个应用: 获取指定分类下的所有产品信息。我们按照传统的思路来实现。图1展示了系统的设计图。新建一个类库工程EShop.Service. 然后添加相应的类到工程中。原始程序namespace EShop.Service{ public class Product { } public class ProductRepository { public IList<Product> GetProductsByCategory(int categoryId) { ... 阅读全文
posted @ 2011-11-14 23:31 Miracle He 阅读(988) 评论(0) 推荐(0) 编辑
摘要: Equals()和==之区别首先,理解一下值类型和引用类型的区别:值类型存储在内存的栈中,引用类型变量的地址存储在栈中,而本身的内容存储在堆中(字符串是一种特殊的引用类型)。我们现在来理解Equals和==的区别就容易多了。Equals比较的是两个变量是否为同一个对象的引用,即堆中的内容是否相同。==比较的是两个变量的值是否相同,对引用类型来说则是两个变量的存储地址是否一致,即栈中的内容是否相同。(举个形象的例子:Equals比较的是文件夹中的内容是否一致,==比较的是文件夹的路径是否一致)string s1 = "Miracle";string s2 = "Mi 阅读全文
posted @ 2011-11-14 10:25 Miracle He 阅读(497) 评论(0) 推荐(0) 编辑
摘要: 任何完美的应用程序和技术高明的程序员,都不可能是绝对不出差错的。与其追求完美无错的代码,还不如将程序中可能预知的异常在发布前进行很好的处理,可能是最有价值的。那么,C#是如何处理异常的呢?首先,我们从最普通的异常说起:使用try-catch-finally块捕获异常,基本格式如下:try{ //获取并使用资源,可能出现异常}catch(DivideByZeroException de){}catch(ArithmeticException ae){}catch(Exception e){ //捕获并处理异常,当出现多个异常且异常类之间有继承关系(DivideByZeroExcept... 阅读全文
posted @ 2011-11-11 13:39 Miracle He 阅读(12666) 评论(2) 推荐(1) 编辑
摘要: 以下是我总结的平时遇到的最常见的技术点(可称为"刀法"),掌握好这些变幻的"刀法",有助于代码的简洁以提高效率。using的三大用法:1. 导入命名空间(类似于Java的import,C语言的include)。2. 为命名空间设置别名。在多个命名空间中存在同名的成员时加以区分。3. 在范围结束之前或中途出现异常即时释放资源。需要说明的是,该资源的类型必须实现IDisposable接口。@的三大用法:1. 可以将字符串原义输出(特别是转义字符,如:\)。2. 用来表示跨行的字符串,也即可以在多行内声明字符串。3. 可以加在保留字前当作标示符使用(如:@cl 阅读全文
posted @ 2011-11-10 23:38 Miracle He 阅读(375) 评论(0) 推荐(0) 编辑
摘要: 对很多人来说,对.Net的反射机制不甚了解,其实反射是一种很优秀的机制,知道了它,就可以把握很多程序的脉搏。如何这样说呢?首先,反射是这样定义的:可以在运行时根据所提供的类库(.dll)来进行解析以获得其中包含的类型(包含类、结构、委托、接口、枚举等)成员,进而获取到对应的方法、属性、事件以及构造函数等(甚至可获得对应的名称、限定符和参数)信息。有了这些信息,我们就可以动态的创建对象,即使在编译时不知道对象的类型也无所谓。打个比方:反射好比人体解剖,可以给一个完整的人(^^哈哈,当然是死人哈,这里类比一个.dll文件),通过解剖(反射)就可以获取对应的部位(成员),进而利用这些部位去做更多的事 阅读全文
posted @ 2011-11-10 18:31 Miracle He 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 对初学C#的人来说,对委托与事件的理解可能仅停留在字面的概念上,不愿意去灵活利用它们来为应用程序服务。其实,理解清楚其中的原理并熟练搬到实际项目中,可能会使我们的程序更加通俗易懂和更好的维护。我们不妨从一个小例子入手,去理解委托与事件的精髓所在。class Greeting{ public void SpeakChinese(string name) { Console.WriteLine("你好," + name); } //Speak将委托调用SpeakByChinese(中文版问候) public void Speak(string name)... 阅读全文
posted @ 2011-11-08 23:40 Miracle He 阅读(442) 评论(0) 推荐(0) 编辑
摘要: 我们经常谈到面向对象的重要特性之一:继承,需要理解继承的重要机制:1. 可传递性。C-->B,B-->A ==> C-->A,即C继承A中所有非私有成员。2. 对基类进行扩展。即派生类在拥有基类成员的同时可添加新的成员,但不能移除已继承的成员。3. 对基类的构造函数和析构函数不能继承。则实例化派生类对象时,将先执行基类的构造函数,再执行自身的构造函数。 析构函数正好相反。class Parent{ public Parent() { Console.WriteLine("Parent Construtor"); } ~Parent()//不建议定义, 阅读全文
posted @ 2011-11-08 20:52 Miracle He 阅读(421) 评论(0) 推荐(0) 编辑