随笔分类 -  读书笔记

摘要:数据库(DataBase)保存有组织的数据库的容器(通常是一个文件或一组文件)。表(Table)某种特定数据类型的结构化清单。模式(Schema)关于数据库和表的布局及特性的信息。列(Column)表中的一个字段。所有表都是由一个或多个列组成的。数据类型所允许的数据库的类型。每个表都有相应的数据类型,它限制(或允许)该类中存储的数据。行(Row)表中的一个记录主键一列(或多列),其值能够唯一标准表中的每一行满足以下条件的任何列都可以作为主键:任意两行都不具有相同的值每一行都必须有一个主键值(主键列不能为NULL值)... 阅读全文
posted @ 2013-08-20 07:26 gyzhao 阅读(686) 评论(0) 推荐(0) 编辑
摘要:在使用Web服务、.NET远程调用或给予Azure的程序时,最耗时的就是与远程服务器之间传输过程。如果只是简单的将本地API封装一下,就变成远程使用的API,这样做功能上不会有问题,但是效率低下。API的粒度越细所花费在等待数据返回的额外事件也就越... 阅读全文
posted @ 2013-03-31 20:05 gyzhao 阅读(466) 评论(2) 推荐(0) 编辑
摘要:持久化(persistence)是类型的一个重要特性。只要我们的类型不是UI控件、窗体或者表单,都应该尽可能的为类型添加序列化支持。因为如果我们不为类添加序列化支持,而让类型的使用者来做这份工作几乎是不可能的。在.NET中支持序列化是一件非常简单的任务,在绝大多数的情况下... 阅读全文
posted @ 2013-02-28 21:22 gyzhao 阅读(492) 评论(0) 推荐(1) 编辑
摘要:如果将引用类型通过公有借口暴露给外界,那么对象的使用者即可绕过我们定义的方法和属性来更改对象的内部结构。这违反了我们通常的直觉,也会导致常见的错误。考虑到这一点,你应该修改类暴露出的接口。如果只是简单的返回内部数据,那么实际上就给外界赋予了访问内部... 阅读全文
posted @ 2013-01-19 21:07 gyzhao 阅读(792) 评论(0) 推荐(0) 编辑
摘要:.NET中的事件其实就是一个观察者模式(Observer Pattern)的一个语法上的快捷实现(更多可以参考:使用委托和事件实现观察者模式)。事件是一种内建的委托,用来为事件处... 阅读全文
posted @ 2013-01-18 23:59 gyzhao 阅读(760) 评论(0) 推荐(0) 编辑
摘要:在C#语言中,回调是通过委托来实现的。委托为我们提供了安全的回调定义,大多数委托都和事件相关,但这不是委托的全部应用场景,当类之间需要通信,并且我们希望一种比接口更加松耦合的机制时,委托便是最佳选择。委托允许我们在运行时配置目标并且通知多个客户对象... 阅读全文
posted @ 2013-01-17 23:18 gyzhao 阅读(769) 评论(2) 推荐(0) 编辑
摘要:实现和覆写虚方法的区别:接口中声明的成员默认不是虚方法。派生类不能覆写基类中实现的接口成员。接口可以被显式实现,这会使针对该类的公有成员隐藏起来。接口与虚... 阅读全文
posted @ 2013-01-16 21:25 gyzhao 阅读(712) 评论(0) 推荐(0) 编辑
摘要:接口是一种按照契约设计的方式,一个类型必须实行接口中定义的方法。抽象基类则为一组相关的类型提供了一个共有的抽象。要注意二者的使用场景和区别:基类描述了对象是什么;接口描述了对象将如何表现行为。使用抽象基类还是接口,代表了对日后可能发生的变化两种... 阅读全文
posted @ 2013-01-15 22:38 gyzhao 阅读(2736) 评论(9) 推荐(6) 编辑
摘要:在保证类型可以完成其工作的前提下,我们应该尽可能的给类型分配最小的访问级别。可见性越低那么以后升级更改时所需的变化也就越少——因为能访问你的功能的代码越少,以后可能出现的修改也就会越少。创建内部类是一种常被忽略的限制类型作用域的方法,在创建一个类时... 阅读全文
posted @ 2013-01-14 20:33 gyzhao 阅读(771) 评论(0) 推荐(0) 编辑
摘要:"常量性"指的是:对象自创建后,它的值就保持不变。如果在构造函数中就验证了参数的有效性,那么就能够保证之后该变量值始终是有效的——因为已经不能再改变... 阅读全文
posted @ 2013-01-13 20:14 gyzhao 阅读(1767) 评论(0) 推荐(3) 编辑
摘要:.NET系统的默认初始化过程会将所有的对象设置为0。我们就会难免创建出一个初始化为0值的值类型,所以我们应该将0作为类型的默认值,可以避免一些不必要的Bug... 阅读全文
posted @ 2013-01-12 17:30 gyzhao 阅读(1461) 评论(4) 推荐(0) 编辑
摘要:C#和JAVA不同,在C#中可以创建值类型,而在Java中创建的所有类型都是引用类型。在使用C#开发时,选择值类型还是引用类型对我们的程序的行为会产生很大的影响,所以我们需要对值类型和引用类型的使用场景进行了解和对二者的不同进行区分。C#之所以添加了值类型和引用... 阅读全文
posted @ 2012-12-22 10:48 gyzhao 阅读(1196) 评论(1) 推荐(0) 编辑
摘要:如何为我们自己的包含非托管资源的类型编写资源管理代码呢?在 .NET 中为我们提供了一种标准的销毁非托管资源的模式,这个标准的模式能够使使用者通过调用IDisposable接口正常释放掉非托管资源,也能够保证使用者在忘记释放资源时使用终结器释放。 阅读全文
posted @ 2012-11-30 09:33 gyzhao 阅读(1808) 评论(7) 推荐(5) 编辑
摘要:我们知道:C#是一门虚拟机语言,C#编译器首先将C#代码编译成IL代码,运行程序时CLR(Common Language Runtime,公共语言运行时)通过调用JIT(just-in-time Compiler,即时编译器)来将IL代动态即时编译成可执行的机器码。GC(Garbage Collector,垃圾收集器)自动为我们的应用程序进... 阅读全文
posted @ 2012-11-27 09:03 gyzhao 阅读(1939) 评论(9) 推荐(5) 编辑
摘要:一个类通常会有多个构造函数,并且随着时间的推移,成员变量的增加,功能的改变,构造函数的个数也会不断上升。很多的开发人员一般会先编写一个构造函数,然后将其代码复制粘贴到其他的构造函数当中,以支持在类接口上定义的多个重写构造函数.其实我们不应该这样做,当发现... 阅读全文
posted @ 2012-11-23 09:06 gyzhao 阅读(2005) 评论(5) 推荐(4) 编辑
摘要:我们知道在C#语言中创建一个类型的实例前,就应该初始化该类型的所有静态成员变量。C#语言为我们提供了静态初始化器和静态构造函数。其中,静态构造函数是一个特殊的构造函数,将在其他所有方法执行前以及变量或属性被第一次访问之前将自动调用静态构造函数,且仅执行一次... 阅读全文
posted @ 2012-11-15 17:17 gyzhao 阅读(3959) 评论(7) 推荐(3) 编辑
摘要:一般情况下,一个类都会有多个构造函数。随着时间的推移,成员变量、构造函数不断增加。为了处理这种情况最方便的办法就是:在声明变量的时候进行初始化,而不是在每个构造函数中进行。无论是类成员(静态变量)合适实例变量,我们都应该充分利用初始化器的语法。C#编程在,一般在... 阅读全文
posted @ 2012-11-06 21:59 gyzhao 阅读(2895) 评论(3) 推荐(4) 编辑
摘要:我们知道C#是一门虚拟机语言,在C#编译器将C#代码编译成IL代码后,运行在.NET CLR(公共语言运行时)中,运行程序是CLR通过调用JIT(即时编译器)来将IL代动态即时编译成可执行的机器码。在CLR中有一个非常重要的概念:CLR GC(Garbage Collector,垃圾收集器),GC自动为我们的应用程序进... 阅读全文
posted @ 2012-10-22 11:09 gyzhao 阅读(3971) 评论(20) 推荐(7) 编辑
摘要:在应用程序开发过程中,开发者都力求写出更加高效的代码。但是当你想手工为C#编译器优化代码时,你的种种优化可能反倒会阻碍JIT进行更加高效的优化。因此,我们最好尽可能的写出最清晰的代码,将优化工作交给JIT编译器去完成。在.NET平台下开发程序的开发者都应该知道... 阅读全文
posted @ 2012-10-08 23:14 gyzhao 阅读(2193) 评论(5) 推荐(6) 编辑
摘要:C#4.0 引入了具名参数(MSDN翻译为“命名实参”,个人认为具名参数更形象,可选参数亦是)和可选参数(可选实参)。客户端代码使用具名参数意味着:方法中的参数名称也成为了公有接口的一部分。假如修改公有参数的名称将有可能破坏调用者的代码。这意味着:调用者应该尽可... 阅读全文
posted @ 2012-10-07 21:54 gyzhao 阅读(2924) 评论(2) 推荐(2) 编辑