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

相关推荐
wt_cs4 分钟前
身份证实名认证接口数字时代的信任基石-node.js实名认证集成
开发语言·node.js·php
爱编程的鱼21 分钟前
C# 结构(Struct)
开发语言·人工智能·算法·c#
只可远观33 分钟前
Flutter Dart 循环语句 for while do..while break、continue
开发语言·javascript·ecmascript
是阿根1 小时前
unity使用iTextSharp生成PDF文件
unity·c#·游戏引擎
吴_知遇1 小时前
【华为OD机试真题】428、连续字母长度 | 机试真题+思路参考+代码解析(E卷)(C++)
开发语言·c++·华为od
basketball6162 小时前
Python torchvision.transforms 下常用图像处理方法
开发语言·图像处理·python
ABAP 成2 小时前
.NET Framework 4.0可用EXCEL导入至DataTable
c#
宁酱醇2 小时前
各种各样的bug合集
开发语言·笔记·python·gitlab·bug
啊吧怪不啊吧2 小时前
Linux常见指令介绍下(入门级)
linux·开发语言·centos
谷晓光2 小时前
Python 中 `r` 前缀:字符串处理的“防转义利器”
开发语言·python