摘要:
计算限制异步 使用QueueUserWorkItem线程池来实现,只需ThreadPool.QueueUserWorkItem方法即可实现异步,但是由于其局限性,比如没有一个内建的机制让你知道操作什么时候完成,也没有一个机制在完成时获得一个返回值,于是微软就引入了Task的概念,Task功能相当强大,它有许多的记录项,来记录一些额外信息来实现 什么时候完成,完成时获取返回值以及等待等等功能。Ta... 阅读全文
摘要:
JIT编译器如何处理泛型 使用泛型类型参数的一个方法在进行JIT编译时,CLR获取方法的IL,使用指定的类型实参进行替换,然后创建恰当的本地代码。JIT为每个值类型实参(int, long, float)都创建不同的本地代码,为引用类型(string, stream)共享相同的本地代码。之所以可以这样是因为所有引用都具有相同的大小,对其操作也是一样的。 优点 想知道泛型的优点可以对比Arra... 阅读全文
摘要:
可选参数与命名参数 可选参数,或者默认参数,参数是从左往右计算的。因此,函数定义时,如果有可选参数,那么可选参数必须在最右边。当调用函数时可以使用命名参数。 public static void Test(int a, string b, double c = 1.0); 我们可以这样调用Test(2, "3");Test("2", a:2); 调用函数时,使用的命名参数必须是最右边 可... 阅读全文
摘要:
常量 C#中的“常量”有两种,一种是const修饰,一种是readonly修饰,至于他们之间的区别也很简单,const是在编译的时候确定的,即,将const变量的值直接编译放入IL代码中,直接寻址,没有另外创建内存来存储const变量。readonly是指该变量不能被修改,只读变量,只能在构造函数时对其进行赋值(当然可以使用内联初始化),由于这个会另外分配内存存储readonly的值,所以运行时... 阅读全文
摘要:
访问限制符 c#中,类型默认的修饰符是internal,成员默认的修饰符为private。在c#中的访问限制符和CLR中有对应,就如C#中的基元类型和FCL中有对应一样。下图为CLR VIA C#一书中的表格 成员之间的访问,比如类外部不能访问private成员,这些访问限制,在编译时期会进行检测,而且在运行时也会进行访问检查,因为我们可以动态添加程序集,而对程序集中的访问在编译时间不可知... 阅读全文
摘要:
装箱和拆箱 MSDN中的定义: 装箱是将值类型转换为 object 类型或由此值类型实现的任一接口类型的过程。 当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。 取消装箱将从对象中提取值类型。 装箱是隐式的;取消装箱是显式的。 装箱和取消装箱的概念是类型系统 C# 统一视图的基础,其中任一类型的值都被视为一个对象 装箱 1.... 阅读全文
摘要:
Public虚函数 实例Equals函数:public virtual bool Equals(object obj); 1. object类的实现:比较两个引用是否指向同一个对象 2. 值类型和String类型重写了Equals方法:比较的是值类型的值是否相等。 3. 用户定义的类:可以重写Equals方法,重写了Equals方法的同时,最好重写GetHashCode函数 ToS... 阅读全文
摘要:
MongoDB与关系型数据库的建模还是有许多不同,因为MongoDB支持内嵌对象和数组类型。MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link)。那么何时Embed何时Link呢?那得看两个实体之间的关系是什么类型。 一对一的关系:Embed,比如用户信息集合有Address字段,Address字段有省、市、县三个字段。建模如下: ... 阅读全文
摘要:
第一次翻译,水平有限,难免出错,敬请原谅,如果实在难以理解,请看原文对照原文链接:http://www.codeproject.com/Articles/121096/Web-Server-and-ASP-NET-Application-Life-Cycle-in-D简介在本文,我们将试着解释清楚当用户向ASP.NET应用程序发送一个请求时到底发生了什么。有许多文章已经解释过这个问题,但是没有一篇能够清晰而又深入的解析。在读完本文后,你将会明白:什么是web 服务器?HTTP – TCP/IP 协议IIS网络通信应用程序管理器(Application Manager)宿主环境(Hosting 阅读全文
摘要:
一、定义委托类似于C++的函数指针,但是委托时类型安全的。一个不好听的比喻,生前写了一个遗嘱,死后遗嘱才会公开。委托的意义就是在某个特定的时间做某事,比如点击一个按钮会发生某事,但是你不想修改按钮的代码,可以添加一个方法到委托上,当点击按钮时,会自动执行委托链上的方法。委托增加了复杂性但是也增加了灵活性,方便程序的设计。二、委托与事件让委托工作起来需要的步骤:1. 声明委托类型。2. 创建委托实例。3. 为委托实例添加匹配的方法。4. 调用委托实例。下面是一个简单的委托例子。版本一:class Patent1{ // 声明委托类型 public delegate void Pate... 阅读全文