Skip to content
CSharp面向对象修饰符

基础权限

修饰符可见范围备注
public所有对所有可见
private当前类只能在当前的类才内访问,派生类无法访问
protect当前类和派生类派生类可以访问(可以跨程序集)
internal当前程序集也就是当前项目的所有代码都可以访问

继承与多态

abstract

”抽象“,也就是标记为未实现,需要在派生类当中做出实现,实现的时候使用 override 修饰符

如果类内含有抽象成员,就必须用 `abstract` 修饰这个类

CSharp
public abstract class AnimalBase
{
    // 所有 Animal 都有的 并且可以随时读写
    public int Id { get; set; }
    // 所有 Animal 都有名字,但是需要自己去实现自己的名字是什么
    public abstract string Name { get; }

}
public class Cat : AnimalBase
{
    // 使用 override 表示重载 abstract 中定义的属性
    public override string Name => "Cat";
    // 只有 Cat 才有捕捉老鼠的行为 所以定义为成员
    public void CatchMouse()
    {
        Console.WriteLine("This cat is catching a mouse");
    }
}

virtual

”虚“,可以在基类中提供默认实现的 “abstact”,派生类可以选择是否重载 (override) 它 但是只能修饰 方法、属性、索引器、事件,不可以修饰类 含有虚成员的类可以不是抽象类

CSharp
public class Person
{
    public virtual string Name => "Nobody";
}
public class Tom : Person
{
    public override string Name => "Tom";
}
public class Nobody : Person
{
    public void LoudOutSadness()
    {
        // 输出就是 Person 的默认实现, 即 Nobody
        Console.WriteLine(Name);
    }
}

override

用于标记重载抽象成员或者虚成员

sealed

“密封”,标记此

  • 方法,无法再重载
  • 类,无法再派生 如下 ![[Pasted image 20250706085912.png]] dog 是最后一层封装,我们无法对它进行派生(不然会出现Monster,害怕

适用于不希望暴露扩展点的核心类,比如工具类或安全敏感类。

new

”隐藏“,创建一个与基类同名但独立的成员,具体调用哪一个成员,看实例化对象的类型

特性修饰符

static

无需实例化可以直接访问(dotnet 中 CLR 按需 在类型加载时分配静态字段内存,静态构造则在首次使用前执行)

const

编译时常量

readonly

运行时常量,仅能在声明或构造函数中赋值

partial

拆分声明到多个文件内

CSharp
// File1.cs
public partial class Person
{
    public string Name { get; set; }
}

// File2.cs
public partial class Person
{
    public int Age { get; set; }
}

此时 Person 拥有 Name 和 Age 两个属性

extern

声明外部实现(针对方法)

CSharp
public class NativeMethods
{
    [DllImport("user32.dll")]
    public static extern int MessageBox(IntPtr h, string t, string c, uint u);
}

unsafe

可以使用不安全的代码(比如指针操作)

Released under the MIT License.