C#与C对比学习指南:从语法差异到实战应用

1次阅读
没有评论

共计 1870 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

开篇:关键差异速查表

特性 C 语言 C# 语言
内存管理 手动 malloc/free 自动垃圾回收 (GC)
指针 / 引用 显式指针操作 引用类型 + 可选 unsafe 指针
代码组织 头文件 (.h)+ 源文件 (.c) 命名空间 + 类
编程范式 面向过程 面向对象
编译方式 直接编译为机器码 编译为 IL+JIT 编译
异常处理 返回错误码 try-catch-finally

一、数据结构实现对比(以链表为例)

C 语言版本

// 节点结构体定义
typedef struct Node {
    int data;
    struct Node* next;  // 必须显式使用指针
} Node;

// 创建新节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;  // 需手动管理内存
}

C# 版本

// 节点类定义
public class Node {public int Data { get; set;}  // 属性替代公共字段
    public Node Next {get; set;}  // 自动内存管理

    public Node(int data) {this.Data = data;  // 构造函数初始化}
}

// 使用示例
var head = new Node(1);  // 无需手动释放
head.Next = new Node(2);

关键差异 :
– C 需要显式内存分配 / 释放,C# 依赖 GC
– C# 使用类代替结构体,内置构造函数
– C# 属性提供更好的封装性

C# 与 C 对比学习指南:从语法差异到实战应用


二、多线程同步案例

C 语言 (pthread 版本)

#include <pthread.h>

int counter = 0;
pthread_mutex_t lock;

void* increment(void* arg) {pthread_mutex_lock(&lock);  // 显式加锁
    counter++;  // 临界区操作
    pthread_mutex_unlock(&lock);
    return NULL;
}

C# 版本

using System.Threading;

class Program {
    static int counter = 0;
    static readonly object _lock = new object();  // 同步对象

    static void Increment() {lock (_lock) {  // 语法糖封装
            counter++;  
        }
    }
}

关键差异 :
– C# 的 lock 语句是 Monitor 类的语法糖
– .NET 提供更丰富的并发集合 (ConcurrentQueue 等)
– C 需要手动初始化 / 销毁互斥锁


三、与原生代码互操作

C 导出函数

__declspec(dllexport) 
int __stdcall Add(int a, int b) {return a + b;}

C# 通过 P /Invoke 调用

using System.Runtime.InteropServices;

class NativeMethods {[DllImport("NativeLib.dll", CallingConvention=CallingConvention.StdCall)]
    public static extern int Add(int a, int b);  // 需严格匹配调用约定
}

避坑指南

1. 值类型 / 引用类型陷阱

  • 值类型 (如 struct)跨语言传递时会复制
  • 引用类型 (如 class)传递指针地址

2. P/Invoke 调用规范

  • 必须明确指定 CharSet(如 CharSet.Ansi)
  • 结构体布局需用 [StructLayout(LayoutKind.Sequential)]
  • 错误示例:
    // 错误:未指定字符集可能导致字符串转换失败
    [DllImport("user32.dll")]
    static extern void MessageBox(IntPtr hWnd, string text, string caption, uint type);

3. 异步编程差异

  • C 常用回调函数,C# 推荐 async/await
  • 混合编程时注意线程上下文切换

延伸思考

  1. 何时选择混合编程?
  2. 需要调用硬件驱动等原生 API 时
  3. 性能关键路径需要极致优化
  4. 复用现有 C /C++ 库

  5. 评估 GC 对实时系统的影响

  6. 测量 GC 暂停时间(使用 PerfView 工具)
  7. 考虑使用 GC.TryStartNoGCRegion
  8. 对延迟敏感场景可部分使用 unsafe 代码

总结建议

从 C 转向 C# 时,最重要的是转变编程思维:
– 从 ” 如何管理内存 ” 变为 ” 如何设计对象关系 ”
– 学会利用.NET 丰富的基类库
– 逐步适应托管环境的编程约束

两种语言各有优势,现代开发中常配合使用。掌握它们的差异能让你更灵活地选择解决方案。

正文完
 0
评论(没有评论)