C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C#由C语言和C++派生而来,继承了其强大的性能,同时又以.NET 框架类库作为基础,拥有类似Visual Basic的快速开发能力。
ECMA标准列出的C#设计目标:
C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言
此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集(Garbage Collection,指一种自动内存释放技术)。软件必须做到强大、持久,并具有较强的编程生产力。
此种语言为在分布式环境中的开发提供适用的组件开发应用。
为使程序员容易迁移到这种语言,源代码的可移植性十分重要,尤其是对于那些已熟悉C和C++的程序员而言。
对国际化的支持非常重要。
C#适合为独立和嵌入式的系统编写程序,从使用复杂操作系统的大型系统到特定应用的小型系统均适用。
虽然C#程序在存储和操作能力需求方面具备经济性,但此种语言并不能在性能和尺寸方面与C语言或汇编语言相抗衡。
语言特性相对于C和C++,这个语言在许多方面进行了限制和增强:
指针(Pointer)只能被用于不安全模式。大多数对象访问通过安全的引用实现,以避免无效的调用,并且有许多算法用于验证溢出,指针只能用于调用值类型,以及受垃圾收集控制的托管对象。
对象不能被显式释放,代替为当不存在被引用时通过垃圾回收器回收。
只允许单一继承(single inheritance),但是一个类可以实现多个接口(interfaces)。
C#比C++更加类型安全。默认的安全转换是隐含转换,例如由短整型转换为长整型和从派生类转换为基类。而接口布尔型同整型,及枚举型同整型不允许隐含转换,非空指针(通过引用相似对象)同用户定义类型的隐含转换必段被显式的确定,不同于C++的复制构造函数。
数组声明语法不同("int[] a = new int[5]" 而不是 "int a[5]")。
枚举位于其所在的命名空间中。
C#中没有模版(Template),但是在C# 2.0中引入了泛型(Generic programming),并且支持一些C++模版不支持的特性。比如泛型参数中的类型约束。另一方面,表达式不能像C++模版中被用于类型参数。
属性支持,使用类似访问成员的方式调用。
完整的反射支持。
C# 2.0 的特性
针对于.NET SDK 2.0(相对应于ECMA-334 标准第三版),C# 的新特性有:
分部类
分部类将类型的实现分在多个文件中。
file1.cs:
file2.cs:
分部类这个特性允许将一个类的编写工作分配给多个人,一人写一个文件,便于版本控制。它又可以隔离自动生成的代码和人工书写的代码,例如设计窗体应用程序时。
泛型
泛型,或参数化类型,是被C#支持的.NET 2.0特性。不同于C++模版,.NET 参数化类型是在运行时被实例化,而不是编译时,因此它可以跨语言,而C++模版却不行。它支持的一些特性并不被C++模版直接支持,比如约束泛型参数实现一个接口。另一方面,C# 不支持无类型的泛型参数。不像Java中的泛型,在CLI虚拟机中,.NET generics 使用 具化 生成泛型参数,它允许优化和保存类型信息。[1]
静态类
静态类它不能被实例化,并且只能有静态成员。这同很多过程语言中的模块概念相类似。
迭代器
一种新形式的迭代器 它提供了函数式编程中的generator,使用yield return
类似于Python中使用的yield
匿名方法
委托的协变和逆变
属性访问器可以被单独设置访问级别
例子:
可空类型
可空类型 (跟个问号, 如 int? i = null;
) 允许设置 null
给任何类类型。
??操作符
(??
) 用于如果类不为空值时返回它自身,如果为空值则返回之后的操作
主要用作将一个可空类型赋值给不可空类型的简便语法
C# 3.0 的特性
C# 作为当前版,发布于2007年10月17日,是.NET Framework 3.5 的一部分, 它的新特性灵感来自于函数式编程语言,如:Haskell 和 ML,并广泛地引入了Language Integrated Query (LINQ) 模式到通用语言运行库中e.[4]
Linq
语言集成查询(英语:Language Integrated Query,缩写:LINQ):[5] "from
, where
, select
" context-sensitive keywords allowing queries across SQL, XML, collections, and more. These are treated as keywords in the LINQ context, but their addition won't break existing variables named from
, where
, or select
.
类型初始化器
可写作:
集合初始化器
可写作
假设 MyList
实现了 System.Collections.IEnumerable
且有一个Add
方法method[6]
匿名类型
局部变量类型推断
局部变量 类型推断:
等同于
它只是一个语法糖, 这个特性被匿名类型声明时所需要
Lambda表达式
- 可写作
编译器翻译Lambda表达式为强类型委托或强类型表达式树.
自动化属性
编译器将自动生成私有变量和适当的getter(get访问器)和setter(set访问器),如:
扩展方法
扩展方法指,一个静态类包含this关键字作为方法的第一参数时,这个方法将被添加到该this的类型中:
分部方法
Allow codegenerators to generate method declarations as extension points that are only included in the source code compilation if someone actually implements it in another portion of a partial class.[7]
- 分部方法 (Partial methods) 必须定义在分部类 (partial classes) 中
- 定义分部方法 需要用 partial 做修饰符
- 分部方法不一定总是有执行内容的,也就是说定义的方法 可以一句操作语句都没有
- 分部方法返回值必须是void
- 分部方法可以是静态 (static) 方法
- 分部方法可以包含参数,参数可以包含以下修饰词:this,ref,params
- 分部方法必须是私有 (private) 方法
例子:
C# 4.0的特性
动态查阅
C# 4.0 新增 dynamic关键字,提供动态编程(dynamic programming),把既有的静态对象标记为动态对象,类似javascript, Python 或 Ruby。
具名参数与可选参数
调用 OpenFile 时, 顺序可以完全颠倒:
与 COM 对象交互
在 C#中打开一个Word文件:
在C#中指定Excel的某一格文字:
泛型的协变和逆变
C# 4.0 支持协变和逆变,例如在泛型接口可以加上in、out关键字。
程序的执行
C#并不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似,它被编译成为中间代码(Microsoft Intermediate Language),然后通过.NET Framework的虚拟机——被称之为通用语言运行庫(Common Language Runtime)——执行。
所有的.Net编程语言都被编译成这种被称为MSIL(Microsoft Intermediate Language )的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。但是实际上,如果计算机上没有安装.Net Framework,那么这些程序将不能够被执行。
在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。
标准化
微软公司已经向ECMA申请将C#作为一种标准。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准(ISO/IEC 23270)。现在有一些独立的实现正在进行,包括:
- 自由软件基金会的dotGNU Portable.NET
- Mono
- Baltie - C# IDE for children and young Baltie
C#的Hello World程序
下面是一个在命令行上输出Hello World的小程序,这种程序通常作为开始学习程序语言的第一个步骤:
转载于:https://blog.51cto.com/flydragon0815/660049