当前位置:首页>C#教程>C#教程

C#教程

作者:微学网发布时间:2019-08-11 14:35:41

什么是C#?

C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。

C#以.NET框架类库作为基础,拥有类似Visual Basic的快速开发能力。

C#由安德斯·海尔斯伯格主持开发,微软在2000年发布了这种语言,希望借助这种语言来取代Java

C#已经成为Ecma国际和国际标准组织的标准规范。

C#命名

C#的发音为“C sharp”,“#”读作“sharp”(/ʃɑːp/),命名启发于音乐上的音名“C♯”,在音乐中“C♯”表示C升半音,为比C高一点的音节,且“#”形似4个加号,微软借助这样的命名,表示C#在一些语言特性方面对C++的提升的意思。

由于显示器(标准字体、浏览器等)的技术限制,且大部分的键盘布局上不存在升记号(♯),所以井号(#)被用于此编程语言的名称中,约定在ECMA-334 C#语言规范中。

C#设计目标

ECMA标准列出的C#设计目标:

  • C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言

  • 此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集(Garbage Collection,指一种存储器自动释放技术)。软件必须做到强大、持久,并具有较强的编程生产力。

  • 此种语言为在分布式环境中的开发提供适用的组件开发应用。

  • 为使程序员容易迁移到这种语言,源代码的可移植性十分重要,尤其是对于那些已熟悉C和C++的程序员而言。

  • 对国际化的支持非常重要。

  • C#适合为独立和嵌入式的系统编写程序,从使用复杂操作系统的大型系统到特定应用的小型系统均适用。

  • 虽然C#程序在存储和操作能力需求方面具备经济性,但此种语言在某些情况下并不能在性能和程序大小方面与C语言相抗衡。

C#历史和版本

原Borland公司的首席研发设计师安德斯·海尔斯伯格(Anders Hejlsberg)在微软开发了Visual J++ 1.0,很快的Visual J++由1.1版本升级到6.0版。

SUN公司认为Visual J++ 违反了Java开发平台的中立性,对微软提出了诉讼。

2000年6月26日微软在奥兰多举行的“职业开发人员技术大会”(PDC 2000)上,发表新的语言C#。

C#语言取代了Visual J++,语言本身深受Visual Basic、Java、C和C++ 的影响。

版本 日期 .Net框架版本 Visual Studio的版本
C# 1.0 2002年1月 .NET Framework 1.0 Visual Studio .NET 2002
C# 1.1 - C# 1.2 2003年4月 .NET Framework 1.1 Visual Studio .NET 2003
C# 2.0 2005年11月 .NET Framework 2.0 Visual Studio 2005
C# 3.0 2007年11月 .NET Framework 2.0 (Except LINQ)、.NET Framework 3.0 (Except LINQ)、.NET Framework 3.5 Visual Studio 2008、Visual Studio 2010
C# 4.0 2010年4月 .NET Framework 4 Visual Studio 2010
C# 5.0 2012年8月 .NET Framework 4.5 Visual Studio 2012、Visual Studio 2013
C# 6.0 2015年7月 .NET Framework 4.6 Visual Studio 2015
C# 7.0 2017年3月 .NET Framework 4.6.2 Visual Studio 2017
C# 7.1 2017年8月 .NET Framework 4.7 Visual Studio 2017 version 15.3
C# 7.2 2017年11月 .NET Framework 4.7.1 Visual Studio 2017 version 15.5
C# 7.3 2018年5月 .NET Framework 4.7.2 Visual Studio 2017 version 15.7

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#并不被编译成为能够直接在计算机上执行的二进制本地代码。与Java类似,它被编译成为中间代码(Microsoft Intermediate Language),然后通过.NET Framework的虚拟机——被称为通用语言运行库——执行。

所有的.Net编程语言都被编译成这种被称为通用中间语言的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。如果计算机上没有安装.Net Framework,那么这些程序会弹出对话框,要求用户下载.net framework。

在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区(Buffer)中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。

C#版本的特性

C# 2.0的特性

针对于.NET SDK 2.0(相对应于ECMA-334标准第三版),C# 的新特性有:

分部类别

分部类别将类别的实现分在多个文件中。该概念于C# 中首次出现,除了能将一个类别的成员分开存放,还使ASP.NET中的代码后置得以实现。代码后置实现了HTML代码和后台交互代码的分离。

泛型

泛型,或参数化类型,是被C#支持的.NET 2.0特性。不同于C++模版,.NET参数化类型是在运行时被实例化,而不是编译时,因此它可以跨语言,而C++模版却不行。它支持的一些特性并不被C++模版直接支持,比如约束泛型参数实现一个接口。另一方面,C# 不支持无类型的泛型参数。不像Java中的泛型,在CLI虚拟机中,.NET generics使用具化生成泛型参数,它允许优化和保存类型信息。

静态类别

静态类别它不能被实例化,并且只能有静态成员。这同很多过程语言中的模块概念相类似。

迭代器

一种新形式的迭代器它提供了函数式编程中的generator,使用yield return

匿名方法

匿名方法类似于函数式编程中的闭包

委托的协变和逆变

委托签名的协变和逆变

属性访问器可以被单独设置访问级别

可空类型

可空类型(跟个问号,如int? i = null;)允许设置null给任何类类型。

??运算符

(??)用于如果类别不为空值时回传它自身,如果为空值则返回之后的操作

C# 3.0的特性

C# 3.0发布于2007年10月17日,是.NET Framework 3.5的一部分,它的新特性灵感来自于函数式编程语言,如:Haskell和ML,并广泛地引入了Language Integrated Query(LINQ)模式到通用语言运行库中。

Linq

语言集成查询(英语:Language Integrated Query,缩写:LINQ): 上下文相关关键字”from, where, select”可用于查询SQL、XML、集合等。这些标识符在LINQ上下文中被作为关键字,但是它们的增加不会破坏原有的名为from、where或select的变量。

类型初始化器

集合初始化器

匿名类型

局部变量类型推断

Lambda表达式

自动化属性

扩展方法

扩展方法指,一个静态类包含this关键字作为方法的第一参数时,这个方法将被添加到该this的类型中。

分部方法

允许代码生成器生成方法声明作为扩展点,如果有人在另一个部分类实现了它才会被包含于原代码编译。

C# 4.0的特性

动态查阅

C# 4.0新增dynamic关键字,提供动态编程(dynamic programming),把既有的静态对象标记为动态对象,类似javascript, Python或Ruby。

dynamic关键字标记的字段被处理成一个特殊包装的object对象,它取消了CLI的编译时类型检查

具名参数与可选参数

与COM组件交互

泛型的协变和逆变

C# 4.0支持协变和逆变,例如在泛型接口可以加上in、out关键字。

C# 5.0的特性

C# Evolution Matrix

Async Feature

补充: async和await是一对语法糖,允许开发人员非常轻松的调用基于TASK的异步编程。

async-await关键字并不会真的创建一个线程池任务,完成这个动作依赖于被调用方法中的函数。

这一点在许多C#的中文教程中被忽略,导致许多学习的新手误以为await关键字会直接创建一个新的线程池任务。

Caller Information

C# 6.0的特性

只读 Auto 属性

Auto 属性初始设置式

具有表达式主体的函数成员

使用静态

Null - 条件运算符

字符串插值

例外状况筛选条件

nameof 表达式

Catch 和 Finally 区块中的 Await

索引初始设置式

集合初始设置式的扩展方法

改进的重载解析

C# 7.0的特性

加入 out 变量;能够直接宣告一个变量在它要传入的地方,当成一个 out 的引数

C# 7.1的特性

async Main方法

default常值表达式

推断的 tuple 项目名称

C# 7.2的特性

具备实值类型的参考语义

无后置具名引数

数值常值中的前置下划线

private protected 访问修饰符

相关网站

C# Programming Guide - 介绍了有关关键的 C# 语言特征以及如何通过 .NET 框架访问 C# 的详细信息。

Visual Studio - 下载作为 C# 集成开发环境的 Visual Studio 的最新版本。

Go Mono - Mono 是一个允许开发人员简单地创建跨平台应用程序的软件平台。

C Sharp (programming language) - 维基百科解释 C#(编程语言)。