C# 封装(Encapsulation)
本章节会全面详细的讲解 C# 封装(Encapsulation) ,包含定义、原理、语法、示例、注意事项及拓展理解,并提供多途径实现与参考链接。
一、什么是封装(Encapsulation)
封装是面向对象编程(OOP)四大基本特性之一,其核心目的是:
✅ “将数据(字段)和操作数据的方法绑定在一起,并控制外部访问权限。”
二、封装的核心要素
| 要素 | 描述 |
|---|---|
| 访问修饰符 | 如 private, public, protected, internal,用于限制成员的可见性。 |
| 字段(Field) | 通常设置为 private,防止外部直接访问。 |
| 属性(Property) | 提供 get 和 set 方法作为字段的访问接口,控制读写行为。 |
| 方法(Method) | 操作封装对象数据的行为,通常也设置访问权限。 |
三、封装语法实例
public class Person
{
// 私有字段 - 封装的数据
private string name;
private int age;
// 公共属性 - 对外暴露控制接口
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get
{
return age;
}
set
{
if (value >= 0)
age = value;
}
}
// 封装方法
public void Introduce()
{
Console.WriteLine($"Hi, I'm {name}, {age} years old.");
}
}
📌 外部只能通过 Name 和 Age 属性访问数据,直接访问 name/age 字段会报错。
四、访问修饰符对比
| 修饰符 | 当前类 | 派生类 | 同一程序集 | 外部程序集 |
|---|---|---|---|---|
private | ✅ | ❌ | ❌ | ❌ |
protected | ✅ | ✅ | ❌ | ❌ |
internal | ✅ | ✅ | ✅ | ❌ |
public | ✅ | ✅ | ✅ | ✅ |
protected internal | ✅ | ✅ | ✅ | ✅ (在派生类中) |
private protected | ✅ | ✅ (本程序集) | ✅ | ❌ |
五、自动实现的属性(简写封装)
public class Student
{
public string Name { get; set; } // 自动封装,无需手动定义字段
}
📌 推荐用于无逻辑处理的简单数据封装。
六、封装中的典型错误与误区
| 错误类型 | 原因与建议 |
|---|---|
| 字段未私有化 | 违反封装原则,应使用 private 限制直接访问 |
不加控制直接 set 值 | 应在 set 中添加逻辑控制(如合法性校验) |
| 将逻辑直接暴露给外部 | 所有操作应封装在方法内部进行 |
七、进阶封装技巧
🔹 只读属性(封装只读)
public string Name { get; private set; }
外部只能 get,只能在构造函数或类内部 set。
🔹 初始化器 + 只读字段封装
public class Config
{
public string Version { get; } = "1.0";
}
🔹 通过方法访问私有字段(行为封装)
private int count;
public void Increment()
{
count++;
}
public int GetCount()
{
return count;
}
八、权威资料参考
九、封装 VS 其他 OOP 特性对比
| 特性 | 描述 |
|---|---|
| 封装 | 隐藏实现细节,暴露接口 |
| 继承 | 子类重用父类逻辑 |
| 多态 | 不同对象对同一接口产生不同响应 |
| 抽象 | 定义统一接口,强制子类实现(如接口/抽象类) |
十、实用场景举例
- ✅ 业务逻辑验证:
set时控制年龄不为负 - ✅ 只读 ID 自动生成
- ✅ 日志封装类中仅允许调用方法记录日志,不允许直接操作文件句柄
更多详细内容,清关注其他相关文章!