面相对象

访问修饰符

预计阅读时间2 分钟 7 views

前言

在C#中,访问修饰符用于指定类型(如类、接口等)及其成员(如字段、方法等)的访问权限。正确使用访问修饰符能够有效控制类及其成员的可见性,确保数据封装和代码安全。本文将介绍C#中的四种基本访问修饰符,并展示它们的实际应用。

作用

访问修饰符在C#中主要有以下作用:

  1. 控制访问权限:通过设置访问修饰符,程序员可以控制哪些类和成员可以被外部访问。
  2. 实现封装:通过限制对类成员的访问,确保内部数据的安全性。
  3. 提高代码安全性和可维护性:通过合理配置访问权限,可以避免不必要的错误和滥用,提升代码的可靠性。

使用场景

  1. public:可以在任何地方访问,适用于需要对外暴露的成员。
  2. private:只能在声明该成员的类内部访问,适用于需要隐藏实现细节的成员。
  3. protected:可以在声明该成员的类及其派生类中访问,适用于需要在继承体系中共享的成员。
  4. internal:只能在同一程序集内访问,适用于程序集内部的访问控制。
  5. protected internal:可以在同一程序集内或从派生类中访问,适用于需要在同一程序集内或继承类中共享的成员。
  6. private protected:只能在同一程序集内的派生类中访问,适用于需要在同一程序集内的派生类中共享的成员。

示例

示例1:public 访问修饰符

using System;

namespace MyApplication {

  class Student {
    public string Name = "李华";

    public void Print() {
      Console.WriteLine("来自 Student 类的问候!");
     }
  }

  class Program {
    static void Main(string[] args) {
      // 创建 Student 类的对象
      Student student = new Student();

      // 访问并打印 Name 字段
      Console.WriteLine("姓名: " + student.Name);

      // 访问 Student 类的 Print 方法
      student.Print();
      Console.ReadLine();
    }
  }
}

输出

姓名: 李华
来自 Student 类的问候!

在这个例子中,Name 字段和 Print 方法都是 public 的,因此可以在 Program 类中访问和使用。

示例2:private 访问修饰符

using System;

namespace MyApplication {

  class Student {
    private string name = "李华";

    private void Print() {
      Console.WriteLine("来自 Student 类的问候!");
     }
  }

  class Program {
    static void Main(string[] args) {
      // 创建 Student 类的对象
      Student student = new Student();

      // 访问 Name 字段并打印(将报错)
      // Console.WriteLine("姓名: " + student.name);

      // 访问 Print 方法(将报错)
      // student.Print();

      Console.ReadLine();
    }
  }
}

错误信息

Error    CS0122    'Student.name' is inaccessible due to its protection level
Error    CS0122    'Student.Print()' is inaccessible due to its protection level

在这个例子中,name 字段和 Print 方法都是 private 的,因此不能从 Program 类中访问。

示例3:protected 访问修饰符

using System;

namespace MyApplication {

  class Student {
    protected string name = "李华";
  }

  class Graduate : Student {
    static void Main(string[] args) {
      // 创建 Graduate 类的对象
      Graduate graduate = new Graduate();

      // 访问并打印 name 字段
      Console.WriteLine("姓名: " + graduate.name);
      Console.ReadLine();
    }
  }
}

输出

姓名: 李华

在这个例子中,Student 类中的 name 字段是 protected 的,因此可以在 Graduate 类中访问,因为 Graduate 类继承自 Student 类。

示例4:internal 访问修饰符

using System;

namespace MyAssembly {

  class Student {
    internal string Name = "李华";
  }

  class Program {
    static void Main(string[] args) {
      // 创建 Student 类的对象
      Student student = new Student();

      // 访问并打印 Name 字段
      Console.WriteLine("姓名: " + student.Name);
      Console.ReadLine();
    }
  }
}

输出

姓名: 李华

在这个例子中,Name 字段是 internal 的,因此可以在同一程序集内的 Program 类中访问。

示例5:protected internal 访问修饰符

// Code in Assembly1
using System;

namespace Assembly1 {
  public class Greet {
    protected internal string Msg = "你好";
  }

  class Program {
    static void Main(string[] args) {
      Greet greet = new Greet();
      Console.WriteLine(greet.Msg);
      Console.ReadLine();
    }
  }
}

输出

你好

在这个例子中,Msg 字段是 protected internal 的,因此可以在同一程序集内的 Program 类中访问。

// Code in Assembly2
using System;
using Assembly1;

namespace Assembly2 {
  class Program : Greet {
    static void Main(string[] args) {
      Program greet = new Program();
      Console.WriteLine(greet.Msg);
      Console.ReadLine();
    }
  }
}

输出

你好

在这个例子中,Msg 字段在另一个程序集内的派生类中也可以访问,因为它是 protected internal 的。

示例6:private protected 访问修饰符

// Code in Assembly1
using System;

namespace Assembly1 {
  public class StudentName {
    private protected string Name = "李华";
  }

  class Program : StudentName {
    static void Main(string[] args) {
      Program student = new Program();
      Console.WriteLine(student.Name);
      Console.ReadLine();
    }
  }
}

输出

李华

在这个例子中,Name 字段是 private protected 的,因此可以在同一程序集内的派生类中访问。

// Code in Assembly2
using System;
using Assembly1;

namespace Assembly2 {
  class Program : StudentName {
    static void Main(string[] args) {
      Program student = new Program();
      // 访问 Name 字段(将报错)
      // Console.WriteLine(student.Name);
      Console.ReadLine();
    }
  }
}

错误信息

Error    CS0122    'StudentName.Name' is inaccessible due to its protection level

在这个例子中,Name 字段在不同程序集的派生类中无法访问,因为它是 private protected 的。

结语

C#中的访问修饰符用于控制类和类成员的访问权限,确保数据的封装和安全性。通过合理使用 publicprivateprotectedinternalprotected internalprivate protected 等修饰符,程序员可以有效地控制代码的可见性和访问级别,从而编写出更安全、更可靠的程序。

Leave a Comment

分享此文档

访问修饰符

或复制链接

内容