2023年12月30日发(作者:)

附录A:.Net

Framework和C#语言介绍

一、.NET Framework

1.1概述

.NET Framework是支持生成和运行下一代应用程序和 XML Web services 的内部 Windows 组件。.NET Framework旨在实现下列目标:

1、提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。

2、提供一个将软件部署和版本控制冲突最小化的代码执行环境。

3、提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。

4、提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。

5、使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。

6、按照工业标准生成所有通信,以确保基于 .NET Framework 的代码可与任何其他代码集成。

.NET Framework具有两个主要组件:公共语言运行库和 .NET Framework 类库。

公共语言运行库是 .NET Framework的基础。您可以将公共语言运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。这类似于Java的虚拟机。事实上,代码管理的概念是公共语言运行库的基本原则。以公共语言运行库为目标的代码称为托管代码,而不以公共语言运行库为目标的代码称为非托管代码。

.NET Framework的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。

1.2客户端应用程序开发

客户端应用程序在基于 Windows 的编程中最接近于传统风格的应用程序。这些是在桌面上显示窗口或窗体从而使用户能够执行任务的应用程序类型。客户端应用程序包括诸如字处理程序和电子表格等应用程序,还包括自定义的业务应用程序(如数据输入工具、报告工具等等)。客户端应用程序通常使用窗口、菜单、按钮和其他 GUI

元素,并且它们可能访问本地资源(如文件系统)和外围设备(如打印机)。

另一种客户端应用程序是作为网页通过 Internet 部署的传统 ActiveX 控件(现在被托管 Windows 窗体控件所替代)。此应用程序非常类似于其他客户端应用程序:它

在本机执行,可以访问本地资源,并包含图形元素。

过去,开发人员结合使用 C/C++ 与 Microsoft 基础类 (MFC) 或应用程序快速开发 (RAD) 环境(如 Microsoft® Visual Basic®)来创建此类应用程序。.NET Framework 将这些现有产品的特点合并到了单个且一致的开发环境中,该环境大大简化了客户端应用程序的开发。

包含在 .NET Framework 中的 Windows 窗体类旨在用于 GUI 开发。您可以轻松创建具有适应多变的商业需求所需的灵活性的命令窗口、按钮、菜单、工具栏和其他屏幕元素。

例如,.NET Framework 提供简单的属性以调整与窗体相关联的可视属性。某些情况下,基础操作系统不支持直接更改这些属性,而在这些情况下,.NET Framework

将自动重新创建窗体。这是 .NET Framework 集成开发人员接口从而使编码更简单更一致的许多方法之一。

和 ActiveX 控件不同,Windows 窗体控件具有对用户计算机的不完全受信任的访问权限。这意味着二进制代码或在本机执行的代码可访问用户系统上的某些资源,例如 GUI 元素和访问受限制的文件,但这些代码不能访问或危害其他资源。由于具有代码访问安全性,许多曾经需要安装在用户系统上的应用程序现在可以通过 Web 部署。您的应用程序可以在像网页那样部署时实现本地应用程序的功能。

1.3 .NET Framework版本

.NET Framework1.1

.NET Framework2.0

.NET Framework3.0

.NET Framework3.5

最新版:.NET Framework 4 Beta 2

1.4 .net框架

.NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境。.NET框架的目的是便于开发人员更容易地建立Web应用程序和Web服务,使得Internet上的各应用程序之间,可以使用Web服务进行沟通。从层次结构来看,.NET框架又包括三个主要组成部分:公共语言运行时(CLR:Common Language Runtime)、服务框架(Services Framework)和上层的两类应用模板——传统的Windows应用程序模板(Win Forms)和基于的面向Web的网络应用程序模板(Web Forms和Web Services)。

公共语言运行时(CLR),是一个运行时环境,管理代码的执行并使开发过程变得更加简单。CLR是一种受控的执行环境,其功能通过编译器与其它工具共同展现。

在CLR之上的是服务框架,它提供了一套开发人员希望在标准语言库中存在的基类库,包括集合、输入/输出、字符串及数据类。

二、C#语言介绍

2.1概述

C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角。

2.2 C#简介

C#(读做 "C sharp",中文译音暂时没有,专业人士一般读"C sharp",现在很多非专业一般读"C井"。

C#是一种安全的、稳定的、简单的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模版,不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。

并且C#成为ECMA与ISO标准规范。C#看似基于C++写成,但又融入其它语言如Delphi、Java、VB等。

微软C#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说struts),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java。C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:"这是对Java的反击"。

2.3 C#从Java继承而来的特点

类:在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好。Java的关键字import已经被替换成using,它起到了同样的作用。一个类开始执行的起点是静态方法Main()。下面的Hello World程序展示了基本的形式:

using System;

class Hello

{

static void Main()

{

ine("Hello, world");

}

}

在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(n

amespace)。这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字sealed就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.接口:就象在Java中一样,一个接口是一组方法集合的抽象定义.当一个类或结构体实现一个接口的时候,它必须实现这个接口中定义的所有方法.一个单一的类可以实现几个接口.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层.NET框架进行自动内存垃圾回收。

2.4 C#从C和C++继承的特点

编译:程序直接编译成标准的二进制可执行形式。但C#的源程序并不是被编译成二进制可执行形式,而是一种中间语言,类似于JAVA字节码。如果前面的Hello World程序被保存成一个文本文件并被命名为,它将被编译成命名的可执行程序。

结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据声明和方法。但与C++不同的是,C#结构体与类是不同的而且不支持继承。他又与Java有相同的地方,就是一个结构体可以实现接口。

预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制。可用的预编译指令有:

#define

#undef

#if

#elif

#else

#endif

#warning

#error

#line []

没有了#include 伪指令。你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里。在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名。

操作符重载 一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被被重载的单目操作符是:

+ - ! ~ ++ -- true false

能够被重载的二元运算符是:

+ - * / % & | ^ << >> == != > < >= <=

2.5 C#独有的特点

C#最引人入胜的地方是它和Java的不同,而不是相似的地方。

中间代码

微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地。微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码。它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢。而这种实现方式决定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"等语言编写的程序)将在性能上超过"解释性的"Java代码。当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布。但是Java JIT编译器的普遍存在使得Java和C#在性能上相对相同。象"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码。

命名空间中的申明

当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类。同在这个命名空间里(在类的外面)你还有可能声明接口,枚举类型和结构体。必须使用using关键字来引用其他命名空间的内容。

基本的数据类型

C#拥有比C,C++或者Java更广泛的数据类型。这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal。象Java一样,所有这些类型都有一个固定的大小。又象C和C++一样,每个数据类型都有有符号和无符号两种类型。与Java相同的是,一个字符变量包含的是一个16位的Unicode字。C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字.

两个基本类

一个名叫object的类是所有其他类的基类。而一个名叫string的类也象object一样是这个语言的一部分。作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它。

参数传递

方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值。

与COM的集成

C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET语言子类化。

索引下标

一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的。

public class ListBox: Control

{

private string[] items;

public string this[int index]

{

get

{

return items[index];

}

set

{

items[index] = value;

Repaint();

}

}

}

可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样:

ListBox listBox = ...;

listBox[0] = "hello";

ine(listBox[0]);

代理和反馈

一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明。

2.6 C#关键字完整列表

abstract

as

base

bool

break

byte

case

catch

char

checked

class

const

continue

decimal

default

delegate

do

double

else

enum

ecent

explicit

extern

false

finally

fixed

float

for

foreach

get

goto

if

implicit

in

int

interface

internal

is

lock

long

namespace

new

null

object

out

override

partial

private

protected

public

readonly

ref

return

sbyte

sealed

set

short

sizeof

stackalloc

static

struct

switch

this

throw

true

try

typeof

uint

ulong

unchecked

unsafe

ushort

using

value

virtual

volatile

volatile

void

where

while

yield

其中有几个比较容易弄错的

关键字 描 述

abstract

as

可以和类、方法、属性、索引器及事件一起使用,标识一个可以扩展但不能被实体化的、必须被实现的类或方法。

一个转换操作符,如果转换失败,就返回null。

base

catch

checked

const

delegate

enum

event

explicit

extern

finally

fixed

foreach

goto

implicit

interface

internal

用于访问被派生类或构造中的同名成员隐藏的基类成员。

定义一个代码块,在特定类型异常抛出时,执行块内代码。 参见try和finally。

既是操作符又是语句。确保编译器运行时,检查整数类型操作或转换时出现的溢出。

标识一个可在编译时计算出来的变量值,即一经指派不可修改的值。

指定一个声明为一种委托类型。委托把方法封装为可调用实体,能在委托实体中调用。

表示一个已命名常量群集的值类型。

允许一个类或对象提供通知的成员,他必须是委托类型。

一个定义用户自定义转换操作符的操作符,通常用来将内建类型转换为用户定义类型或反向操作。必须再转换时调用显示转换操作符。

标识一个将在外部(通常不是c#语言)实现的方法。

定义一个代码块,在程序控制离开try代码快后执行。参见try和catch。

在一个代码块执行时,在固定内存位置为一个变量指派一个指针。

用于遍历一个群集的元素。

一个跳转语句,将程序执行重定向到一个标签语句。

一个操作符,定义一个用户定义的转换操作符。通常用来将预定义类型转换为用户定义类型或反向操作。隐式转换操作符必须在转换时使用。

将一个声明指定为接口类型,即实现类或构造必须遵循的合同。

一个访问修饰符。

namespace 定义一个逻辑组的类型和命名空间。

operator

out

params

readonly

ref

sealed

sizeof

stackalloc

struct

throw

try

typeof

unchecked

unsafe

using

virtual

volatile

用来声明或多载一个操作符。

标识一个参数值会受影响的参数,但在传入方法时,该参数无需先初始化。

声明一个参数数组。如果使用,必须修改指定的最后一个参数。 允许可选参数。

标识一个变量的值在初始化后不可修改。

标识一个参数值可能会受影响的参数。

防止类型被派生,防止方法和property被覆载。

一个操作符,以byte为单位返回一个值类型的长度。

返回在堆上分配的一个内存块的指针。

struct是一种值类型,可以声明常量、字段、方法、property、索引器、操作符、构造器和内嵌类型。

抛出一个异常。

异常处理代码块的组成部分之一。try代码块包括可能会抛出异常的代码。参阅catch和finally关键字。

一个操作符,返回传入参数的类型。

禁止溢出检查。

标注包含指针操作的代码块、方法或类。

当用于命名空间时,using关键字允许访问该命名空间中的类型,而无需指定其全名。也用于定义finalization操作的范围。

一个方法修饰符,标识可被覆载的方法。

标识一个可被操作系统、某些硬件设备或并发线程修改的attribute。