文章目录

1. C# 和 C++ 区别
1.1 程序效率
C# 它通过底层的虚拟机机制减少了 C/C++ 语言中常常容易发生的内存泄漏和安全性问题,它代价是运行速度相对减慢
1.2 编译目标
C# 则编译成中间语言, 它与 Java 在字节代码上有些相似。而 C++ 经常把代码编译成汇编语言。之后 IL 在通过 Iust-In-Time 编译进程转换成本机的可执行代码
1.3 内存管理
C# 将开发人员从记账式的内存管理任务中解放出来,不再需要显式地删除动态分配的给堆的内存,而 C++ 则要这么做,无用存储单元收集器将周期性地清空不再使用的内存
1.4 指针
C# 中指针的运用可能与 C++ 一样,但它只用于已特别标记为应用指针的代码块中。对于大部分的程序,C# 依赖 VB/Java 风格的对类实例的引用,而不需和 C++ 一样频繁地使用指针
1.5 运算符的重载
在 C++ 比 C# 中用来显式重载的运算符比要多,主要是 C# 编译器是运用一些定制的基本操作符重载(如=)来自动计算出组合操作符的重载(如+=)
1.6 库
C++ 依赖于标准库,C# 依赖于.NET 基类。而 .NET 基类是以单一的继承为基础,而标准库是以继承和模板为基础
1.7 目标环境
C# 是基于 GUI 的环境下(不仅仅是 Windows 环境,尽管现在只是在 Windows 中可用)专门为编程和背景服务(如 Web 服务)而设计的。这与语言本身无关,而是反映在基类库的设计中
1.8 预处理指令
C# 包含一些预处理指令,它的语法和 C++ 一样。但 C# 的预处理指令少得多,因为 C# 的其它语言特性使得这些指令不再重要
1. 9 枚举
C# 的枚举比 C++ 中枚举的功能更为广泛。它们在权限范围内的语法结构很成熟,可支持不同的属性与方法。枚举仍是作为基本的数字类型来执行的,所以不会存在性能上的损失。
1.10 析构函数
当析构函数被调用后,C# 不能保证它的执行, 除非要除空的是具体的外部源代码,如文件与数据库连接,C# 不可以在析构函数中放置代码,而 C++ 则可以。
1.11 类与结构
C# 正式区分了类(一般用于包含许多方法的大型对象)和结构(一般用于只包含变量集合的小型对象)类和结构的存储方式不同,结构不支持继承。
1.12 委托
C# 不支持函数指针。但委托可以实现对应的功能,它把引用以一种特殊的形式封装到方法中。委托可以在方法之间传递,用于调用包含引用的方法。这与 C++ 指针的工作方式相同
1.13 事件
事件与委托相似,但它支持回调模式。就是当执行一些操作时,客户通知机器,将这些操作通知给它。工作方式与 VB 相同。 特性:这一概念在 VB 和COM 中应用的很广,C# 中也导入了这一概念
1. 14 接口
可以将接口看为是一个抽象的类,其目的是用来定义类同意执行的方法和属性。C# 接口与 COM 接口不同 ; C# 接口是简单的方法列表,而 COM 接口有其它的相关的特性,如GUIDS,但他们的原理基本相同。
1. 15 属性
C# 可以用特性元信息(如属性)来修饰类、方法和参数等。可以在运行时内访问属性,已决定代码的执行。
1. 16 确定线程
C#的lock语句可支持线程同步(C++不支持线程,必须在代码中通过调用API或其它的类库来实现)
1. 17 反射
C#中,代码可自动获得已编译的装配件(库和可执行文件)中的类定义的信息。可以编写显示类和方法信息的程序
1. 18 开发项目来说
C#适合企业各应用程序,C++适合底层开发(游戏等)
另外关于 C# 的语法以及数据结构 会在下一篇文章进行总结,接下来看看 C# 这门语言的一些特性(必须要掌握)
2. C# 特性
2.1 delegate
概念: C# 中的委托类似于 C/C++中的函数指针, 使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与 C/C++中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。
案例
using System;
class Program{
static void OtherClassMethod(){
Console.WriteLine("Delegate an other class's method");
}
static void Main(string[] args){
var test = new TestDelegate();
//deleagteMethod 搭载了三个函数
test.delegateMethod = new TestDelegate.DelegateMethod(test.NonStaticMethod);
test.delegateMethod += new TestDelegate.DelegateMethod(TestDelegate.StaticMethod);
test.delegateMethod += Program.OtherClassMethod;
test.RunDelegateMethods();
Console.ReadKey();
}
}
class TestDelegate{
public delegate void DelegateMethod(); //声明了一个Delegate Type
public DelegateMethod delegateMethod; //声明了一个Delegate对象
public static void StaticMethod(){
Console.WriteLine("Delegate a static method");
}
public void NonStaticMethod(){
Console.WriteLine("Delegate a non-static method");
}
public void RunDelegateMethods(){
if (delegateMethod != null){
Console.WriteLine("---------");
//运行被搭载在 delegateMethon 上的函数
delegateMethod.Invoke();
Console.WriteLine("---------");
}
}
}
输出如下
---------
Delegate a non-static method
Delegate a static method
Delegate an other class's method
---------
delegate 和 C++ 函数指针的区别?
- 一个 delegate对象一次可以搭载多个方法(methods), 而不是一次一个。当我们唤起一个搭载了多个方法(methods)的delegate,所有方法以其“被搭载到delegate对象的顺序”被依次唤起。
- 一个delegate对象所搭载的方法(methods)并不需要属于同一个类别。一个delegate对象所搭载的所有方法(methods)必须具有相同的原型和形式。然而,这些方法(methods)可以即有static也有non-static,可以由一个或多个不同类别的成员组成。
- 一个 delegate type的声明在本质上是创建了一个新的subtype instance,该 subtype 派生自 .NET library framework 的 abstract base classes Delegate 或 MulticastDelegate,它们提供一组public methods用以询访delegate对象或其搭载的方法(methods) ,与函数指针不同,委托是面向对象、类型安全并且安全的。
delegate 使用场景
首先来看一个案例
class Car{
public delegate void Notify(int value);
public event Notify notifier;
private int petrol = 0;
public int Petrol{
//没有在这里直接调用 Alerter.Notify 是为了降低耦合性
get <