一 C#的新特性
1 SqlServer2005集成
2 64位支持
3 泛型 可以避免装箱拆箱过程
4 匿名方法
5 可空类型
6 迭代器
7 部分类
二 相异值类型和引用类型
1 C++中通过指针来访问变量,vb中通过对象来访问引用类型,C#中引用类型的实例总是存储在托管堆的内存区域中,而值类型存储在堆栈中.
2 强数据类型 所有变量都清晰的标记为属于某个特定的数据类型.没有了vb和脚本语言的Variant数据类型.vb无需考虑类型是因为vb会自动进行所需的类型转换,而C++开发人员习
惯于在不同类型之间转换指针类型,虽然提高了性能但是破坏了类型的安全性.
获得的好处是:
1) 语言的互操作性 通过CTS解决了语言类型互相调用问题,互相操作的时候一定要符合CLS,但是私有代码可以写自己语言相关的代码,因此其他语言的编译器可以不足够强大
到支持CLS的所有功能.
2) 垃圾收集 Windows平台目前采用两种方式来释放进程向系统动态请求的内存:
完全以手工方式使应用程序代码完成这些工作.
让对象维护引用计数.
3) 安全性 .net提供了基于代码的安全特性,而windows提供了基于角色的安全性.
4) 应用程序域 应用程序域是.net 中一个重要的技术改进,它用于减少应用程序的系统开销,这些应用程序需要与其他程序分离开来,但同时还需要彼此通信.
.net没有开发出来以前,可以让这些实例共享同一个进程,但此时一个运行的实例就有可能导致整个网站的崩溃;也可以把这些实例孤立在不同的进程中,但这些做会增加相
关系统的性能开销.
到现在为止,孤立代码的唯一方式是通过进程来实现的.在运行一个新的应用程序时,他会在一个进程环境内运行.windows通过地址空间把进程分隔开来.这样,每个进程有4GB
的虚拟内存来存储其数据和可执行代码,64位系统有更多的内存.windows利用额外的间接方式把这些虚拟内存映射到物理内存或磁盘空间的特殊区域中,每个进程都会有不同的映射,
虚拟地址空间块映射的物理内存之间不能有重叠,这种情况下,任何进程都只能通过指定虚拟内存中的一个地址来访问内存,即进程不能直接访问物理内存,因此一个进程不可能访问
分配给另一个进程的内存.这样就可以确保任何执行出错的代码不会损害其他地址空间以外的数据(注意在windows95/98上,这些保护措施不像在windows nt/2000/xp/2003上那样强
大,所以理论上存在应用程序因写入不对应的内存而导致windows崩溃的可能性).
进程不仅是运行代码的实例相互隔离的一种方式,在windows NT/2000/xp/2003系统上,它们还可以构成分配了安全权限和许可的单元.每个进程都有自己的安全标识,明确地
表示Windows允许该进程可以执行的操作.
进程对确保安全有很大的帮助,而它们的一大缺点是性能.许多进程常常在一起工作,而此需要相互通信.一个常见的例子是进程调用一个COM组件,而该组件是可执行得,因此
需要在它自己的进程上运行.在COM中使用代理时也会发生类似的情况.因为进程不能共享任何内存,所以必须使用一个复杂的编组过程在进程之间复制数据.这对性能有非常大的影响
.如果需要使组件一起工作,但不希望性能损失,惟一的方法是使用基于DLL的组件,让所有的组件在同一个地址空间中运行-----其风险事执行出错的组件会影响其他组
件.
应用程序域是分离组件的一种方式,它不会导致因在进程之间传送数据而产生的性能问题.其方法是把任何一个进程分解到多个应用程序域中,每个应用程序域大致对应一个
应用程序,执行的每个线程都运行在一个具体的应用程序域中.
如果不同的可执行文件都运行在同一个进程空间中,显然它们就能轻松的共享数据,因为理论上它们可以直接访问彼此的数据.虽然在理论上这是可以实现的,但是CLR会检查
每个正在运行的应用程序的代码,以确保这些代码不偏离它自己的数据区域,保证不发生直接访问其他进程的数据的情况.这初看起来时不可能的,如何告诉程序要做什么工作,而又不
真正运行它?
实际上,这么做通常是可能的,因为中间语言拥有强大的类型安全功能.在大多数情况下,除非代码明确使用不安全的特性,例如指针,否则它使用的数据类型可以确保内存不会被
错误地访问.例如,.NET数组类型执行边界检查,以禁止执行超出边界的数组操作.如果运行的应用程序的确需要与运行在不同应用程序域中的其他应用程序通信或共享数据,就必须调
用.NET的远程服务.
被验证不能访问超出其应用程序域的数据(而不是通过明确的远程机制)的代码就是内存类型安全的代码,这种代码与运行在同一个进程中但应用程序域不同的类型安全代码一起
运行是安全的.
三 程序集
库与可执行文件的唯一区别是:可执行文件一个方法的入口.程序集的一个重要特性是它们包含的元数据描述了对应代码中定义的类型和方法.程序集也包含描述程序集本身的元
数据,这种程序集元数据包含在一个称为程序集清单的区域中,可以检查程序集的版本及其完整性.程序集包含程序的元数据,表示调用给定程序集中的代码的应用程序或其他程序集
不需要制定注册表或其他数据源,以便确定如何使用该程序集.这与以前得COM有很大的不同,组件的GUID和接口必须从注册表中读取,在某些情况下,方法和属性的详细信息也需要从
类型库中读取.把数据分散在三个以上的不同位置上,可能会出现信息不同步的情况,从而妨碍其他软件成功地使用该组件.现在元数据和程序的可执行指令存储在一起.注意,即使程
序集存储在几个文件中,数据也不会出现不同步的问题,这是因为包含程序集入后的文件也存储了其他文件的细节,散列和内容,如果一个文件被替换,或者被塞满,系统肯定会检测出
来,并拒绝加载程序集.程序集分为共享程序集和私有程序集.
私有程序集:自己的应用程序的主文件夹内.
共享程序集:是其他应用程序可以使用的公共库.因为其他软件可以访问共享程序集.所以需要采取一定的保护措施来防止以下风险:
1)名称冲突,另一个公司的共享程序集执行的类型与自己的共享程序集中的类型同名,因为客户机代码理论上可以同时访问这些程序集,所以这是一个严重的问题.
2)程序集被通一个程序集的不同版本覆盖----新版本与某些已有的客户机代码不兼容.
这些 问题的解决办法是把共享程序集放在文件系统的一个特定的子目录中,称为全局程序集高速缓存(GAC).与私有程序集不同,不能简单地把共享程序集复制到对应的文件夹中,
而需要专门安装到高速缓存中,这个过程可以用许多.NET工具来完成,其中包含对程序集的检查,在程序集高速缓存中设置一个小的文件夹层次结构,以确保程序集的完整性.
为了避免名称冲突,共享程序集应根据私有密钥加密法制定一个名称(私有程序集只需要指定与其主文件名相同的名称即可).该名称称为强名,并保证其惟一性,它必须由要引用共
享程序集的应用程序来引用.
与覆盖程序集相关的问题,可以通过在程序集清单中指定版本信息来解决,也可以通过同时安装来解决.
四 反射
因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据.
五 数据类型
要把数据指定为float,可以在后加上字符F或f,否则会认为是double.要把数据指定为decimal,可以在数字的后面加上字符M或m.
char 不可以同8位的byte类型之间进行隐式转换,尽管8位猪狗编码英语中的每个字符和数字0-9了,但他们不够编码更大的符号系统中的每个字符,例如中文.为了面向全世界,计
算机行业正在从8位字符集转向16位的Unicode模式,ASCII编码是Unicode的一个子集.除了把char表示为字符字面量之外,还可以用4位16进制的Unicode值(例如'/U0041'),带有数据
类型转换的整数值(例如(char)65),或16进制数('/x0041')表示他们.他们和可以用转义序列表示.
string是引用类型而不值类型,但与一般的值类型不同,修改一个值会创建一个 新的类型.
C#基础语法
多个main方法:编译 csc MainExample.cs /main:namespacename ,给main方法传递参数就要在for 处理string[] Args数组的参数,模块是没有清单的组件.