可访问性修饰符

引言

什么是可访问性修饰符呢?

可访问性修饰符是用来控制代码 “能被谁访问”,它属于 关键字1 的一种,简单理解就是给代码设置 权限等级

就像现实生活中

  • 有些东西是公开的(谁都能看)
  • 有些是内部资料(公司内部可看)
  • 有些是私人信息(只有自己能看)

在 C# 中,这种权限控制就是通过 访问修饰符 来实现的。

那么又为什么需要访问控制?

如果没有访问控制:

  • 所有变量都能被随意修改
  • 内部逻辑容易被破坏
  • 代码变得非常不安全

访问修饰符可以做到:

  • 保护数据
  • 防止误操作
  • 提高代码安全性
  • 限制使用范围

这也是面向对象的重要原则之一:

封装(Encapsulation)

C# 常见的访问修饰符列表

修饰符 访问范围 新手理解
public 全世界都能访问 完全公开
private 只有本类能访问 绝对私有
protected 本类 + 子类 家族可用
internal 同一个项目内 公司内部

这些是C#中最最常用的几个访问修饰符列表,接下来我们会分开讲解这几个关键字

public(公开访问)

含义

任何地方都可以访问

就像公共公告栏,谁都能看。


示例

public class Person
{
    public string Name;
}

使用:

Person p = new Person();
p.Name = "小明";

任何地方都可以访问 Name。


什么时候用?

适用于:

  • 对外提供的接口
  • 必须公开的功能
  • API 方法

private(私有访问)

含义

只能在当前类内部访问

就像个人隐私,别人看不到。


示例

class Person
{
    private int age;
}

外部访问会报错:

Person p = new Person();
p.age = 10; // 无法访问,编译器会报错

为什么最常用

因为它是 最安全的访问级别,而且如果你不刻意去写可访问性修饰符的话,类内部的成员默认都是private

因此通常我们会:

  • 字段用 private
  • 属性用 public

这是一种标准设计模式。

protected(受保护访问)

含义

本类 + 子类可以访问

就像家族内部(父类、子类)共享信息。


示例

class Animal
{
    protected int age;
}

子类可以访问:

class Dog : Animal
{
    void Test()
    {
        age = 5; // 可以访问
    }
}

但外部不能访问。


什么时候用?

通常用于:

  • 继承结构
  • 给子类使用的数据

internal(内部访问)

含义

只能在当前项目2内访问

就像公司内部文件,外部看不到。


示例

internal class Helper
{
}

在同一个项目2可以访问,但是在另一个项目中无法访问


修饰符对比

可以用一张表快速理解:

修饰符 本类 子类 同项目 外部
public
private
protected
internal

成员默认访问级别

你可能会问:

不写修饰符会怎样?

答案是分情况:

类成员默认是 private

class Test
{
    int number; // 默认 private
}

类默认是 internal

class MyClass // 默认 internal
{
}

等价于:

internal class MyClass
{
}

最佳写法

在真实项目中通常这样设计:

class Person
{
    private int age;        // 数据隐藏
    public int Age          // 提供访问入口
    {
        get { return age; }
        set { age = value; }
    }
}

这是最经典的 字段 private + 属性 public模式。

记忆口诀

可以用一句话记住:

public 谁都能用
private 只有自己
protected 子类能用
internal 同项目用

常见误区

❌ 懒得写了,都定义成 public

应该尽量减少 public,原则是:能 private 就不要 public

❌ protected 和 internal 一样

  • protected → 继承范围
  • internal → 项目范围

总结

访问修饰符 = 控制代码 “谁能访问” 的权限系统


  1. 关键字(keyword) 是 C# 语言中具有特殊含义的保留单词,例如 classpublicif 等,它们不能被当作变量名使用,用于表示固定的语法功能。

  2. C# 项目(.csproj)是编译和管理代码的单位,具体可以看基础结构那一篇。