代码改变世界

回头再学Asp.net系列--基础篇(序)

2011-09-08 12:03  熬夜的虫子  阅读(561)  评论(0编辑  收藏  举报

时光如梭,不知不觉间虫子作为码农已经3年光景了。见识了太多了大牛、大侠。

站在巨人的肩膀上,容易好高骛远。虽然自己确实做了很多,摸了不少,曾经还自诩为优秀的架构师。可真的站在架构师这个角度的时候突然发现自己的脚下是悬空的。危险!

虫子相信和他类似的人很多很多,包括所谓的架构师。不信,我随便问您2个问题,绝对是最基础的,您或许了解但您未必全面:

1..NET BCL里有哪些是类(结构),为什么它们不是结构(类)?在自定义类型时,您如何选择是类还是结构?

2.什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它​​是如何工作的?GC是什么,简述一下GC的工作方式?

 

从现在开始虫子准备放下所有包袱重新回到地面上,从0开始,带您回顾Asp.net的基础之旅。当然,概念性的描述虫子就不带您回顾了,虫子只是为了填坑。

先放出上面2个问题的答案吧。

1.类是一种“引用类型”。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。

结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。

类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主

BCL(Base Class Library)是Dot Net Framework下所有语言使用的类库(有哪些类和结构,太多,自己留心就可以了~需要注意的是DateTime这玩意其实是一个结构体。)为什么他们不是结构(类)呢?  struct 类型适于表示 Point、Rectangle 和 Color 等轻量对象。尽管使用自动实现的属性将一个点表示为类同样方便,但在某些情况下使用结构更加有效。例如,如果声明一个 1000 个 Point 对象组成的数组,为了引用每个对象,则需分配更多内存;这种情况下,使用结构可以节约资源。因为 .NET Framework 包含一个名为 Point 的对象,所以本示例中的结构命名为“CoOrds”。复数、坐标系中的点或字典中的“键-值”对都是结构的典型示例。
  除非满足一下所有条件,否则不要定义成值类型(结构体)
 
  第一,类型具有基元类型的行为。类型简单,其中没有成员会修改类型的任何实例字段。
 
  第二,类型不需要从其他任何类型继承。
 
  第三,类型不会派生出其他任何类型。
 
  除了满足以上全部条件,还必须满足以下条件中的一个。
 
  第一,类型的实例较小(约是16字节或者更小)。
 
  第二,类型实例较大,但不作为方法的实参传递,也不通过方法返回。
 

堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些

结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。

在表现抽象和多级别的对象层次时,类是最好的选择

大多数情况下该类型只是一些数据时,结构时最佳的选择

 

2.什么 是.NET

      Dot Net是微软在2000提出的一整套平台,包括底层操作系统:Windows;辅助产品:Dot Net企业服务器;Mcirosoft XML Web服务:.Net My Services;开发平台:Dot Net框架,集成的开发环境:      Visual Studio 。以上几个部分组成。

  底层操作系统:当然是Windows 对全线的操作系统都提供XML Web服务支持。服务器操作系统2003开始,个人操作系统从Vista开始集成.Net Framework。并且操作系统原始的API也开始用Dot Net的API隔离,其原始构想相当庞大而激进,这在Vista的开发中显得尤为明显,后来微软砍掉了一些原本的准备在Vista上发布的特性,但是Vista也已经表现的和前任大不相同,当然其中的是非曲折又是另一个话题了。总之为了Dot Net计划微软在操作系统上投入的心力,可以非常明确的看出微软对Dot Net计划的重视。

  辅助产品:大家比较熟悉的就是SQL Server了吧,也有了脱胎换骨式 ​​的变化,首先是那个集成了原来企业管理器,查询分析器,跟踪器的大一统管理工具

    Microsoft XML Web服务:都是些微软提供的XML Web服务,有些收费有些免费。(XML Web服务当年着实是一个“显学”不过后来的发展并没有如微软预期的那样成功 )

  开发平台(Dot Net框架):包含通用语言运行时(CLR)和Dot Net框架类库(FCL)两个部分。他们提供了一致的编程模型,简化的编程方式,可靠的版本机制(用全局程序集缓存GAC来避免DLL Hell),轻便的部署管理(程序集自带的元数据可以避免ini文件和注册表) ,广泛的平台支持(只要这台机器兼容标准下的CLR和FCL就可以部署,当然运行的时候IL会变成本机代码),无缝的语言集成(JAVA跨平台,Dot Net跨语言这是那个时候论战经常看到的观点 ),自动化的内存管理(垃圾收集),类型安全(CLR会阻止利用缓冲区溢出错误进行的攻击),CLR支持跨语言调试,统一的错误报告(都用异常和原来返回的错误码说再见吧),全新的安全策略(CAS),兼容以往的COM组件。

  集成开发环境:Visual Studio 可以用来创建 Windows 平台下的 Windows 应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和 Office 插件

     什么是CLI?

     通用语言基础结构(Common Language Infrastructure,CLI)是CLR的一个子集,也就是.NET中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。在CLR结构图中CLI位于下半部分,主要包括类加载器(Class Loader)、实时编译器(IL To Native Compilers)和一个运行时环境的垃圾收集器(Garbage Collector)。CLI是.Net和CLR的灵魂,CLI为IL代码提供运行的环境,你可以将使用任何语言编写的代码通过其特定的编译器转换为MSIL代码之后运行其上,甚至还可以自己写MSIL代码在CLI上面运行。作为.Net与CLR的核心部分,CLI与C#也同时获得了ECMA的批准(ECMA-335)。拥有了C#与CLI这两项标准,你可以自己写出能够运行于任何操作系统上的.Net平台(只要你愿意)。如前所述,著名的Mono项目就是这么干的,Mono项目包括三个核心的部分:一个C#语言的编译器,一个CLI和一个类库。

      什么是CLR?

  CLR(Common Language Runtime)公共语言运行时是一个可由多种编程语言使用的“运行时”。CLR的核心功能(比如内存管理、程序集加载、安全性、异常处理小、线程同步)可由CLR的所有语言共用。

  IL是什么?

  IL中间语言,Dot Net的程序经过编译以后就形成了IL代码,在运行的时候CLR将IL编译成本地CPU指令。IL代码也称为托管代码。IL可以访问CLR的所有功能。IL也可视为一种面向对象的机器语言,可以使用汇编语言来编写IL。IL优势在于它会验证代码的正确性(参数数量,参数类型的验证)

 

JIT是什么,它​​是如何工作的?

  JIT(Just In Time)即时编译器,由CLR调用,将IL编译成本地CPU指令。

  当一段代码第一次被调用的时候,CLR指向包含在CLR内部的一个特殊函数,这个特殊函数就是JITCompiler,JITCompiler负责将IL编译成本地指令。JITCompiler知道实际调用的是哪个方法,以及该方法是那些类型定义的,JITCompiler会在定义该类型的程序集的元数据中查找被调用的方法的IL,并将IL编译成本地的CPU指令。编译的结果被放在一个内存块中,然后JITCompiler返回CLR为类型创建的内部数据结构,找到被实际调用方法对应的那条记录,修改最初对JITCompiler的引用,让其指向内存块中该被调用方法刚刚被编译好的CPU指令的地址。最后执行被调用方法的CPU指令。

     GC是什么,简述一下GC的工作方式?

  垃圾回收(garbage collection)

  Dot Net的垃圾回收可以分为两个步骤,第一步进行“标记”,垃圾回收器假设所有的对象都是垃圾,然后开始遍历每一个“根”(根包含指向引用类型对象的一个指针,值类型对象永远不会被认为是一个根),如果发现一个根引用了一个对象(非NULL),就对对象进行标记。没有被标记的对象被认为是垃圾。第二个阶段就是“压缩”,其实就是将后面的对象移动到已经成为垃圾的对象位置,使得原来的托管堆更为紧凑。从而释放了托管堆。

 

GC类中的方法影响何时对对象进行垃圾回收以及何时释放对象所分配的资源。此类中的属性提供以下信息:系统可用内存总量、分配给对象的内存的周期类别(代)。

GC跟踪并回收托管内存中分配的对象。垃圾回收器定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,垃圾回收会自动进行。或者,应用程序可以使用 Collect 方法强制进行垃圾回收。

垃圾回收由以下步骤组成:  

GC搜索托管代码中引用的托管对象。

GC尝试完成没有被引用的对象。

GC释放没有被引用的对象并回收它们的内存。

在回收期间,如果GC在托管代码中找到对某对象的一个或多个引用,则不会释放该对象。然而,GC不识别非托管代码中对对象的引用,因此,除非明确禁止,否则它有可能释放非托管代码中以独占方式使用的对象。KeepAlive 方法提供一种机制,该机制可防止垃圾回收器回收在非托管代码中仍使用的对象。