• .NET基础拾遗系列第三篇


    前言:                                                                                      
            回去看了自己写的一篇文章,结合现在.net面试的题目,我还是感觉头晕晕的,.net的基础知识很多,所以我觉得很有必要给初学者一个指引,其实也可以说是给我自己一个知识复习的机会,如果你是身经百战的.net高手,那请你飘过就可以了,如果我说的有错误的话,那请各位批评指正!之前写了两篇几个概念,我这一篇主要是说说.net开发当中的基础问题,每一个问题我尽量结合一个实例来说明,如果一下是我要说的内容:
    .net的框架 
    .net的命名空间
    ASP和ASP.net对比
    ado和ado.net区别
    程序集和应用程序域
    编译.net程序 
    栈和堆
    .net的垃圾收集机制
    理解可终结对象和可处置对象
    处理异常
     在写一下之前,我想补充一下framework类库的知识                    
    在.net framework 中包含的类库(framework class library ,FCL)是一系列的DLL程序集的统称,这些程序集合含有数千个类型定义,每一个类型都揭示了一下功能,MS还发布了其他许多的库,比如winfx,DirectX SDK,这些附加的库提供了更多类型揭示了更多可用的功能,下面是应用程序开放人员利用这些程序集能够创建的一部分的应用程序
    • Web服务(Web service )这是一系列的特殊的方法,可以非常轻松处理通过Internet 发送的,基于XML的消息
    • web窗体(Web Form)这是一系列基于html的应用程序(网站)通常Web窗体应用程序能查询数据库和调用Web服务,合并和过滤返回的信息,然后使用一个基于html的用户界面,在浏览器中显示信息
    • Windows 窗体(windows Form)这是一系列基于Windows GUI应用程序,开发人员不是使用一个web窗体页来创建应用程序GUI,而是使用Windows桌面提供的更强大的,性能更加好的功能,Windows窗体应用程序可以利用控件,菜单以及鼠标/键盘事件,他们能直接与底层操作系统交换信息,于Web窗体应用程序类似,Windows窗体应用程序也可以查询数据库和使用Web服务
    • Windows 控制台应用程序 如果应用程序对UI的需求比较简单,那么控制台应用程序提供了一中快速,简单的方式来生成一个应用程序,编译器,实用程序和工具通常作为控制台应用程序来实现
    • Windows 服务 是的,完全可以实习.NET Framework 来生成“服务”应用程序,他们可以使用Windows服务控制管理器(Service Control Manager,SCM)来进行控制
    • 组件库(component library ).NET Framework 可以生成独立的程序集(组件),其中包含的类型可以轻松集成到前面提到的任何一种类型的应用程序中
    参考《CLR Via c#》
    .net框架:                                                                                
          我们经常反复地提到.net这个概念,那么他到底是什么呢?.net是微软打造和极力推荐的核心技术,他就是希望技术可以实现用户在任何地方,任何时间,利用然和设备都可以访问的信息,文件和程序,他的核心内容之一就是搭建第三代互联网的平台,这个网络平台将打破不同的上网设备以及不同的操作系统,不同的网站以及各大机构之间的网络障碍,解决网站之间的协同合作问题,最大限度的实现资源共享.
           .net框架(.net frameword)主要的3个组成部分:
    公共语言运行库(commom language runtime,CLR)
    基础类库(base  class library)
    asp.net, vb.net,c#等语言运行库
           公共语言运行库是.net框架的运行环境,在某种程度上,CLR与Java的虚拟机原理相同,他负责运行和维护用户编写的任何程序代码,包括内存管理,线程执行,代码执行,代码验证,编译以及其他系统的服务,举例说明.
          拿一张.ASPX格式的网页来说说这个执行过程
    首先,当.ASPX格式的网页被第一次访问的时候,就会编译成一种中间语言(Microsoft Intermediate Language,MSIL),然后利用即时编译器(Just In Time,JIT)声称相应的机器代码以便执行;当网页再一次被访问的时候,就只需要有MSIL语言生成机器代码就可以了,但是如果源代码有改动,就需要重修编译为MSIL语言,然后再生成机器代码.
         基础类库是.net框架面向所有的.net程序员提供的一个工友的基础类库,该类库提供了上百个面向对象的类来提供从事数学计算,字符操作到数据库操作等各种复杂的功能,利用这些类用户可以快速地搭建起各种应用程序。
         类库中常见的类如下:
    System:提供所有底层系统服务,包括输入输出,驱件驱动,文本处理
    Data:提供数据处理操作
    XML:提供了XML文件的出来操作
    Web:提供用来完成用户界面和Web服务的任务,这个类是ASP.NET最常见的类
    WindowForms:提供了传统的桌面应用程序的服务
    Drawing:提供创建图形的功能
    ...................................
         由于管理很多类,这样子是一件很复杂的操作,所有.net引用了命名空间这个概念,所谓的命名空间的具体请接下来看.
     
    .net的命名空间:                                                                       
       命名空间就是及爱你过许多功能类似的类组成一个逻辑单元,使用命名空间的方法可以反映程序的逻辑关系,并且可以避免类名的冲突,命名空间是各种类或者其他类型名称的逻辑组织方式,而不是物理组织方式,比如下面的例子:
    System.Windows.Forms.MessageBox.Show("你好!!");
    
    在你运行当中会出现一个“确定”按钮的对话框,并停止程序的运行,其中我们System.Windows.Forms就是命名空间,其调用了MessageBox类的Show静态方法。这种将命名空间和类名称用点和符合相连使用时,类名被称为全饰类名,用同样的方式调用.net基类的所有类型。当代码多处使用相同的命名空间时,还有一个引用命名空间的方法,就是在程序的代码顶部使用using 关键字引入命名空间,这样子可以一次引入,大大减少重复的工作
    部分常规的FCL命名空间 

     命名空间 

    内容说明
    System 包含每个应用程序要使用的全部基本类型
    System.Data 包含用于和数据库通信以及处理数据的类型
    System.Drawing 包含用于处理2D图形的类型,这些类型通常由Windows窗体应用程序使用,并可以创建要在Web窗体页面上显示的图像
    System.IO 包含用于执行流I/O以及浏览目录/文件的类型
    System.Net 包含实现低级网络通信并于一些通用Internet协议协同工作的类型
    System.Rumtime.InteropService 包含允许托管代码访问非托管OS平台功能(比如COM组件以及Win32或者定制DLL中的函数)的类型
    System.Security 包含用于保护数据和资源的类型
    System.Text 包含用于处理采用各种编码方式的文本(比如ASCII和Ubicode)
    System.Threading 包含用于一步操作和同步资源访问的类型
    System.Xml 包含用于处理XML架构(XML Schema)和数据的类型

     
    举例定义一个用户信息类:username.cs
     
    //自定义一个loginMain命名空间
    namespace loginMain
    {
    publicclass Username
    {
    ///<summary>
    /// 创建字符串类型的字段name
    ///</summary>
    publicstring name ="bacteroid";
    }
    }
     
     定义一个信息输出类:ShowMsg.cs: 
     
    //自定义一个loginMain命名空间
    namespace loginMain
    {
    publicclass ShowMsg
    {
    ///<summary>
    /// 构造函数输出信息
    ///</summary>
    public ShowMsg()
    {
    Console.WriteLine(
    "我是类菌体,身高178公分,喜爱编程");
    }
    }
    }
     
     最后是主程序类,Login.cs
    //自定义一个loginMain命名空间
    namespace loginMain
    {
    class Login
    {
    staticvoid Main(string[] args)
    {
    Console.WriteLine(
    "输出你的大名:");
    string input = Console.ReadLine();//接受输入,并赋值给input字符串变量
    Username a =new Username();//创建实例a
    if (input == a.name)
    {
    Console.WriteLine(
    "{0},你输入正确,登录成功", a.name);
    ShowMsg b
    =new ShowMsg();//创建实例b

    }
    else
    {
    Console.WriteLine(
    "你输入错误,请重新输入!");
    }
    Console.ReadLine();

    }
    }
    }
     
     程序运行结果为:
     
     解析:上例子当中Login.cs代码通过自定义的loginMain命名空间直接在主程序中访问Username.cs和ShowMsg.cs,进一步分析自定义的命名空间,可以再同一个程序集中定义多个命名空间,并且可以嵌套,如下例子:
    namespace A
    {
    namespace B
    {
    class class1{}
    }
    namespace C
    {
    class class2{}
    }
    }
    namespace D.E
    {
    class class3{}
    }
           命名A包括命名B,C,命名D包括E,可以看到命名空间只是有组织地编写长类型名的方式,通过点符号表名类型名称的含义以及关联性,我建议在程序顶部导入使用的命名空间.
    进一步深化可以知道CLR(公共语言运行时)提供运行库的环境,BCL(基类库)提供丰富的类库,适用于全部的.net编程语言编写的托管代码调用,其中基类库不仅封装了各种类型,而且还支持很多的服务,他在物理表现为很多共享的程序集,这些程序集当中又有大量的核心数据类型和常见的编程任务,.net编程语言通过命名空间使用这些类库,命名空间就是程序集内相关类型的分组,一个程序集就包含有很多的命名空间,每一个命名空间集包含有很多种类型,即命名空间就是类名的扩展。
     
     ASP和ASP.net对比:                                                               
           asp对于园里很多人都不会陌生吧,也可能说很多人都是从asp换到asp.net上来的,ASP.NET是微软公司的.NET Framework的一部分,相对asp来说,一下的这些特点你必须了解,这样子对于你选择什么开发会有很大的帮助...

    (1)开发效率,asp页面将呈现代码和html混合着编写,其内容和格式以及程序代码耦合度就很高,asp在实质上产生大量繁琐页面,代码的可读性和维护性比较差,严重影响了项目开发的效率,但是其中他用的include指令让程序体现模块化,但是还不是彻底的解决方法;而asp.net将前台呈现的部分和程序代码处理分为2个页面,实现了逻辑代码和表现内容的完全分离,使问题快速解决,尤其在大型的Web项目中,asp.net的开发效率比asp高。

    (2)执行效率,asp采用的是Vb.Script或者是JavaScript脚本语言编辑,这种代码不需要编译,每一次请求的时候都需要解析执行,执行效率非常低;asp.net是建立在.net framework之上的,可采用 Visual Basic,C#,c++等程序设计语言,asp.net在首次执行的进行了编译,编译后的程序语法哦请求的时候直接运行,所以速度和效率比asp高很多咯

    (3)代码量,asp需要对所有的要实现的功能通过编写代码实现,例如配合前台的Javascript的验证功能,文件功能等;asp.net中可采用服务器空间轻松实现,所以项目越复杂。使用asp.net的代码量比asp越少

    (4)很好的模式,asp程序是面向过程的模式,在大型网站开发非常吃力;但是asp.net是面向对象的,并且有丰富的.net类库使用,利用面向对象各种优秀的设计模式,他利于团队合作开发,其可读性,可维护性远远超过asp程序

          
        个人有感而发,我比较喜欢用asp.net开发,因为asp.net的页面是完全面向对象,在页面中,可以使用属性,方法和事件来处理HTML元素。asp.net页框架为在服务器上运行的代码中客户端事件提供了统一的模型,使用户不必考虑太多基于web的应用程序中固有的客户端和服务器隔离的实现细节,asp.net提供了framework的所以优点包含托管环境,类型安全性和继承,asp.net就是网页版的.net应用程序。
         附加内容:Code-Behind技术,代码分离技术将asp.net的程序需要的一个页面分为*.aspx和*.cs两个文件,实现了html代码和服务器逻辑代码的分离,这样子便于代码编写以及整理和调试。
     
    ado和ado.net区别:                                                                    
          asp内置的ADO组件是一个COM组件库,用于连接并操作数据库的数据,使用ADO组件时,首先打开数据库连接,通过sql命令帅选出需要的数据并放在记录集,然后数据处理后(如修改)进行更新,最后断开数据库连接。
          .net framework的ADO.NET在ADO基础上改进了,特别是在断开数据的记录集方面,ADO.NET提供了Dataset对象,非常方便在数据库断开情况下操作数据,并且ADO.NET提供了对XML文档的完善支持,所以通过ADO.NET可以方便同其他的异构的项目交换数据,相对于ADO,ADO.NET提供了专用于SQL Server的一种新类,可以更好地发挥数据库的性能。对比下两者的工作模式;
     
          ADO是asp的内置组件,用于asp程序存取数据源的数据修改添加。其操作的数据源不拘于数据库,还可以是其他的数据表,比如,Excel,文本文件,即ODBC能存取所有的数据源,ADO提供了7个对象和4个数据集合,用于操作数据源的数据,上面图示当中的操作不一定是全部执行,这要根据实质情况来定,ADO常见的对象有Connection,Recordset,Command,通过这3个对象覆盖了asp的数据库连接,简单查询,控制查询数据,以及增删查改等功能。
     
     
         ADO.NET和ADO名称有点类似,但是他们的类和访问数据的方式都不相同,他是与数据库访问操作有关的对象模型集合,其表现形式是.NET的类库,ADO.NET核心部分就是.NET Data Provider和Dataset对象,前者被称为是数据提供者,后者是数据结果对象的。.NET Data Privider 用于数据处理以及快速只进,只读访问数据,包括Connection,Command,DataReader,DataAdapter着4个对象,Dataset对象支持ADO.NET的断开式,分布式数据方案,允许服务器内存中存储数据。
      
    程序集和应用程序域: (参考一本书)                                        
          任何.NET程序均是由程序集构成,程序集是包含已编译的,面向.net framework 代码的逻辑单元,当程序集存储于多个文件时,一定是有一个主要的文件包括程序集主程序的入口,这个主文件就描述了相同程序集的其他文件。程序集包括描述自身的元数据,这种元数据位于程序集列表中,用于检查版本以及自身的完整性;应用程序域是.NET中程序的“边界”,相对于进程边界,应用程序域边界范围更小,进程可以有效的保证不同的程序安全运行,某个程序出错并不会影响其他程序。但是进程对于多程序运行系统性能做出了妥协,这就是因为进行之间不共享内存。使用基于DLL的组件可以解决这个问题,我们可以将所有的DLL组件都放在同一个地址空间中运行,但是这样子当某一个组件出错了也会影响其他的组件。所以,使用应用程序域可分离组件,并且不会导致类似进程的性能问题。
          一个进程内可以容纳多个应用程序域,这样子,.net的应用程序域就可以使多个应用程序运行于同一个进程。
        举例说明程序集合应用程序域的简单应用:
        建立一个cxy项目,代码如下,
       
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace cxy
    {
    class Program
    {
    staticvoid Main(string[] args)
    {
    //创建AppDomain类型current,用于引用AppDomain.CurrentDomain
    AppDomain current = AppDomain.CurrentDomain;
    //输出程序的应用程序域的名称
    Console.WriteLine("我是程序集cxy,我所在的应用程序域是{0}",current.FriendlyName);
    Console.ReadLine();
    }
    }
    }
     
    输入结果:
     
    建立一个Cyz,代码如下:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace Cyz
    {
    class Program
    {
    staticvoid Main(string[] args)
    {
    //创建AppDomain类型 one,用于引用AppDomain.CurrentDomain
    AppDomain one = AppDomain.CurrentDomain;
    //输出one的基目录以及名称,上下文信息
    Console.WriteLine("我是程序集Cyz,我的基目录是:{0}\n 我所在的应用程序域的名称和上下文策略是{1}",one.BaseDirectory,one.ToString());
    //在当前的应用程序中加载程序集cxy.vshost.exe
    one.ExecuteAssembly("cxy.vshost.exe");
    Console.WriteLine(
    "\n上面的cxy.vshost.exe和下面的cxy.vshost.exe位于不同的应用程序域\n");
    AppDomain two
    = AppDomain.CreateDomain("Room-cxy");
    //twou应用程序域装载(执行)cxy.vshost.exe
    two.ExecuteAssembly("cxy.vshost.exe");
    //输出two的基目录以及名称,上下文信息
    Console.WriteLine("cxy程序集的基目录在:{0}\n cxy程序集所在的应用程序域的名称及上下文策略:{1}",two.BaseDirectory,two.ToString());
    Console.ReadLine();
    }
    }
    }
     
     输出结果:
     
     解析:如下图所示,cxy.vshost.exe程序集首先被加载到当前的应用程序域,然后被加载到名称为Room-cxy的应用程序域中,Cyz程序集所在的应用程序被称为进程进程中的主要程序域,这是运行时自动创建的。
     
     
     结尾:                                                                                      
    这篇文章主要是说到:.NET的一些基础知识,同时结合例子说明了这些基础在.net开发中碰到的,文章没有很简洁的语言,完全是个人处以总结性的口吻在写,希望得到大家尤其是.net初学者的喜欢,我在这里谢谢了!下一篇继续把没有说到的继续唠叨!!

     同类希望你喜欢:

    .NET基础拾遗系列第一篇

    .NET基础拾遗系列第二篇

                          

    作者:类菌体
    出处:http://www.cnblogs.com/bacteroid/archive/2011/05/18/2050414.html
    关于作者:在校学生
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接
    如有问题,可以通过303323670@qq.com 联系我,非常感谢。

  • 相关阅读:
    hdu1828线段树(两次扫描+离散化)
    hdu1542线段树(扫描线+离散化)
    二分思想
    hdu2871线段树区间更新
    git初体验
    python笔记-模块
    python笔记-动态类型
    AWS上创建EKS(K8S)集群
    Akamai CDN刷新(通过Akamai cli 自动刷新)
    创建Akamai cdn api授权
  • 原文地址:https://www.cnblogs.com/bacteroid/p/2050414.html
Copyright © 2020-2023  润新知