亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C# 访问修饰符

C# 访问修饰符

在本教程中,我们将通过示例了解 C# 中的 public、private、protected 和 internal 访问修饰符。

在 C# 中,访问修饰符指定类型(类、接口等)和类型成员(字段、方法等)的可访问性。例如,

class Student {

  public string name;
    
  private int num;

  }

在这里,

访问修饰符的类型

在 C# 中,有 4 种基本类型的访问修饰符。


1.公共访问修饰符

当我们声明一个类型或类型成员 public ,它可以从任何地方访问。例如,

using System;

namespace MyApplication {

  class Student {
    public string name = "Sheeran";
      
    public void print() {
      Console.WriteLine("Hello from Student class");
     }
  }

  class Program {
    static void Main(string[] args) {
    
      // creating object of Student class
      Student student1 = new Student();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + student1.name);

      // accessing print method from Student
      student1.print();
      Console.ReadLine();
    }
  }
}

输出

Name: Sheeran
Hello from Student class

在上面的例子中,我们创建了一个名为 Student 的类 带有字段 name 和一个方法 print() .

// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);

// accessing print method from Student
student1.print();

由于字段和方法是公开的,我们可以从 Program 访问它们 类。

注意 :我们使用了对象 student1 学生 类来访问其成员。要了解更多信息,请访问 C# 类和对象 .


2。私有访问修饰符

当我们用 private 声明一个类型成员时 访问修饰符,只能在同一个class内访问 或 struct .例如,

using System;

namespace MyApplication {

  class Student {
    private string name = "Sheeran";
      
    private void print() {
      Console.WriteLine("Hello from Student class");
     }
  }

  class Program {
    static void Main(string[] args) {
    
      // creating object of Student class
      Student student1 = new Student();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + student1.name);

      // accessing print method from Student
      student1.print();

      Console.ReadLine();
    }
  }
}

在上面的例子中,我们创建了一个名为 Student 的类 带有字段 name 和一个方法 print() .

// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);

// accessing print method from Student
student1.print();

由于字段和方法是私有的,我们无法从 Program 访问它们 班级。在这里,代码会产生如下错误。

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

3。受保护的访问修饰符

当我们将类型成员声明为 protected ,它只能从同一个类及其派生类访问。例如,

using System;

namespace MyApplication {

  class Student {
    protected string name = "Sheeran";
  }

  class Program {
    static void Main(string[] args) {
    
      // creating object of student class
      Student student1 = new Student();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + student1.name);
      Console.ReadLine();
    }
  }
}

在上面的例子中,我们创建了一个名为 Student 的类 带有字段 name .由于该字段受到保护,我们无法从 Program 访问它 类。

在这里,代码会产生如下错误。

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

现在,让我们尝试访问 protected 派生类的成员。

using System;

namespace MyApplication {

  class Student {
    protected string name = "Sheeran";
  }
  
  // derived class
  class Program : Student {
    static void Main(string[] args) {

      // creating object of derived class
      Program program = new Program();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + program.name);
      Console.ReadLine();
    }
  }
}

输出

Name: Sheeran

在上面的例子中,我们创建了一个类 Student 带有受保护的字段 name .请注意,我们继承了 Program 学生的班级 类。

// accessing name field and printing it
Console.WriteLine("Name: " + program.name);

protected 成员可以从派生类中访问,我们可以访问 name 来自程序 类。


4。内部访问修饰符

当我们将类型或类型成员声明为 internal ,只能在同一个程序集中访问。

程序集是类型(类、接口等)和资源(数据)的集合。它们被构建为一起工作并形成功能的逻辑单元。

这就是为什么当我们运行一个程序集时,程序集中的所有类和接口都一起运行。要了解更多信息,请访问 C# 程序集。


示例:同一程序集中的内部

using System;

namespace Assembly {

  class Student {
   internal string name = "Sheeran";
  }

  class Program {
    static void Main(string[] args) {
    
      // creating object of Student class
      Student theStudent = new Student();
      
      // accessing name field and printing it
      Console.WriteLine("Name: " + theStudent.name);
      Console.ReadLine();
    }
  }
}

输出

Name: Sheeran

在上面的例子中,我们创建了一个名为 Student 的类 带有字段 name .由于该字段是 internal ,我们可以从 Program 访问它 类,因为它们在同一个程序集中。

如果我们使用 internal 在单个程序集中,它就像 public 访问修饰符。


示例:不同程序集中的内部

让我们先创建一个程序集。

// Code on Assembly1
using System;

namespace Assembly1 {

  public class StudentName {
    internal string name = "Sheeran";
  }

  class Program {
    static void Main(string[] args) {
    }
  }
}

此处,此代码在 Assembly1 中 .我们创建了一个内部字段 name 在类 StudentName 内 .现在,该字段只能从同一个程序集 Assembly1 访问 .

现在,让我们创建另一个程序集。

// Code on Assembly2
using System;

// access Assembly1
using Assembly1;

namespace Assembly2 {
  class Program {
    static void Main(string[] args) {
      StudentName student = new StudentName();

      // accessing name field from Assembly1
      Console.Write(student.name);
      Console.ReadLine();
     }
  }
}

此处,此代码在 Assembly2 中 .我们正在尝试访问 name StudentName 的字段 类(Assembly1 )。

Assembly1 访问字段 ,我们首先需要设置Assembly1的引用 在Assembly2中 .现在是代码

using Assembly1;

允许我们使用 Assembly1 中的代码 到 Assembly2 .

在这里,当我们尝试访问 name Assembly2 中的字段 ,我们得到一个错误。

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

这是因为 nameAssembly1 中存在的内部字段 .


5.受保护的内部访问修饰符

protected internalprotected 的组合 和 internal 访问修饰符。

当我们声明一个成员 protected internal ,它可以从同一个程序集和任何其他程序集的包含类的派生类访问。

// Code on Assembly1
using System;

namespace Assembly1 {
  public class Greet {
    protected internal string msg="Hello";
  }

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

输出

Hello

上面的代码在 Assembly1 .

在上面的例子中,我们创建了一个名为 Greet 的类 带有字段 msg .由于该字段受内部保护,我们可以从 Program 访问它 类,因为它们在同一个程序集中。

让我们从 Greet 派生一个类 在另一个程序集中并尝试访问受保护的内部字段 msg 来自它。

// Code on Assembly2
using System;

// access Assembly1
using Assembly1;

namespace Assembly2 {

  // derived class of Greet
  class Program: Greet {
    static void Main(string[] args) {
      Program greet = new Program();

      // accessing name field from Assembly1
      Console.Write(greet.msg);
      Console.ReadLine();
    }
  }
}

输出

Hello

上面的代码在 Assembly2 .

在上面的例子中,我们继承了 Program Greet 中的类 类(来自 Assembly1 )。

// accessing name field from Assembly1
Console.Write(greet.msg);

我们可以访问 msg 来自 问候 Assembly1 的类 来自 Assembly2 .

这是因为 msg 是一个受保护的内部字段,我们正在尝试从 Greet 的子类访问它 .


6。私有保护访问修饰符

private protected 访问修饰符是 private 的组合 和 protected .它可从 C# 版本 7.2 及更高版本获得。

当我们声明一个成员 private protected ,它只能在同一个类中访问,并且它的派生类在同一个程序集中。例如,

// Code in Assembly1
using System;

namespace Assembly1 {
  public class StudentName {
    private protected string name = "Sheeran";
  }

  //derived class of StudentName class
  class Program1 : StudentName {

    static void Main(string[] args) {

      Program1 student = new Program1();

      //  accessing name field from base class
      Console.Write(student.name);
      Console.ReadLine();
    }
  }
}

输出

Sheeran

上面的代码在 Assembly1

在上面的例子中,我们创建了一个类 StudentName 带有 private protected 字段 名称 .

请注意,我们继承了 Program1 StudentName 的班级 类。

private protected 成员可以从同一个程序集中的派生类访问,我们可以访问 name 来自 Program1 类。

让我们从 StudentName 派生一个类 在另一个程序集中并尝试访问私有受保护字段 name 从中。例如,

// Code in Assembly2
using System;
//access Assembly1
using Assembly1;

namespace Assembly2 {

  //derived class of StudentName
  class Program : StudentName {
    static void Main(string[] args) {
      Program student = new Program();
    
      // accessing name field from Assembly1
      Console.Write(student.name);
      Console.ReadLine();
     }
  }
}

上面的代码在 Assembly2

在上面的例子中,当我们尝试访问 name StudentName 派生类的字段 ,我们得到一个错误。

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

这是因为 name 字段在 Assembly1 中 并且派生类在 Assembly2 .

注意 :我们也可以对类型(类、接口等)使用访问修饰符。但是,我们只能使用带有公共和内部访问修饰符的类型。


C语言

  1. C# 类和对象
  2. C# 静态关键字
  3. C#抽象类和方法
  4. C# 嵌套类
  5. C# 部分类和部分方法
  6. C# 密封类和方法
  7. C++ 类模板
  8. C 存储类
  9. Java - 修饰符类型
  10. C++中的多态性
  11. C++ 中的数据抽象
  12. C++ 中的数据封装