asp.net学习笔记介绍

asp.net学习笔记介绍

1.1 .NET平台基础
微软的.NET 平台核心是一系列新的集合,称为.NET Framework,我们通常会查阅的Framework就是.NET Framework。这个框架集提供了一个既可快速开发基于windows的程序,也可快速开发Web应用程序的平台。.NET Framework 提供两个主要的组成部分,通用语言运行库(CLR)和框架类库(FCL).
像许多新技术一样,有许多术语和缩写需要理解,所以我们在接下来的几部分里将介绍和解释许多在Framework里重要的术语和缩写。


1.1.1 公共语言运行库(CLR)
CLR是为.NET Framework所编写的代码的执行环境。CLR管理着.NET代码的执行,包括了内存的分配和垃圾的回收(避免内存泄露问题),安全性(包括对不同来源的代码应用不同的信任度),线程管理,强类型和其他一些任务。

只要.NET支持的语言,CLR都能运行,所以不需要为每种语言配一种单独的运行库。每种.NET语言被各自的编译器编译(例如Visual Basic .NET 编译器)成中间语言(IL).在运行时,中间语言被CLR实时编译(JIT)成本机的机器语言(CLR运行的机器).这种编译方法提供了一种灵活的方法,使我们可以在使用不同语言写代码的时候仍然可以保持本机执行的速度。

1.1.2 .NET Framework 类库(FCL)
FCL 是一系列可重用的面向对象的类,提供了基本平台的功能,从存取数据库的类ADO.NET,到文件系统模块的类(包括文件,目录和流等类),到允许我们方便的实现DNS解析,WHOIS查找和其他网络相关功能的类的网络类库。开发者们可以直接使用这些基类或者继承这些类来实现一些定制的功能。
FCL当然也封装了所有ASP.NET类。这包括了所有的ASP所有内部对象的功能,除此之外还提供了更多的功能,像提供了丰富的缓存输出和数据引擎,还有ASP.NET服务器组件模型。这些功能模块使ASP.NET很容易做到以控件为基础开发,这对VB开发者来说是很熟悉的。
除了提供Web应用程序的开发外,FCL还提供了控制台应用程序,Windows应用程序,Windows NT或Windows 2000服务等的开发。


1.1.3 公共类型系统(CTS)
CTS描述了CLR所支持的数据类型集合,这既包括了值类型(包括简单数据类型,像Byte,Int16和Boolean等),还包括了引用类型(包括了arrays,classes,对象和字符串类型)。
值类型是直接把值存储在内存中的,可以直接用名字来取得其值,看以下一段代码:
'VB.NET
Dim
myFloat As Single
myFloat = 3.1415


// C#
float myFloat;
myFloat = 3.1415;


除了这些内建的数据类型,值类型也包括了用户定义的数据类型(从System.ValueType继承的类型)如枚举类型。

引用类型是储存一个值地址的引用,而不是直接存储值。通常,值是被存储为定义类的一部分并且是通过类成员的实例来引用,如下所示:
'VB.NET
'定义类

Class myFloatClass
Public myFloat As Single
End
Class

'创建类的实例并且赋值
Dim myInstance As New myFloatClass( )
myInstance.myFloat = 3.1415


// C#
// 定义类
class myFloatClass
{
float myFloat;
}


// 创建类的实例并且赋值
myFloatClass myInstance = new myFloatClass( );
myFloatClass.myFloat = 3.1415;

 

个别的语言编译器可能用它们自己的术语来补充类型。例如,.NET用Int32来代表32位的整数,在Visual Basic .NET中用Integer,而在C#中用int表示。但是在内部实现上,Visual Basic的Interger和C#的int都是.NET的Int32类型的实现。

1.1.3.1 装箱和拆箱(boxing and unboxing)
值类型和引用类型的互相转换是通过一个叫装箱和拆箱的过程来完成的。装箱指的是隐式转换一个值类型,例如一个C#的int类型到一个引用类型(通常是对象)。当转换发生时,一个对象类型的实例被创建,只类型被复制到这个对象实例里面(在这个盒子里)。拆箱是指显式转换一个引用类型到一个指定的值类型。下面的代码演示了装箱和拆箱:

// C#
int myInt = 123; //声明一个int类型的值类型变量,并且赋值为123
object myObj = myInt;
// myInt被装箱进myObj
int myOtherInt = (int)myObject;
// 拆箱myObject到myOtherInt

1.1.4 公共语言架构(CLI)
CLI是CLR的一个子集,也就是.NET中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。在CLR结构图中CLI位于下半部分,主要包括类加载器(Class Loader)、实时编译器(IL To Native Compilers)和一个运行时环境的垃圾收集器(Garbage Collector)。CLI是.Net和CLR的灵魂,CLI为IL代码提供运行的环境,你可以将使用任何语言编写的代码通过其特定的编译器转换为MSIL代码之后运行其上,甚至还可以自己写MSIL代码在CLI上面运行。如你所知,欧洲计算机制造商协会(ECMA)已经于2001年10月13日批准C#语言规范(ECMA-334)成为一种新诞生的计算机产业标准。同时国际标准组织ISO也同意该标准进入该组织的审批阶段。并且,作为.Net与CLR的核心部分,CLI与C#也同时获得了ECMA的批准(ECMA-335)。拥有了C#与CLI这两项标准,你可以自己写出能够运行于任何操作系统上的.Net平台(只要你愿意)。如前所述,著名的Mono项目就是这么干的,Mono项目包括三个核心的部分:一个C#语言的编译器,一个CLI和一个类库。在Java的世界中,这项工作是由SUN公司完成的,SUN针对不同的操作系统开发出相应的Java虚拟机以便让一个由Java开发的应用程序运行在不同的操作系统上,但是迄今为止还没听说过微软有这方面打算(为用户提供非Windows系统的.Net平台)。
关于CLI可参考以下网站:

http://msdn.microsoft.com/library/en-us/dndotnet/html/mssharsourcecli2.asp
http://www.go-mono.org/

1.1.5 公共语言规范(CLS)
CLS是CLR所支持类型的子集,比如一系列编程语言和编译器必须遵从的规则。CLS的目的是为.NET语言间提供丰富的互用性,包括从一种.NET语言编写的类继承到另一种.NET语言写的子类,并可以交叉进行调试。
CLS定义的规则只能应用于类的公共特征。例如,类内部的实现可以使用CLS不兼容的类型(例如无符号整型),但是只要CLS兼容类型成员是公共的,这个类仍然完全可以使用到CLS的互操作性的优点。


1.1.6 类(Class)
类不是.NET平台的专用术语,但是类这个词可能对ASP开发者有点陌生。类是对象的抽象定义。包含了特定对象在运行时如何实例化的定义,如将会暴露的公共属性和方法和所有内部存储结构。

开发者可以在运行时用 new 关键字创建一个类的实例,如下所示:
//在C#中初始化.NET的StreamReader类
System.IO.StreamReader sr;
sr = new System.IO.StreamReader("C://Test.txt");
string Line;

while(sr.Peek( ) != -1)
{
Line = sr.ReadLine( );
Response.Write(Server.HtmlEncode(Line) + "<br/>");
}

注意:在C#中,new 关键字是用来初始化类的,而在Visual Basic .NET中使用 New 关键字,但是Visual Basic .NET是大小写不敏感的,而C#是大小写敏感的,因此在两种语言切换中要注意大小写。

1.1.7 名字空间(Namespaces)
名字空间是.NET Framework的一个关键部分,提供了预安装的类和自定义类的作用范围。为了把一系列类的集合封装入一个集合中,使用如下定义:
// C#
namespace myNamespace
{
class myClass
{
//类的实现代码
}
}


' VB.NET
Namespace myNamespace
Class myCls
'类的实现代码
End Class

End Namespace

名字空间也可以嵌套:
' VB.NET
Namespace myFirstNamespace
Public Class myCls
'类的实现代码
End Class
Namespace mySecondNamespace
Public Class myCls
'类的实现代码
End Class
Public Class myCls2
'类的实现代码
End Class
End Namespace

End Namespace
这段代码完全合法,因为我们在嵌套的名字空间mySecondNamespace里声明了第二个myCls。如果我们在同一名字空间里声明两个相同标识名字的类就会得到一个编译错误,报告有名称冲突,因为在每个名字空间内类的名称必须是独有的。为使用刚刚我们定义的类,我们使用下面的代码:
' VB.NET
Imports System
Imports myFirstNamespace
Imports myFirstNamespace.mySecondNamespace

Module namespaces_client_vb

Sub Main( )
Dim newClass As New myFirstNamespace.myCls
Dim newClass2 As New myCls2
Console.WriteLine("Object creation succeeded!")

End Sub

End Module
我们为了在使用该名字空间下的成员时不显式使用名字空间,在Visual Basic .NET中使用 Imports 关键字。但是,如果我们要在myFirstNamespace和mySecondNameSpace下同时使用myCls,就必须使用完全的路径名称。而引入的最下层名字空间的类可以直接使用类名,如下C#代码:
using System;
using myFirstNamespace;
using myFirstNamespace.mySecondNamespace;

class namespaces_client
{
public static void Main( )
{
myFirstNamespace.myCls newClass = new myFirstNamespace.myCls( );
myCls2 newClass2 = new myCls2( );
Console.WriteLine("Object creation succeeded!");
}
}
C#使用 using 关键字来引入名字空间。注意上面两个例子,除了引入我们自己定义的名字空间,我们也引入了System名字空间,这个名字空间使我们可以使用Cosole类,我们无需显式的调用System.Console类。

1.1.8 程序集(Assemblies)
和托管的dll一样,程序集是.Net平台部署的基本单位。.Net平台本身是由一系列程序集组成的,包括mscorlib.dll和其他一些。这些程序集的边界同样提供了版本和安全信息。
一个程序集包含了特定编译器产生的中间语言,一个程序清单(包括了程序集的信息),类型元数据和资源。我们将在以后讨论中间语言,程序清单和元数据。
程序集既可以私有的(放在一个特定的目录,在ASP.NET内是放在应用程序的/bin目录里的),也可以共享。共享的程序集存储在一个叫做全局程序集缓存(GAC)的地方。安装在GAC里的程序集必须被强命名的,就是说必须有一个关联的加密键。强命名可以通过Visual Studio .NET来完成或者使用.NET Framework SDK提供的sn.exe工具来产生一对程序集键值,然后使用al.exe工具产生基于已产生键值的签名程序集。

1.1.9 中间语言(Intermediate Language)
IL,也叫MSIL(Microsoft Intermediate Language),是一种不依赖处理器的可执行代码。IL有些像汇编语言,但是不依赖任何一种CPU;但它依赖于CLR。IL是由各种语言的编译器产生的面向CLR的代码。综上所述,.NET的程序集包含的IL是由CLR执行的。
程序运行时,CLR的实时编译系统(JIT)把IL编译成本地代码来执行。.Net Framework SDK带了一个工具叫做ngen.exe,允许预先把程序集编译成本地代码。然而,预先编译的本地代码虽然会使第一次执行程序的速度加快,但是JIT带有代码优化功能,具体看执行的代码效率和如何优化。