特性/概念 | C# 示例 | C++ 示例 | 对比说明 |
---|---|---|---|
类定义 | class Person { ... } | class Person { ... }; | 两者语法类似,但 C++ 类后需加分号;C# 默认成员是私有的,和 C++ 一致。 |
构造函数 | public Person(string name) { ... } | Person(std::string name) { ... } | 两者语法相近,C# 可以重载构造函数,C++ 同样支持构造函数重载和初始化列表。 |
析构函数 | ~Person() (很少用) | ~Person() | C# 有 GC,通常不手动释放资源;C++ 需写析构函数管理资源释放。 |
属性(Property) | public int Age { get; set; } | int getAge(); void setAge(int); | C# 有原生属性语法,自动封装字段;C++ 需写显式的 getter/setter。 |
封装 | 使用 private 字段 + public 属性控制访问 | 使用 private 成员 + public 方法控制访问 | 概念相同,C# 提供更友好的语法(属性),C++ 更底层。 |
自动属性 | public string Name { get; set; } | ❌(不支持) | C# 可简洁定义,C++ 不支持,需要手写字段和访问函数。 |
访问修饰符 | public , private , protected , internal | public , private , protected | internal 是 C# 特有的,表示当前程序集内访问。 |
示例对比
类定义 + 构造函数(C#)
class Person
{
public string Name { get; set; }
public int Age { get; private set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
类定义 + 构造函数(C++)
class Person {
private:
std::string name;
int age;
public:
Person(std::string name, int age) {
this->name = name;
this->age = age;
}
std::string getName() const { return name; }
int getAge() const { return age; }
};
什么是自动属性?
在 C# 中,自动属性允许你用简洁的语法定义属性,无需自己声明字段,编译器会自动创建一个私有的字段来存储值。
基本语法:
public int X { get; set; }
等价于下面的完整写法(手动封装字段):
private int _x;
public int X
{
get { return _x; }
set { _x = value; }
}
示例代码:使用自动属性的类
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
使用:
Person p = new Person();
p.Name = "Alice";
p.Age = 30;
Console.WriteLine($"Name: {p.Name}, Age: {p.Age}");
输出:
Name: Alice, Age: 30
自动属性的优点:
特性 | 优点 |
---|---|
简洁性 | 不需要写冗长的字段和 get/set 函数 |
默认私有字段 | 编译器自动生成,程序员无需关心 |
可加限制 | 可以加 private set 只读属性等 |
例如,只允许外部读取、内部写入:
public int Score { get; private set; }
如果你需要逻辑控制怎么办?
当你需要在 get 或 set 中添加自定义逻辑时,就不能使用自动属性了,得改成完整写法:
private int _score;
public int Score
{
get { return _score; }
set
{
if (value >= 0 && value <= 100)
_score = value;
}
}