随笔分类 -  .net常识

C#中类型分析中的常见问题 Type
摘要:写代码的时候经常需要分析已有类型的信息例如:分析现有类型自动生成类, 或者为现有的类自动增加一些功能总结了一点点经验以ClassA a; 为例1. 通过typeof(ClassA) 或者 a.GetType() 获取类型信息, 推荐使用typef() 可以避免空引用,而且有的时候不需要构造一个ClassA的实例,  typeof(ClassA)的性能一点都不差,不要把它和反射混为一谈,2.对于Type.IsPrimitive来说 很多常见的类型不是原生类型  例如 String DateTime decimal 都不是原生类型  按照MSDN的说明 原生类型只包括:http://msdn.mi 阅读全文

posted @ 2011-02-17 18:58 听说读写 阅读(1325) 评论(0) 推荐(0) 编辑

private 和 protected 构造函数的选择
摘要:实现单例模式的时候经常要把构造函数标记为private 和protected以防止外部直接通过new操作符 构造一个新的实例众所周知 private 和protected的主要区别就是 后者允许子类调用被标记为protected的方法另外一个常识: 使用new操作符构造一个子类的过程中 .net会先构造一个父类出来 ,如此递归 直到object对象那么也就是说 标记为protected的时候 实际上还是可以通过继承的方式间接的构造父类对象代码如下: (new ClassB的同时也间接的new ClassA了)[代码]private则没有这个问题, 但是! 标记为private以后实际上也就意味 阅读全文

posted @ 2011-02-14 13:11 听说读写 阅读(3814) 评论(1) 推荐(0) 编辑

.net 自带的日志功能 System.IO.Log (读取)
摘要:那些写出来的日志.....最终保存为二进制数据,直接用文本没法看(可能是为了考虑性能和体积吧)没法子 只好自己再写个功能读取日志了代码虽然很简单 不过不能直接用记事本查看日志还是很麻烦的.... 阅读全文

posted @ 2011-01-18 17:05 听说读写 阅读(1951) 评论(0) 推荐(0) 编辑

.net 自带的日志功能 System.IO.Log (写入)
摘要:在.net 4.0中 framework自带了一组写日志的类,都位于System.IO.Log 命名空间下其中LogRecordSequence 提供了对公用日志文件系统 (CLFS) 日志的实现(xp不支持...)FileRecordSequence提供了对普通日志文件的支持代码  LogRecordSequence 的性能非常好,注:在我的机器上(windows 2008) 测试写入10000条耗时0.03秒 .(不要每写一条都Flush: 设置参数 RecordAppendOptions.None) PS: 可以将 RetryAppend设置为true开启功能: 文件满的时候,自动生成另 阅读全文

posted @ 2011-01-18 09:56 听说读写 阅读(5936) 评论(1) 推荐(0) 编辑

.net 哪些异常是没法catch的?
摘要:1.StackOverFlowException (一般来说这个不是真的堆栈不够了,而是你的代码出现了无线递归),如果你用throw new StackOverFlowException 还是可以catch的2.OutOfMemoryException (好像只有 box newarr newobj 才会抛出这个异常)3.非CLS的异常(一般来源于本地代码,这些异常不继承于System.Exception)  在.net framework 4.0中默认行为不捕获非CLS的异常  在.net framework 2.0中会把非CLS的异常包装为System.Exception的之类(可以cat 阅读全文

posted @ 2011-01-12 09:41 听说读写 阅读(691) 评论(4) 推荐(2) 编辑

.net 虽然他们catch了异常,我们还是能知道的
摘要:有的时候某些人的代码会把异常吃掉(catch以后不rethrow....)以下代码可以获取所有的异常...即使他们catch以后什么也不做代码PS: 其实拿来做log也不错..除了几种保留类型以外,其他异常都触发这个事件(某些异常是没法catch的) 阅读全文

posted @ 2011-01-10 10:58 听说读写 阅读(561) 评论(2) 推荐(0) 编辑

常见的Lambda表达式引起的闭包问题
摘要:以下代码的原意是想找出list中满足Name字段包含t, Remark字段包含mark的数据代码不过实际情况是data中间一条记录都没有而hardcode算出来的data2中有3条记录原因如下:  这个lambda表达式 Where(p=p.Name.Contains(val)) , 实际上只是保留了一个指向函数外部的val的引用 , 他这个时候并没有把val的真实的值拷贝进来  真正去读取val值的时候是 lambda.ToList() 这个时候才真正执行lambda表达式取数据,过滤数据 ,也是这个时候才去读取val的值  而在foreach的第二次操作的时候 val的值被覆盖mark了 阅读全文

posted @ 2011-01-07 14:42 听说读写 阅读(1874) 评论(0) 推荐(0) 编辑

Lambda动态附加条件和排序语句 (可用于linq to sql)
摘要:一种常见的情况, 使用linq-to-sql 或者lambda(Entity framework)去数据库取条件的时候需要附加多个条件或者排序语句以 Name="John" Age=23 为例先明确一个概念 对于Lambda来说 以下两个表达式是等价的  1. list.Where(p=p.Name=="John" && p.Age==23)   2. list.Where(p=p.Name=="John" ).Where(p=p.Age==23)lambda表达式只是创建了一个方法的定义 实际上并没有执行真正的执行一般等到ToList()方法(内部其实是IEnumerableT)被 阅读全文

posted @ 2011-01-07 14:00 听说读写 阅读(8349) 评论(3) 推荐(1) 编辑

CLR via C# 读书笔记 5-6 垃圾回收的Generation
摘要:直接用代码和注释说明问题吧~~代码第一次感觉一个对象的Finalize要等这么久....当然,如果在0代对象的时候就被回收了 就没这么麻烦了- -# PS:GC的简单逻辑:  1.遍历Generation 0 没用的拉出去杀掉,还有用的升级到Generation 1 ,  2.如果空间已经过了, 就不继续回收了 ,返回  3.如果空间还不够或者Generation 1 也满了, 把G1没用的拉出去烧了祭天,然后还活着的升级到G2  4.如果有必要 继续回收G2...如果g2也不够了 那么就OutOfMemoryException ....  参数:GC在初始化完成的时候Generation 0 阅读全文

posted @ 2010-12-10 10:30 听说读写 阅读(404) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 5-2 为什么不使用Finalize
摘要:1.在创建对象的时候,Finalize需要更多的时间, 因为需要把对象放到Finalization List 中2.Finalize会让你的应用程序运行的更慢,因为在GC的时候需要对每个对象执行额外的检查3.Finalize会对内存造成更大的压力(Heap的内存分配问题)4.Finalize执行时间是不确定的,如果是使用需要独占的资源例如File, 那么下一个想使用文件的人无法确定什么时候才能使用它所需要的文件, 这种情况还是尽快使用Dispose或者Close释放资源比较好,这同时意味着,你无法手动控制Finalize的执行和它的执行顺序PS:什么时候执行Finalize1.托管堆中0代 阅读全文

posted @ 2010-12-06 13:12 听说读写 阅读(355) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 5-1 何时对托管资源使用Finalize
摘要:Finalize方法常用于回收非托管资源,以防止资源泄露在较少的情况下它也会被用于托管资源1.构造函数中如果抛出异常, 那么只有Finalize方法才会被执行,在这里可以回收一些已经分配的资源(Dispose不会被执行!!!)当然:Finalize方法的执行时间还是下一次GC的时候(依然不确定时间)如果不实现该方法将会造成资源泄露以下代码演示了在这种情况代码所以一般情况下为了完全避免资源泄露例如Memory leak, 通常将类实现为以下的方式代码 阅读全文

posted @ 2010-12-06 11:37 听说读写 阅读(447) 评论(0) 推荐(0) 编辑

.net 4.0 同步集合类 System.Collections.Concurrent
摘要:.net 4.0 位于System.Collections.Concurrent 命名空间下增加了一些同步的集合类顾名思义就是线程安全的集合类他包括ConcurrentStack, ConcurrentQueue, and ConcurrentBag等1.内部使用InterLocked实现同步功能2.在使用foreach 遍历这些集合的时候(GetEnumerator) ,这些集合内部会创建一个快... 阅读全文

posted @ 2010-12-02 17:27 听说读写 阅读(593) 评论(0) 推荐(0) 编辑

CLR via C# 读书笔记 4-2 线程和锁的一些使用原则
摘要:1.如果可以,尽可能使用线程池中的线程, 因为自己创建,维护销毁一个线程会极大的消耗CPU和内存资源,如果需要定时工作,那么请使用System.Threading.Timer2.在读多写少的情况,使用读写锁ReaderWriterLockSlim (不要使用ReaderWriterLock), 因为这样读操作之间不会互斥3.尽量不要使用递归的锁 ,当然Moniter是个例外,他虽然使用了递归, 但... 阅读全文

posted @ 2010-12-02 10:58 听说读写 阅读(471) 评论(0) 推荐(0) 编辑

别拿Thread当定时器使用...
摘要:经常可以看到很多程序使用Thread当作定时器(Timer)使用,例如定时检查数据,定时清空缓存什么的就像以下代码代码可能有的朋友已经注意到,在压力比较大的Asp.net网站中这个Thread经常不能正常的工作,也许这个线程会永远不会再起来.......那么定时任务也就泡汤了PS:如果是console的主线程 (标记了STAThreadAttribute ) 则可以正常的苏醒和睡眠另外一个原因就是每个Thread都是很昂贵的,能不用就不用,(我的另外一个文章有提到,一个线程至少1m内存还要考虑给GC 和上下文调度造成的压力)一般情况下建议使用System.Threading.Timer 来执行 阅读全文

posted @ 2010-12-01 16:28 听说读写 阅读(4216) 评论(1) 推荐(0) 编辑

net异步操作总结和比较
摘要:以下是个人理解:Compute 主要指的是CPU密集型或者是其他计算密集型的操作I/O 这里指的是操作文件或者网络等适用的异步情况父子依赖指的是 一个任务是不是依赖于其他任务的状态而执行(例如A任务完成取消或者异常的时候 B任务执行)取消: 一个任务开始以后是否能够被终止等待:能否block住当前线程以等待异步操作的完成(是否有内置功能支持)超时:能否对异步任务设置超时时间返回值和异常:能否处理异步任务的返回值和异常(是否有内置功能支持)异步方式主要应用Emulate Secondaryvia What?父子依赖关系进度报告取消等待超时返回值和异常QueueUserWorkItemComput 阅读全文

posted @ 2010-11-30 13:51 听说读写 阅读(648) 评论(0) 推荐(0) 编辑

C# 使用lock关键字lock不同的对象
摘要:c# lock关键字的本质是调用Monitor.Enter(object obj)并且在finally的时候调用Monitor.Exit(obj)在obj是不同数据类型的时候会出现不同的情况1.锁定类型 例如lock(typeof(int)) lock(typeof(ClassA)) // CalssA 是一个类的定义  备注:前者作用范围跨AppDomain 不跨Process, 后者不跨App... 阅读全文

posted @ 2010-11-19 16:02 听说读写 阅读(7031) 评论(0) 推荐(2) 编辑

c# 使用 new 操作符构造新对象中做了一些什么 (简单版)
摘要:平时new算是使用非常频繁的一个关键字这里只是描述 new object() 这种类型的作用其他的暂时不涉及到,本文的内容也比较简单,就列出了一些常用的流程1.在第一次访问某个程序集的时候 (会加载对应的程序,例如需要new的对象在其他的dll里面)  其实步骤一中有很多其他的内容,不过这里就不详细描述了,因为用的比较少  如果找不到dll这个时候就会抛出异常2.给所有静态成员赋值(static)... 阅读全文

posted @ 2010-11-12 20:08 听说读写 阅读(854) 评论(3) 推荐(0) 编辑

导航