asp.net使用说明
使用一个技术架构, 需要了解其原理, 并知道其实现的思路. 为了更清楚地知道这一点, 必需从.NET架构开始.
现在的互联网技术, 甚至是一般的连网平台的技术, 跨平台性都是一个重要的特性. 在跨平台的背景下我们讨论各种技术.
.NET的开发虽然比较早, 但是后来被ECMA规范化了, 标准是ECMA335.
关于.NET技术, 我们以Mono的实现为例进行介绍. Visual Studio 开发环境是相同的原理可以理解的.
mono计划从核心虚拟机引擎开始. 这个引擎用于编译C#等代码, 也就是高层的代码. 在一些平台, 比如x86, x86-64当中, 这个引擎具有实时性, 也就是现在可以编译成平台相关代码的形式. 在其它平台上, Mono用解释的方式运行.NET的相关代码.
mono的目标就是创建符合.NET标准的工具. 而.NET架构的核心, 就是C#编译器, 以及通用语言架构(Common Language Instructure, CLI). 因此C#才成为.NET开发的首选的语言. Mono计划中, C#编译器由GPL规范, 运行库由LGPL规范, 类库则由MIT许可证规范. 因此mono是开源的一个计划. 微软也提供了一个共享编码公共语言基础库, 但并不是开源的, 虽然可以跨平台使用.
公共语言基础CLI是ECMA335标准, CLR,即公共语言运行环境, 则是CLI的标准实现, Mono即是其实现者之一. 它可以执行已经编译出来的.NET应用程序. linux下面的mono命令大概就是用于执行编译出来的.NET应用程序的. 虽然.NET应用程序往往使用.exe与.dll等格式, 但是与传统的.exe格式还是有所区别的.
在能够编译本地运行的C#代码, 大概是所有的.NET平台的基础. 了解了C#的编译的原理, 就不难知道其它的语言也可以利用C#语言的这一套基础设施, 比如C#运行时的库, 就可以为C#, IronPython, VB.Net, C++/CLI等.NET平台上的语言使用. .NET平台用命名空间组织各个类库, 使得所有的程序库有相同的调用方法. 命名空间, 比如System.Web, Microsoft.abc等.
.NET framework是微软开发的一套.NET的框架, 主要的内容是大量的类库. 它是继Microsoft DNA之后微软的新开发平台. 实际上, .NET framework与mono, Sliverlight, 以及XNA都是差不多的道理.
.NET framework提供了类库之后, ASP.NET, ADO.NET Windows Forms都是基于这个平台的创建出来的技术. 其中ASP.NET其实是在.NET framework中提供的支持开发Web应用程序的类库, 封装在System.Web.dll文件中, 以System.Web作为命名空间, 它具有负责网页处理的功能. 它是ASP技术的后继, 但是各方面的发展潜力比ASP要大很多.
原来的ASP的特点是其代码封装在HTML标签当中, 在ASP.NET中, 添加了面向对象的支持而变得集成在相应类的Render机制中, 形成一个包装.
.NET技术在2.0之后变得成熟, 在3.5之后又添加了许许多多的功能.
ASP.NET MVC是又开发出来的一个类库, 在System.Web.Mvc.dll当中, 它添加了ASP.NET Routing 以支持动作流与URL重写等功能.
开发网页应用程序
开发网页应用程序的时间, 服务器端的架设仍与原来的机制类似. xsp4是在unix下面支持.NET动态网页技术的一个服务器, 但是配置Apache与nginx以支持.NET格式的动态网页也并不是困难的事情, 因为只需要过滤出相应的文件, 让mod-mono-server2接收并处理就可以了.
后端的数据库当然是由.NET程序来连接. 实际上流行的关系数据库软件面向.NET都是有接口的, 我们可以很容易地在其中写出接口文件.
比如MySQL数据库的, 只需拷贝Mysql.Data.dll文件到系统库目录中即可. 实际上, 这只是编译C#应用程序的时候添加的一个编译选项而已. 使用gacutil工具, 可以将系统库安装到标准目录当中.
学习使用.NET开发应用的步骤
鉴于.NET的技术架构, 首先了解一个C#程序的编译过程即可. 虽然编译出来的文件以.exe作为结尾, 但是与传统的.exe格式我们可以认为是没有关联的. 然后我们学会使用C#面向对象的方法, 调用它的各种类库, 特别是面向数据库的接口.
编译好本地运行的程序之后, 我们再一步一步地走向网页应用程序.
Csharp基本介绍
C#与java有更多的相近, 然而与com是直接集成的, 并且是Windows网络框架的主角. 现在的大部分的微软的技术, 以C#为基础了.
C#与C/C++相比, 是对后者的继承, 并且去掉了宏, 以及多重继承的规则. C#综合了C++的效率与VB的简单可视化操作, 是.NET的首选的语言.
C#可以调用C/C++编写的本机上的原生的函数.
C#由Anders Hejlsberg主持编写, 于2000年6月发布. 新增了许多的功能与语法糖. Anders也是Dephi语言的开发者. C#很可能是一个全能型的语言, 从复杂的操作系统到嵌入式可能均适用.
类的声明与Java相似而不像C语言. 而且C#的结构体与类不支持继承. 但与Java相同的是一个结构体可以实现接口. 类可以定义成抽象的或者不可继承的. 被声明为abstract的类不能被实例化, 只能被用作一个基类. 而C#的关键字final就象Java的final一样, 具有此声明的类不能被用作另外一个类的基类.
与Java一样, 一个界面是一组方法集合的抽象定义, 当类或者结构体实现这个界面的时候, 它必须实现所有的方法, 而且单一的类可以实现几个接口.
C#也使用true和false作为布尔常量.
C#的内存管理由底层的.NET框架负责. 一个基本的C#类中包含数据成员, 属性, 构造器和方法, 属性可以是静态或者实例成员.
C#是一个强类型的语言, 它的数值类型中有些可以进行隐式转换, 但是其它的必须是显式的转换.
程序被编译成标准的二进制可执行文件, 但是C#的源程序并不是二进制可执行的形式, 而是一种中间语言, 类似于字节码. 如果一个程序保存成一个以cs为后缀的文件, 那么编译器也能将它编译成可执行程序. 虽然扩展名是.exe, 但是没有.NET的时候仍然是不能被执行的.
C#的编译结果不是标准的二进制形式, 而是由.NET的CLR执行的中间代码.
C#中也有预编译指令, 有|#define|等, 但是没有了|#include|.
C#中也有一些操作符重载, 而且数据类型有值类型和引用类型两种.引用类型特点是不自动创建新的分配单元.int, byte是特殊的值类型, 称为简单类型. 所有的值类型都继承自System.ValueType类型, 所有有关的引用和类型都继承自System.Object基类.
方法可以支持可变数目的参数.
注意, C#语言的效率仅是能够与Java相抗衡, 而不足以与C或者汇编相近.
各版本的特性
在2.0版本起, 支持Python那样的yield迭代器类型.
从3.0起, 则支持LINQ, 也就是语言集成查询, 可以在LINQ上下文中作为关键字.
从3.0起, 支持了匿名类型, 使用var关键字即可声明, 因此可以局部变量类型推断.
从3.0起, 还支持了lambda表达式.
从4.0起支持了动态对象, 使用dynamic关键字声明, 而且有具名参数与可选参数, 而且可以更方便地与.COM组件交互.
mono几乎百分之百地实现了C#, 所以是一个不错的编译器, 使用 mcs hello.cs 可以直接编译出.exe文件, 使用 mono hello.exe 则可以直接从虚拟机里面运行它.
LINQ
它是微软的一项技术, 目前可以支持VB.NET与C#.
新闻报道
根据2014年11月13日的新闻,微软表示将开源.NET,包括整个.NET的核心类别,ASP.NET5.0、.NET CLR、Just-In Time Complier、Garbage Collection以及Base Class Libraries等技术。这一开源让.NET正式推出,使得.NET平台在开源世界以后甚至会优于Java的平台。个人感觉这一新闻比较重要。而且ASP.NET 5.0最好能与Mono计划融合。
C\(\sharp\)编程语言
C\(\sharp\)是基于.net平台的,但是关键还在于它是ECMA规范。C\(\sharp\)之类的项目是由Anders Hejlsberg主持开发的。这之后,作为.Net概念的发起人之一,安德斯·海尔斯伯格被任命为微软.Net的首席架构师,主持.Net的开发工作。
C\(\sharp\)也是强类型的语言,而且声明变量采用|var|关键字,因此具有类型推断的能力。C\(\sharp\)也是多范式的,支持函数式编程语言。
C\(\sharp\)的类型系统称为Common Type System (CTS)。此类型系统中,所有的类型(包括整数等原语类型)都是System.Object的类的子类。这样一来,每一个类都有一个ToString()方法。
CTS把数据类型分成两个范畴。一个是引用类型,另一个是值类型。Instances of value types do not have referential identity nor referential comparison semantics - equality and inequality comparisons for value types compare the actual data values within the instances, unless the corresponding operators are overloaded. Value types are derived from System.ValueType, always have a default value, and can always be created and copied. Some other limitations on value types are that they cannot derive from each other (but can implement interfaces) and cannot have an explicit default (parameterless) constructor. Examples of value types are all primitive types, such as int (a signed 32-bit integer), float (a 32-bit IEEE floating-point number), char (a 16-bit Unicode code unit), and System.DateTime (identifies a specific point in time with nanosecond precision). Other examples are enum (enumerations) and struct (user defined structures).
C\(\sharp\)的库使用ECMA的规范,The C# specification details a minimum set of types and class libraries that the compiler expects to have available. In practice, C# is most often used with some implementation of the Common Language Infrastructure (CLI), which is standardized as ECMA-335 Common Language Infrastructure (CLI).也就是在CLI的基础上执行的。
C#也是ISO/IEC 23270:2006规范。
上面是关于C#的类型系统的介绍:In Microsoft’s .NET Framework, the Common Type System (CTS) is a standard that specifies how type definitions and specific values of types are represented in computer memory. It is intended to allow programs written in different programming languages to easily share information. As used in programming languages, a type can be described as a definition of a set of values (for example, “all integers between 0 and 10”), and the allowable operations on those values (for example, addition and subtraction).
The specification for the CTS is contained in Ecma standard 335, “Common Language Infrastructure (CLI) Partitions I to VI.” The CLI and the CTS were created by Microsoft, and the Microsoft .NET framework is an implementation of the standard. 也就是说,CTS类型系统是ECMA的规范。
Value types directly contain their data, and instances of value types are either allocated on the stack or allocated inline in a structure. Value types can be built-in (implemented by the runtime), user-defined, or enumerations.
Reference types store a reference to the value’s memory address, and are allocated on the heap. Reference types can be self-describing types, pointer types, or interface types. The type of a reference type can be determined from values of self-describing types. Self-describing types are further split into arrays and class types. The class types are user-defined classes, boxed value types, and delegates.
Boxing:Converting value types to reference types is also known as boxing. As can be seen in the example below, it is not necessary to tell the compiler an Int32 is boxed to an object, because it takes care of this itself.
Unboxing:The following example intends to show how to unbox a reference type back to a value type. First an Int32 is boxed to an object, and then it is unboxed again. Note that unboxing requires explicit cast.