C#中修饰符

在C#中,修饰符用于定义类、结构体、成员变量、方法等的访问权限、行为特性或约束条件。以下是C#修饰符的分类及详细说明,附有代码示例:


一、访问修饰符

控制类或成员的可见性和访问范围。

  1. public

    • 作用:公开访问,无任何限制。
    • 适用对象:类、结构体、成员(字段、方法、属性等)。
    csharp 复制代码
    public class MyClass {
        public int PublicField; // 任何地方均可访问
    }
  2. private

    • 作用:仅在声明它的类或结构体内部可访问。
    • 默认修饰符:类成员(未显式指定时)。
    csharp 复制代码
    class MyClass {
        private int _privateField; // 仅限本类内部访问
    }
  3. protected

    • 作用:在本类及派生类中可访问。
    csharp 复制代码
    class BaseClass {
        protected int ProtectedField; // 本类和子类可访问
    }
    class DerivedClass : BaseClass {
        void AccessProtected() {
            ProtectedField = 10; // 允许访问
        }
    }
  4. internal

    • 作用:同一程序集(.dll或.exe)内可访问。
    • 默认修饰符:类和结构体(未显式指定时)。
    csharp 复制代码
    internal class InternalClass {
        internal int InternalField; // 同一程序集内可访问
    }
  5. protected internal

    • 作用:同一程序集内或派生类(即使在不同程序集)中可访问。
    csharp 复制代码
    public class BaseClass {
        protected internal int ProtectedInternalField;
    }
  6. private protected(C# 7.2+)

    • 作用:仅在同一程序集中的派生类可访问。
    csharp 复制代码
    public class BaseClass {
        private protected int PrivateProtectedField;
    }

二、非访问修饰符

定义类或成员的行为特性或约束。

  1. static

    • 作用:声明静态成员或类,属于类型而非实例。
    csharp 复制代码
    public static class MathUtils {
        public static int Add(int a, int b) => a + b; // 静态方法
        public static readonly double PI = 3.14; // 静态字段
    }
    // 调用:MathUtils.Add(1, 2);
  2. readonly

    • 作用:字段只能在声明时或构造函数中赋值。
    csharp 复制代码
    class MyClass {
        public readonly int ReadonlyField;
        public MyClass(int value) {
            ReadonlyField = value; // 构造函数中初始化
        }
    }
  3. const

    • 作用:声明编译时常量,隐式静态且必须初始化。
    csharp 复制代码
    public class Constants {
        public const int MaxValue = 100; // 编译时常量
    }
  4. abstract

    • 作用:定义抽象类或抽象方法(无实现,需在派生类中实现)。
    csharp 复制代码
    public abstract class Animal {
        public abstract void Speak(); // 抽象方法
    }
    public class Dog : Animal {
        public override void Speak() => Console.WriteLine("Woof"); // 必须实现
    }
  5. sealed

    • 作用:阻止类被继承,或方法被重写。
    csharp 复制代码
    public sealed class SealedClass { } // 不能被继承
    public class Base {
        public virtual void Method() { }
    }
    public class Derived : Base {
        public sealed override void Method() { } // 禁止进一步重写
    }
  6. virtualoverride

    • virtual:允许方法在派生类中被重写。
    • override:重写基类的虚方法或抽象方法。
    csharp 复制代码
    public class Base {
        public virtual void Show() => Console.WriteLine("Base");
    }
    public class Derived : Base {
        public override void Show() => Console.WriteLine("Derived");
    }
  7. async

    • 作用 :声明异步方法,通常与await配合使用。
    csharp 复制代码
    public async Task<int> FetchDataAsync() {
        await Task.Delay(1000);
        return 42;
    }
  8. partial

    • 作用:允许类、结构体或方法分布在多个文件中。
    csharp 复制代码
    // File1.cs
    public partial class MyClass {
        public void MethodA() { }
    }
    // File2.cs
    public partial class MyClass {
        public void MethodB() { }
    }
  9. unsafe

    • 作用:允许使用指针和非托管代码。
    csharp 复制代码
    public unsafe void PointerExample() {
        int value = 10;
        int* ptr = &value;
        Console.WriteLine(*ptr); // 输出10
    }

三、其他修饰符

  1. volatile

    • 作用:标记字段可能被多线程修改,禁止编译器优化。
    csharp 复制代码
    public class Worker {
        private volatile bool _stopFlag; // 确保多线程可见性
    }
  2. extern

    • 作用:声明外部方法(通常在非托管代码中实现)。
    csharp 复制代码
    public class ExternalExample {
        [DllImport("user32.dll")]
        public static extern int MessageBox(IntPtr hWnd, string text, string caption, int options);
    }

四、修饰符的组合与限制

  • 不允许的组合
    • abstractsealed(抽象类不能被密封)。
    • staticvirtual/override(静态成员不能被重写)。
  • 常见约束
    • const字段隐式为static,不能与static显式组合。
    • readonly字段可以是实例或静态,但必须在构造函数或声明时初始化。

五、总结

C#修饰符通过控制访问性和行为特性,增强了代码的封装性、安全性和灵活性。合理使用修饰符可以:

  • 明确类型和成员的可见范围(如publicprivate)。
  • 定义静态或常量的全局行为(如staticconst)。
  • 支持面向对象特性(如abstractvirtual)。
  • 处理多线程或非托管代码(如volatileunsafe)。

理解这些修饰符的用途和限制,是编写高质量C#代码的关键。

相关推荐
桃子酱紫君7 分钟前
华为配置篇-BGP实验
开发语言·华为·php
QTX1873019 分钟前
JavaScript 中的原型链与继承
开发语言·javascript·原型模式
shaoing23 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
The Future is mine1 小时前
Python计算经纬度两点之间距离
开发语言·python
Enti7c1 小时前
HTML5和CSS3的一些特性
开发语言·css3
爱吃巧克力的程序媛1 小时前
在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
开发语言·qt
勘察加熊人1 小时前
forms实现俄罗斯方块
c#
独好紫罗兰2 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法
篝火悟者2 小时前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
genispan2 小时前
QT/C++ 多线程并发下载实践
开发语言·c++·qt