C# vs C/C++ 关键概念对比
内存管理
C/C++
// 手动内存管理
char* buffer = new char[1024];
delete[] buffer;
// 栈对象
MyClass obj;
C#
// 垃圾回收自动管理
byte[] buffer = new byte[1024];
// 无需手动释放
// 引用类型(堆)
MyClass obj = new MyClass();
// 值类型(栈)
int value = 10;
指针 vs 引用
C/C++
void ProcessData(char* data, int* length) {
*length = strlen(data);
}
int len;
ProcessData(buffer, &len);
C#
// ref/out 参数
void ProcessData(byte[] data, out int length) {
length = data.Length;
}
int len;
ProcessData(buffer, out len);
类定义
C/C++
// .h 文件
class MyClass {
private:
int value;
public:
MyClass(int v);
~MyClass();
void DoSomething();
};
// .cpp 文件
MyClass::MyClass(int v) : value(v) {}
MyClass::~MyClass() {}
void MyClass::DoSomething() { ... }
C#
// 一个文件搞定
public class MyClass {
private int value;
public MyClass(int v) {
value = v;
}
// 析构函数变成终结器(很少用)
~MyClass() {
// 清理非托管资源
}
public void DoSomething() {
// 实现
}
}
接口
C/C++
// 抽象基类
class IPacketHandler {
public:
virtual void Handle() = 0;
virtual ~IPacketHandler() = default;
};
C#
// 接口(更简洁)
public interface IPacketHandler {
void Handle();
}
// 实现
public class MyHandler : IPacketHandler {
public void Handle() {
// 实现
}
}
泛型
C/C++
template<typename T>
class ObjectPool {
private:
std::stack<T*> pool;
public:
T* Pop() { ... }
void Push(T* item) { ... }
};
C#
public class ObjectPool<T> where T : class {
private Stack<T> pool;
public T Pop() { ... }
public void Push(T item) { ... }
}
异步编程
C/C++
// 回调函数
void ProcessCallback(char* data, int length, void* userdata) {
// 处理结果
}
// 或者 std::future
std::future<int> result = std::async(std::launch::async, [](){
return ProcessData();
});
C#
// async/await (类似 JavaScript 的 Promise)
public async Task<int> ProcessDataAsync() {
return await SomeAsyncOperation();
}
// 使用
int result = await ProcessDataAsync();
异常处理
C/C++
try {
DoSomething();
} catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
C#
try {
DoSomething();
} catch (Exception e) {
Console.WriteLine(e.Message);
}
命名空间
C++
namespace Networker {
namespace Common {
class PacketContext { ... };
}
}
using Networker::Common::PacketContext;
C#
namespace Networker.Common {
public class PacketContext { ... }
}
using Networker.Common;
属性 (Properties)
C++
class MyClass {
private:
int value;
public:
int GetValue() const { return value; }
void SetValue(int v) { value = v; }
};
C#
public class MyClass {
private int value;
// 属性语法糖
public int Value {
get { return value; }
set { this.value = value; }
}
// 自动属性
public string Name { get; set; }
}
委托 (类似函数指针)
C++
typedef void (*EventHandler)(int data);
EventHandler handler = MyFunction;
handler(42);
C#
public delegate void EventHandler(int data);
EventHandler handler = MyMethod;
handler(42);
// 或者使用 Action/Func
Action<int> action = MyMethod;
Func<int, string> func = ConvertToString;
关键差异总结
- 内存管理: C# 有垃圾回收,无需手动释放内存
- 类型安全: C# 更严格的类型检查
- 异常处理: C# 必须处理或声明异常
- 反射: C# 运行时可以检查类型信息
- 属性: C# 的 getter/setter 语法糖
- async/await: C# 内置异步编程支持
- LINQ: C# 内置查询语法
- 依赖注入: .NET 框架级别的 DI 支持