MSDN  C# 编程指南
202101月5日    北京
MSDN C#编程指南
1.C# 语言和 .NET Framework 介绍
C# 语言
C# 语法表现力强,而且简单易学。C# 的大括号语法使任何熟悉 C、C++ 或 Java 的人都可以立即上手。了解上述任何一种语言的开发人员通常在很短的时间内就可以开始使用 C# 高效地进行工作。C# 语法简化了 C++ 的诸多复杂性,并提供了很多强大的功能,例如可为 null 的值类型、枚举、委托、lambda 表达式和直接内存访问,这些都是 Java 所不具备的。C# 支持泛型方法和类型,从而提供了更出的类型平安和性能。C# 还提供了迭代器,允许集合类的实施者定义自定义的迭代行为,以便容易被客户端代码使用。在 C# 3.0 中,语言集成查询 (LINQ) 表达式使强类型查询成为了一流的语言构造。
作为一种面向对象的语言,C# 支持封装、继承和多态性的概念。所有的变量和方法,包括 Main 方法〔应用程序的入口点〕,都封装在类定义中。类可能直接从一个父类继承,但它可以实现任意数量的接口。重写父类中的虚方法的各种方法要求 override 关键字作为一种防止意外重定义的方式。在 C# 中,结构类似于一个轻量类;它是一种堆栈分配的类型,可以实现接口,但不支持继承。
除了这些根本的面向对象的原理之外,C# 还通过几种创新的语言构造简化了软件组件的开发,这些结构包括:
封装的方法签名〔称为“委托〞〕,它实现了类型平安的事件通知。
属性 (Property),充当私有成员变量的访问器。
属性 (Attribute),提供关于运行时类型的声明性元数据。
内联 XML 文档注释。
语言集成查询 (LINQ),提供了跨各种数据源的内置查询功能。
在 C# 中,如果必须与其他 Windows 软件〔如 COM 对象或本机 Win32 DLL〕交互,那么可以通过一个称为“互操作〞的过程来实现。互操作使 C# 程序能够完本钱机 C++ 应用程序可以完成的几乎任何任务。在直接内存访问必不可少的情况下,C# 甚至支持指针和“不平安〞代码的概念。
C# 的生成过程比 C 和 C++ 简单,比 Java 更为灵活。没有单独的头文件,也不要求按照特定顺序声明方法和类型。C# 源文件可以定义任意数量的类、结构、接口和事件。
NET Framework 平台体系结构
C# 程序在 .NET Framework 上运行,它是 Windows 的一个不可或缺的组件,包括一个称为公共语言运行库 (CLR) 的虚拟执行系统和一组统一的类库。CLR 是 Microsoft 的公共语言根底结构 (CLI) 的商业实现。CLI 是一种国际标准,是用于创立语言和库在其中无缝协同工作的执行和开发环境的根底。
用 C# 编写的源代码被编译为一种符合 CLI 标准的中间语言 (IL)。IL 代码与资源〔例如位图和字符串〕一起作为一种称为程序集的可执行文件存储在磁盘上,通常具有的扩展名为 .
exe 或 .dll。程序集包含清单,它提供有关程序集的类型、版本、区域性和平安要求等信息。
执行 C# 程序时,程序集将加载到 CLR 中,这可能会根据清单中的信息执行不同的操作。然后,如果符合平安要求,CLR 就会执行实时 (JIT) 编译以将 IL 代码转换为本机机器指令。CLR 还提供与自动垃圾回收、异常处理和资源管理有关的其他效劳。由 CLR 执行的代码有时称为“托管代码〞,它与编译为面向特定系统的本机机器语言的“非托管代码〞相对应。以下列图阐释了 C# 源代码文件、.NET Framework 类库、程序集和 CLR 的编译时与运行时的关系。
语言互操作性是 .NET Framework 的一项主要功能。因为由 C# 编译器生成的 IL 代码符合公共类型标准 (CTS),因此从 C# 生成的 IL 代码可以与从 Visual Basic、Visual C++、Visual J# 的 .NET 版本或者其他 20 多种符合 CTS 的语言中的任何一种生成的代码进行交互。单一程序集可能包含用不同 .NET 语言编写的多个模块,并且类型可以相互引用,就像它们是用同一种语言编写的。
除了运行时效劳之外,.NET Framework 还包含一个由 4000 多个类组成的内容详尽的库,这些类被组织为命名空间,为从文件输入和输出、字符串操作、XML 分析到 Windows 窗体控件的所有内容提供了各种有用的功能。典型的 C# 应用程序使用 .NET Framework 类库广泛地处理常见的“日常〞任务。
2.C# C++ 比较
功能
参考主题
继承:在 C++ 中,类和结构实际上是相同的,而在 C# 中,它们很不一样。C# 类可以实现任意数量的接口,但只能从一个基类继承。而且,C# 结构不支持继承,也不支持显式默认构造函数〔默认情况下提供一个〕。
接口
struct
数组:在 C++ 中,数组只是一个指针。在 C# 中,数组是包含方法和属性的对象。例如,可通过 Length 属性查询数组的大小。C# 数组还使用索引器〔验证用于访问数组的各个索引〕。声明 C# 数组的语法不同于声明 C++ 数组的语法:在 C# 中,“[]〞标记出现在数组类型之后,而非变量之后。
数组
索引器
布尔值:在 C++ 中,bool 类型实质上是一个整数。在 C# 中,不存在 bool 类型与其他类型之间的相互转换。
bool
long 类型:long 类型在 C# 中为 64 位,而在 C++ 中为 32 位。
long
传递参数:在 C++ 中,除非显式通过指针或引用传递,否那么所有变量都通过值传递。在 C# 中,除非显式通过具有 refout 参数修饰符的引用传递,否那么类通过引用传递,而结构通过值传递。
结构
ref out
switch 语句:与 C++ 中的 switch 语句不同,C# 不支持从一个 case 标签贯穿到另一个 case 标签。
switch
委托:C# 委托大致类似于 C++ 中的函数指针,是类型平安和可靠的。
delegate
基类方法:C# 支持用于调用派生类中重写基类成员的 base 关键字。而且,在 C# 中,使用 override 关键字重写虚拟或抽象方法是显式的。
base
请参见 override 的例如
方法隐藏:C++ 通过继承支持方法的隐式“隐藏〞。在 C# 中,必须使用 new 修饰符来显式隐藏继承的成员。
new
预处理器指令用于条件编译。C# 中不使用头文件。
C# 预处理器指令
异常处理:无论是否引发异常,C# 都提供 finally 关键字以提供应执行的代码。
try-finally
try-catch-finally
C# 运算符:C# 支持其他运算符,如 istypeof。它还引入了某些逻辑运算符的不同功能。
& 运算符 | 运算符
^ 运算符 is
typeof
typedef 关键字。在 C++ 中,typedef 用于为已声明的类型创立更短或更方便的名称。在 C# 中,using 指令提供此功能。
using 指令〔C# 参考〕
extern 关键字:在 C++ 中,extern 用于导入类型。在 C# 中,extern 用于为使用同一程序集的不同版本创立别名。
extern
static 关键字:在 C++ 中,static 既可用于声明类级实体,也可用于声明特定于某模块的类型。在 C# 中,static 仅用于声明类级实体。
static
C# 中的 Main 方法和 C++ 中的 main 函数的声明方式不同。在 C# 中,它是大写的,并且始终是 static 的。此外,在 C# 中,对处理命令行参数的支持要可靠得多。
Main() 和命令行参数
在 C# 中,只有在 unsafe 模式下才允许使用指针。
unsafe
在 C# 中以不同的方式执行重载运算符。
C# 运算符
字符串:在 C++ 中,字符串只是字符的数组。在 C# 中,字符串是支持可靠搜索方法的对象。
字符串
String
foreach 关键字使您可以循环访问数组和集合。
foreach, in
全局:在 C# 中,不支持全局方法和全局变量。方法和变量必须包含在 classstructwriteline方法的作用 之内。
C# 程序的常规结构
#define 预处理指令:在 C++ 中,#define 指令通常用于声明常量值。在 C# 中,#define 指令不可用于此目的。在 C# 中,最好将常量定义为枚举类型〔仅限整数值〕或者定义为类或结构的静态成员。如果具有多个像这样的常量,可以考虑创立一个单独的“Constants〞类来保存这些常量。
static〔C# 参考〕
const〔C# 参考〕
enum〔C# 参考〕
导入类型:在 C++ 中,多个模块公用的类型放置在头文件中。在 C# 中,可通过元数据获取此信息。
using
元数据概述
C# 中的局部变量在初始化前不能使用。
方法
内存管理:C++ 语言不提供垃圾回收功能;在进程终止前,未显式释放的内存仍保持已分配的状态。C# 语言提供垃圾回收功能。
垃圾回收
析构函数:C# 具有用于确定地释放非托管资源的不同语法。
析构函数
using 语句〔C# 参考〕
构造函数:与 C++ 类似,如果在 C# 中不提供类构造函数,那么为您自动生成一个默认构造函数。该默认构造函数将所有字段初始化为它们的默认值。
实例构造函数
默认值表
C# 不支持位域。
C++ 位字段
C# 的输入/输出效劳和格式设置依赖于 .NET Framework 的运行时库。
C# 语言教程
格式化数值结果表
在 C# 中,方法参数不能有默认值。如果要获得同样的效果,请使用方法重载。
编译器错误 CS0241
在 C# 中,为类型参数化提供泛型类型和泛型方法的方式与 C++ 模板类似,尽管存在显著的差异。
C# 中的泛型
as 关键字与标准强制转换类似,不同之处在于:如果转换失败,那么返回值为 null,而不是引发异常。这与使用 C++ 中的 static_cast〔与 dynamic_cast 不同,它不执行运行时检查,因此失败时不引发异常〕相似。
as〔C# 参考〕

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。