115 lines
2.5 KiB
Markdown
115 lines
2.5 KiB
Markdown
# 第五课:多文件项目和访问修饰符
|
||
|
||
## 多文件项目结构
|
||
|
||
```
|
||
Lesson05/
|
||
├── Program.cs // 入口,只管 Main
|
||
├── Models/
|
||
│ ├── Person.cs // 数据模型
|
||
│ └── Microphone.cs // 麦克风类
|
||
├── Helpers/
|
||
│ └── MathHelper.cs // 工具类
|
||
└── Services/
|
||
└── AudioService.cs // 服务类
|
||
```
|
||
|
||
**关键规则**:
|
||
- 同一项目内,所有 `.cs` 文件自动互相可见(不需要 import)
|
||
- 用文件夹组织,但编译时所有文件合并成一个程序集
|
||
|
||
## public vs private 核心区别
|
||
|
||
| 修饰符 | 类内访问 | 类外访问 | 继承访问 |
|
||
|--------|----------|----------|----------|
|
||
| `public` | ✓ | ✓ | ✓ |
|
||
| `private` | ✓ | ✗ | ✗ |
|
||
|
||
```csharp
|
||
class Person
|
||
{
|
||
public string name; // 任何地方都能读写
|
||
private int age; // 只有 Person 内部能访问
|
||
private string secret; // 外部无法访问
|
||
|
||
public void SetAge(int age)
|
||
{
|
||
// 公有方法内部可以访问私有字段
|
||
if (age > 0 && age < 150)
|
||
this.age = age;
|
||
}
|
||
|
||
public int GetAge()
|
||
{
|
||
return this.age; // 通过方法间接访问
|
||
}
|
||
}
|
||
```
|
||
|
||
```csharp
|
||
// Program.cs
|
||
Person p = new Person("无言势");
|
||
p.name = "新名字"; // OK,public
|
||
p.age = 25; // 编译错误,private
|
||
p.SetAge(25); // OK,通过公有方法
|
||
```
|
||
|
||
## 为什么要 private?
|
||
|
||
**数据保护**:防止无效值
|
||
|
||
```csharp
|
||
private int age;
|
||
|
||
// 外部不能直接 age = -100
|
||
// 必须通过方法验证后设置
|
||
public void SetAge(int age)
|
||
{
|
||
if (age < 0) age = 0;
|
||
if (age > 150) age = 150;
|
||
this.age = age;
|
||
}
|
||
```
|
||
|
||
**封装**:内部实现可以随时改,不影响外部
|
||
|
||
```csharp
|
||
// 内部存储从 int 改成 DateTime 都可以
|
||
// 只要 public 方法签名不变,外部代码不用改
|
||
```
|
||
|
||
## 其他访问修饰符
|
||
|
||
| 修饰符 | 说明 |
|
||
|--------|------|
|
||
| `public` | 完全公开 |
|
||
| `private` | 仅本类 |
|
||
| `protected` | 本类 + 子类 |
|
||
| `internal` | 同项目内 |
|
||
|
||
## 属性(Property)- 介于 public/private 之间
|
||
|
||
```csharp
|
||
class Person
|
||
{
|
||
private int _age;
|
||
|
||
public int Age
|
||
{
|
||
get { return _age; } // 读取
|
||
set
|
||
{
|
||
if (value < 0) value = 0; // 写入时验证
|
||
if (value > 150) value = 150;
|
||
_age = value;
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
```csharp
|
||
Person p = new Person();
|
||
p.Age = 25; // 自动调用 set
|
||
int a = p.Age; // 自动调用 get
|
||
```
|