封装与访问修饰符#
来源:
D:\study\C#1\WinForm\stu0812\stu0813\调用私有变量
WinForm 项目里大量使用类封装数据(Student、Book、User 等),本节复习面向对象的封装:用访问修饰符控制外部能否访问。
1. 访问修饰符对比#
| 修饰符 | 可访问范围 |
|---|---|
public |
所有类都可以访问 |
private |
只有本类内部可以访问 |
internal |
同一程序集(项目)内可访问 |
protected |
本类及子类可以访问 |
internal class Class1
{
private int i = 66; // 私有:外部无法直接访问
private string name = "小明";
// public:外部可以访问
public int GetI() { return i; }
}
2. 为什么用 private 封装字段#
// ❌ 外部可以直接改,数据不受控制
public int Age;
// ✅ 封装:外部只能通过方法/属性访问,可以加校验
private int age;
public int Age
{
get { return age; }
set
{
if (value >= 0 && value <= 150) // 校验
age = value;
}
}
💡 属性(Property)是 C# 封装的标准写法:
get读取、set赋值。value是赋值时的传入值。
3. 属性简写(自动属性)#
// 自动属性:编译器自动生成私有字段
public string Name { get; set; } // 可读写
public string Account { get; set; }
public string Password { get; set; }
// 只读属性
public int Count { get; private set; } // 外部不能直接赋值
// 计算属性(get 里写逻辑)
public TimeSpan TotalTime
{
get { return EndTime - StartTime; } // 没有 set,只读计算
}
💡 WinForm 项目中,数据模型类(Student、Book、User)几乎全用自动属性,就是
{ get; set; }。
4. 数据模型类实战(登录注册用户)#
public class User
{
public string Username { get; set; } // 姓名
public string Account { get; set; } // 账号
public string Password { get; set; } // 密码
}
// 使用
User user = new User();
user.Username = "张三";
user.Account = "zhangsan";
user.Password = "123456";
5. 封装的意义#
| 好处 | 说明 |
|---|---|
| 数据安全 | 外部不能随意改,可加校验 |
| 方便维护 | 改内部实现不影响外部调用 |
| 隐藏细节 | 只暴露需要的方法/属性 |
完整封装实战见
08-面向对象与设计模式/03-登录注册系统实战(User 类的使用)。