C# 精华总结 ---- 基础

本文对比了C#与C++在程序效率、编译目标、内存管理、指针、运算符重载、库、目标环境、预处理指令、枚举、析构函数、类与结构、委托、事件、接口、属性、线程和反射等方面的差异。C#通过.NET基类库提供更高级的功能,如委托、事件、泛型和动态对象,简化了内存管理和类型安全。同时,C#的装箱拆箱、值和引用的区别也进行了讲解。
摘要由CSDN通过智能技术生成


在这里插入图片描述

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++ 函数指针的区别?

  1. 一个 delegate对象一次可以搭载多个方法(methods), 而不是一次一个。当我们唤起一个搭载了多个方法(methods)的delegate,所有方法以其“被搭载到delegate对象的顺序”被依次唤起。
  2. 一个delegate对象所搭载的方法(methods)并不需要属于同一个类别。一个delegate对象所搭载的所有方法(methods)必须具有相同的原型和形式。然而,这些方法(methods)可以即有static也有non-static,可以由一个或多个不同类别的成员组成。
  3. 一个 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 <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值