01 2011 档案
摘要:ICloneable 听起来是个好主意:可以为那些支持复制的类型实现ICloneable接口。如果不想支持复制,那就不要实现它。但是我们的类型并非活在真空中。让一个类型支持ICloneable接口会影响它的派生类。一旦类型支持ICloneable接口,那么它所有的派生类也都必须支持它。而且,其所有成员类型也都要支持ICloneable接口,或者有其他创建复制的机制。最后,当我们设计的类型包含交织成网状的对象时,支持深复制将变得很困难。 ICloneable接口在其官方的定义里很巧妙地绕过了这个问题,其定义如下:ICloneable接口或者支持深复制(deep copy),或者支持浅复制(sha
阅读全文
posted @ 2011-01-23 15:22
yu_liantao
摘要:转自:http://hi.baidu.com/gghost/blog/item/63cc79dd17c24d325882dd1a.html用ListT的泛型方法作为试验对象首先看看LIstT.Sort()方法ListT.Sort()方法有四种重载说明 List.Sort () 使用默认比较器对整个 List 中的元素进行排序。由 .NET Compact Framework 支持。 List.Sort (泛型 Comparison) 使用指定的 System.Comparison 对整个 List 中的元素进行排序。由 .NET Compact Framework 支持。 List
阅读全文
posted @ 2011-01-23 13:31
yu_liantao
摘要:1.NET序列化会将对象中的所有成员变量保存到一个输出流中。但要记住,只有当对象中的所有类型都支持序列化时,这里谈的机制才会正常工作。2.不打算序列化对象中的所有成员。在数据成员上添加 [NonSerialized]特性,可以告诉序列化框架不要将这些成员作为对象的状态来存储: [Serializable]public class MyType{private string _label;[NonSerialized]private int _cachedValue;private OtherClass _object;}3.当使用Serializable特性时,那些NonSerialized成
阅读全文
posted @ 2011-01-20 21:26
yu_liantao
摘要:1.通过使用特性(attribute),我们也可以在C#中实现声明式编程。我们可以将特性应用在类、属性、数据成员或者方法上,.NET运行时则会为我们添加适当的行为。声明式编程更易于实现、阅读和维护。让我们从一个大家已经使用过的典型示例开始。当编写第1个ASP.NET Web服务时,向导程序会产生如下的代码:[WebMethod]public string HelloWorld(){return "Hello World";}VS.NET Web服务向导程序会为HelloWorld()方法添加一个[WebMethod]特性。这会将HelloWorld()方法声明为一个Web方法。由于对该特性的使
阅读全文
posted @ 2011-01-19 17:38
yu_liantao
摘要:【解决派生类中不能重写基类中实现了接口中的方法】(1)在派生类中用new的方法重新建立一个相同的方法(但是用接口类型调用的时候不会调用派生类new的方法)。(2)在派生类中重新继承该接口并实现(接口类型可以正常调用)。(3)在基类中把接口中的方法实现为虚方法(virtual)或者抽象(abstract )这样派生类就可以重写基类中实现了接口的方法了,并且接口类型的对象也可以正确调用派生类中的方法。1.我们可以将接口用做函数的参数,并返回值。由于不相关的类型可以共同实现一个接口,因此我们将有更多机会重用代码。下面两个方法执行的是同样的任务:public void PrintCollection(
阅读全文
posted @ 2011-01-19 10:34
yu_liantao
摘要:转载:http://blog.csdn.net/knight94/archive/2006/08/05/1023352.aspx便于对文章的开展,需要先明确两个概念。第一个就是很多人用.Net写程序,会谈到托管这个概念。那么.Net所指的资源托管到底是什么意思,是相对于所有资源,还是只限于某一方面资源?很多人对此不是很了解,其实.Net所指的托管只是针对内存这一个方面,并不是对于所有的资源;因此对于Stream,数据库的连接,GDI+的相关对象,还有Com对象等等,这些资源并不是受到.Net管理而统称为非托管资源。而对于内存的释放和回收,系统提供了GC-Garbage Collector,而至
阅读全文
posted @ 2011-01-16 21:27
yu_liantao
摘要:转载:http://agassi001.cnblogs.com/archive/2006/05/10/396574.html在.NET framework环境下,当我们的代码执行时,内存中有两个地方用来存储这些代码:栈(Stack)和堆(Heap),它们驻留在机器内存中,且包含所有代码执行所需要的信息。栈负责保存我们的代码执行(或调用)路径,而堆则负责保存对象(或者说数据,接下来将谈到很多关于堆的问题)的路径。可以将栈想象成一堆从顶向下堆叠的盒子。当每调用一次方法时,我们将应用程序中所要发生的事情记录在栈顶的一个盒子中,而我们每次只能够使用栈顶的那个盒子。当我们栈顶的盒子被使用完之后,或者说方
阅读全文
posted @ 2011-01-16 11:52
yu_liantao
摘要:1.值类型是数据的容器,它们不具备多态性。另一方面就是说,.Net框架被设计成单一继承的引用类型,System.Object,在整个继承关系中作为根对象存在。设计这两种类型的目的是截然不同的,.Net框架使用了装箱与拆箱来链接两种不同类型的数据。2.装箱是把一个值类型数据放置在一个无类型的引用对象上,从而使一个值类型在须要时可以当成引用类型来使用。拆箱则是额外的从“箱”上拷贝一份值类型数据。装箱和拆箱可以让你在须要使用System.Object对象的地方使用值类型数据。但装箱与拆箱操作却是性能的强盗,在些时候装箱与拆箱会产生一些临时对象,它会导致程序存在一些隐藏的BUG。应该尽可能的避免使用装
阅读全文
posted @ 2011-01-13 23:35
yu_liantao
摘要:1.我们常使用IDisposable接口的Dispose()方法来精确的释放非托管系统资源。在日常代码中我们确保调用Dispose()的方法是用using和try/catch/finally语句。2.所有包含非托管资源的类型都会实现IDisposable接口,他们还会创建终结器,以防止我们忘记调用Dispose()。如果你忘记调用Dispose(),那些非内存资源会在晚些时候,终结器会调用时会释放这些资源。这就使得这些对象在内存时待的时间更长,从而会使你的应用程序会因系统资源占用太多而速度下降。3.代码展示:public void ExecuteCommand( string connStri
阅读全文
posted @ 2011-01-11 23:49
yu_liantao
摘要:1.初始化器(在声明字段的时候就直接初始化,而不是在构造函数中处理) 初始化生成的代码会放置在类型的构造函数之前。初始化会在执行类型的基类的构造函数之前被执行,并且它们是按你声明的先后关系顺序执行的。2.什么情况下不应该初始化变量 首先就是,如果你是初始化一个对象为0,或者为null。系统默认会在你任何代码执行前,为所有的内容都初始化为0。系统置0的初始化是基于底层的CPU指令,对整个内存块设置。你的任何其它置0的初始化语句是多余的。C#编译器忠实的添加额外的指令把内存设置为0(多余的设置)。这并没有错,只是效率不高(牵涉装箱和拆箱)。事实上,如果是处理值类型数据,这是很不值的。第二个低效率的
阅读全文
posted @ 2011-01-05 22:47
yu_liantao
摘要:1.垃圾收集器(GC)控制着托管内存。但是我们需要对非托管代码进行处理(数据库连接,文件句柄,GDI+对象,COM对象等)2.垃圾收集器是运行在一个单独的线程中来移除程序中不再使用的内存。并且还会压缩托管堆,使得空闲内存能集中在一个连续的区域。3.对于非托管资源我们需要在类型中定义一个终结器,以此来确保释放这些系统资源。在对象的内存被回收之前,系统会调用终结器,这样我们可以在终结器中编写我们的代码来释放该对象占有的非托管资源。值得注意的是对象的终结器是在对象成为垃圾之后调用的,但是在内存归还之前,但是我们无法精确的控制“不再使用对象”和“执行终结器”这2个事件之间的关系。4.当GC发现某个对象
阅读全文
posted @ 2011-01-05 00:05
yu_liantao
摘要:1.我们创建的每一个类型都应该重写Object类的ToString()方法。如果创建的是更复杂的类型,则应该实现Iformattable.ToString()方法。2.值类型不支持多态,比较适合存储供应用程序操作的数据。引用类型支持多态,应该用于定义应用程序的行为。简而言之,结构用于存储数据,类用于定义行为。值类型主要用于较小的轻量级类型,而引用类型则主要用于构建整个类层次(class hierarchy)。如果具有比较简单的结构,或者是作为数据的载体,那就比较适合设计为值类型。值类型在内存管理方面也具有更好的效率:较少的堆内存碎片,较少的内存垃圾,以及较少的间接访问。更重要的是,值类型从方法
阅读全文
posted @ 2011-01-03 13:14
yu_liantao
摘要:1.使用属性代替可访问的数据成员。.NET的数据绑定类只支持属性绑定。对于我们在类中的公有字段不会理会。我们在绑定一个数据项的时候是通过反射的机制查找对象中是否有特定的属性实现的。2.由于属性的本质是方法,所以有下面的几个好处 1)能利于我们在程序中实现多线程编程的好处。 2)实现虚属性,方便继承类对属性的重写。 3)设置为抽象属性,也可以作为接口的一部分(平常我们写接口的时候只是方法的抽象,很少对属性进行抽象,其实属性本质既然是方法,那它也可以放在接口中或者抽象类中定义一定的标准,让继承类去实现它) public interface INameValuePair { object Valu
阅读全文
posted @ 2011-01-02 18:40
yu_liantao

浙公网安备 33010602011771号