摘要: C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解。还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜也有无数的文章讲解相关的概念,貌似没写一篇值类型,引用类型相关博客的不是好的C#程序员。我也凑个热闹,试图彻底讲明白相关的概念。 程序执行的原理 要彻底搞明白那一堆概念及其它们之间的关系似乎并不是...阅读全文
posted @ 2013-06-27 17:50 zhangweiwen 阅读(3636) 评论(23) 编辑
摘要: 上一篇的工具生成方法有个致命缺点:当wcf的参数个数大于或者等于4时,将会报错,因为Task.Factory.FromAsync这个方法最多支持三个参数. 为了解决这个问题,临时的解决办法是配置生成服务引用时选择"始终生成消息合同",如下图. 虽然这样可暂时解决这个问题,但使用有了这个消息合同后使用非常不变,每次调用Wcf方法时总要new一个XXXRequest. 这个版本解决这个问题,...阅读全文
posted @ 2013-04-24 22:08 zhangweiwen 阅读(389) 评论(2) 编辑
摘要: 逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画图详细解析逆变与协变。 变的概念 我们都知道.Net里或者说在OO的世界里,可以安全地把子类的引用赋给父类引用,例如: //父类 = 子类string str = "string";object obj = str;//变了而C#里又有泛型的概念,泛型是对类型系统的进一步抽象,比上面简单的类型高级,把上面的变化体现在泛型的参数上就是我们所说的逆变与协变的概念。通过在泛型参数上使用in或阅读全文
posted @ 2013-02-17 23:33 zhangweiwen 阅读(7340) 评论(34) 编辑
摘要: 最近搞一个系统时由于在比较关键地方用到反射了,所以要关注了一下反射的性能问题。搜索一下,不难搜到老赵的这篇文章,下面是一些杂乱的笔记。(建议先看老赵的文章) .Net4.0反射性能改善 看老赵的文章,老赵得到的结果是这样的: 00:00:00.0125539 (Directly invoke)00:00:04.5349626 (Reflection invoke)00:00:00.0322555 (Dynamic executor)而我把代码搞下来自己运行得到这样的结果:00:00:00.0009710 (Directly invoke)00:00:00.4142893 (Reflect...阅读全文
posted @ 2013-02-04 01:02 zhangweiwen 阅读(5340) 评论(23) 编辑
摘要: 上一篇使用Task简化Silverlight调用Wcf介绍了Silverlight下使用Task的一些方法,这篇继续改进一下。 改进生成工具的生成的方法 上次生成的代码如下,这些TaskAsync只是简单的包装一下Wcf的begin和end方法: public Task DoWorkTaskAsync(){ return Task.Factory.FromAsync(this.Channel.BeginDoWork, this.Channel.EndDoWork, null);}public Task<DateTime> GetSerivceTimeTaskAsync(){ ...阅读全文
posted @ 2013-02-03 00:29 zhangweiwen 阅读(1684) 评论(0) 编辑
摘要: 调用过WCF服务的同学可能都会遇到这样的问题,同一个实体类型,不同的服务Visual Studio生成了不同的版本,例如Service1.User和Service2.User,对于C#来说,这是两个不同的类型,Service1获得的User是放不到Service2服务里去的。手动的属性赋值来转换显然是不可取的,所以就共享类型了。 方法1,服务端和客户端共享数据契约程序集。 这个方法最常用,也是大家最熟悉的方法,把WCF的数据契约放在一个独立类库里,服务端,客户端都引用这个程序集,然后在生成WCF时,选择重新使用引用程序集中的类型即可。 这个方法缺点很明显,它只有在客户端和服务端在同一...阅读全文
posted @ 2013-01-18 00:32 zhangweiwen 阅读(2480) 评论(6) 编辑
摘要: json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西。今天总算搞明白了。下面一步步来搞清楚jsonp是个什么玩意。 同源策略 首先基于安全的原因,浏览器是存在同源策略这个机制的,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。看起来不知道什么意思,实践一下就知道了。 1.随便建两个网页 一个端口是2698,一个2701,按照定义它们是不同源的。 2.用jQuery发起不同源的请求 在2698端口的网页上添加一个按钮,Click事件随便发起两个向端口为2701域的请求。 $("#get...阅读全文
posted @ 2012-12-11 01:08 zhangweiwen 阅读(6726) 评论(25) 编辑
摘要: 从.Net4.0开始,.Net提供了一个Task类来封装一个异步操作,用来简化异步方法的调用。.Net4.5更进一步,添加了async和await两个关键字,异步编程同步化,不用再写一堆散乱的回调或者完成事件处理。Silverlight5开始支持Task类,但是要用await的话就需要编译器的支持,VS2012直接支持,如果是VS2010,那就要安装Async CTP,而Silverlight4没有Task类,但安装Async CTP后,得到的AsyncCtpLibrary_Silverlight.dll会带有适合Silverlight4使用的Task类。下面介绍怎么使用。 使用Task封装.阅读全文
posted @ 2012-12-09 22:40 zhangweiwen 阅读(2464) 评论(5) 编辑
摘要: 在Silverlight里,导航框架允许开发者在Silverlight应用程序里实现一种方式来跳转到不同的页面,就像网站上的不同页面一样。这个框架也允许开发者创建历史使其与浏览器结合,使用户能使用浏览器的向前和向后导航。 Frame和Page对象 导航框架的两个主要对象是Frame和Page对象。Frame与ASP.NET母版页中的ContentPlaceHolder非常相似,是在一个页面放置不同views的地方。 练习:创建一个导航Silverlight应用程序 在这个练习里,会创建一个简单的应用程序包含两个超链接按钮和一个Frame。点击超链接会加载两个页面中的一个到Fr...阅读全文
posted @ 2012-05-12 14:22 zhangweiwen 阅读(543) 评论(2) 编辑
摘要: Silverlight应用程序的数据访问与传统的应用程序有些区别。你需要搞清楚它的工作原理和它的局限性。这一章,你会看到为什么Silverlight的数据访问与众不同,同时研究Silverlight应...阅读全文
posted @ 2012-05-06 15:44 zhangweiwen 阅读(450) 评论(8) 编辑