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#代码的关键。

相关推荐
没有晚不了安2 分钟前
1.13作业
开发语言·python
布谷歌6 分钟前
Oops! 更改field的数据类型,影响到rabbitmq消费了...(有关于Java序列化)
java·开发语言·分布式·rabbitmq·java-rabbitmq
被程序耽误的胡先生12 分钟前
java中 kafka简单应用
java·开发语言·kafka
刀客12312 分钟前
python小项目编程-中级(1、图像处理)
开发语言·图像处理·python
卷卷的小趴菜学编程17 分钟前
c++之多态
c语言·开发语言·c++·面试·visual studio code
冷琴199637 分钟前
基于Python+Vue开发的反诈视频宣传管理系统源代码
开发语言·vue.js·python
楠枬1 小时前
网页五子棋——对战后端
java·开发语言·spring boot·websocket·spring
kyle~1 小时前
thread---基本使用和常见错误
开发语言·c++·算法
时光追逐者1 小时前
推荐几款开源免费的 .NET MAUI 组件库
microsoft·开源·c#·.net·.net core·maui
坚持就完事了1 小时前
Python之numpy
开发语言·python·numpy