所有类型和类型成员都具有可访问性级别,该级别可以控制是否可以从你的程序集或其他程序集中的其他代码中使用它们。 可以使用以下访问修饰符在进行声明时指定类型或成员的可访问性:

public
同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员。

private
只有同一类或结构中的代码可以访问该类型或成员。

受保护
只有同一类或者从该类派生的类中的代码可以访问该类型或成员。
internal
同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。

受保护的内部 该类型或成员可由对其进行声明的程序集或另一程序集中的派生类中的任何代码访问。

专用受保护只有在其声明程序集内,通过相同类中的代码或派生自该类的类型,才能访问类型或成员。

下面的示例演示如何在类型和成员上指定访问修饰符:

C#复制
public class Bicycle
{
public void Pedal() { }
}

并非所有的访问修饰符都可以由所有上下文中的所有类型或成员使用,并且在某些情况下,类型成员的可访问性受其包含类型的可访问性限制。 以下各节提供了有关可访问性的更多详细信息。

类和结构可访问性

在命名空间内直接声明(换句话说,不嵌套在其他类或结构中)的类和结构可以为公共或内部。 如果未指定任何访问修饰符,则默认设置为内部。

结构成员(包括嵌套的类和结构)可以声明为公共、内部或私有。 类成员(包括嵌套的类和结构)可以为公共、受保护的内部、受保护、内部、专用受保护或专用。 默认情况下,类成员和结构成员(包括嵌套的类和结构)的访问级别为私有。 不能从包含类型的外部访问私有嵌套类型。

派生类不能具有高于其基类型的可访问性。 换而言之,不能具有派生自内部类 A 的公共类 B。 如果允许这样,则它将具有使 A 公开的效果,因为可从派生类访问 A 的所有受保护的或内部成员。

可以通过使用 InternalsVisibleToAttribute 启用特定的其他程序集访问内部类型。 有关详细信息,请参阅友元程序集

类和结构成员可访问性

可以使用六种访问类型中的任意一种声明类成员(包括嵌套的类和结构)。 结构成员无法声明为受保护,因为结构不支持继承。

通常情况下,成员的可访问性不大于包含该成员的类型的可访问性。 但是,如果内部类的公共成员实现了接口方法或替代了在公共基类中定义的虚拟方法,则可从该程序集的外部访问该成员。

为字段、属性或事件的任何成员的类型必须至少与该成员本身具有相同的可访问性。 同样,为方法、索引器或委托的任何成员的返回类型和参数类型必须至少与该成员本身具有相同的可访问性。例如,不能具有返回类 C 的公共方法 M,除非 C 也是公共的。 同样,如果 A 声明为私有,则不能具有类型 A 的受保护的属性。

用户定义的运算符始终必须声明为公共。 有关详细信息,请参阅运算符(C# 参考)

终结器不能具有可访问性修饰符。

若要设置类或结构成员的访问级别,向成员声明添加适当的关键字,如以下示例中所示。

C#复制
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { } // private field:
private int wheels = 3; // protected internal property:
protected internal int Wheels
{
get { return wheels; }
}
}

备注

受保护的内部可访问性级别意味着受保护或内部,而非受保护和内部。 换而言之,可以从同一程序集中的任何类(包括派生类)访问受保护的内部成员。 若要将同一程序集中的可访问性限制为仅派生类,请声明类本身为内部,并声明其成员为受保护。 此外,从 C# 7.2 开始,可以使用专用受保护的访问修饰符实现相同的效果,而无需使包含的类属于内部。

其他类型

在命名空间内直接声明的接口可以声明为公共或内部,就像类和结构一样,接口默认设置为内部访问。 接口成员始终为公共的,因为接口的用途是启用其他类型以访问类或结构。 没有访问修饰符可以应用于接口成员。

枚举成员始终为公共的,并且不应用任何访问修饰符。

委托类似于类和结构。 默认情况下,当在命名空间内直接声明它们时,它们具有内部访问,当将它们嵌套在命名空间内时,它们具有私有访问。

C# 语言规范

有关详细信息,请参阅 C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。

请参阅

from:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

访问修饰符(C# 编程指南)的更多相关文章

  1. [.net基础]访问修饰符

    标题:[.net基础]访问修饰符 一.前言 基础掌握不牢固啊,所以记录下来. 二.方法访问修饰符Internal (1).创建工程ParentAndSon (2).添加类ModelA namespac ...

  2. 类的高级:访问修饰符、封装、静态类成员static、内部类;

    访问修饰符: 公开访问(public):对所有子类,非子类访问: 受保护的(protected):只有同包子类.非子类.不同包子类可访问,不同包非子类不可访问: 私有的(private):只有本类可访 ...

  3. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)

    译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...

  4. Java知多少(19)访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: 1 public class className { 2 // body of class 3 } 4 pr ...

  5. java的访问控制(包、访问修饰符、修饰符)

    一.     java的类包 编写好一个源程序后,首先要执行javac命令进行编译源文件,并生成与源文件同名后缀为“.class”的字节码文件(类文件),该类文件与源文件默认在同一个目录中.该类文件是 ...

  6. java:包、继承,访问修饰符

    包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看出目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [3] 更好的保护类.属 ...

  7. Java访问修饰符(访问控制符)

    Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...

  8. Java基础-访问修饰符

    访问修饰符 default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符.使用对象:类.接口.变量.方法. private : 在同一类内可见.使用对象:变量.方法. 注意:不能修饰类( ...

  9. java入门---修饰符&访问修饰符&非访问修饰符

        Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符     修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: public class ...

随机推荐

  1. NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL

    .NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL,异常处理,线程取消 今天记录一下异步多线程的进阶历史,以及简单的使用方法 主要还是以Task,Parallel为主 ...

  2. ubuntu14.0安装ITK的步骤

    (1) sudo apt-get install cmake (2) sudo apt-get install cmake-curses-gui (3)下载安装包InsightToolkit-4.11 ...

  3. 在windows下使用多版本Python安装相应的虚拟开发环境

    在windows下面使用多版本Python安装相应的虚拟开发环境   在搭建一个项目的时候,希望使用最新版的Python3.7版本,但是Python3.6的版本也要留下,那么问题来了,如何解决这个问题 ...

  4. 001.SMB简介

    一 简介 samba基于NetBIOS协议开发,能和windows通信,但只能在局域网通信. 二 Samba主要应用 文件共享 打印服务器 Samba登录时身份验证 进行windows主机名解析 三 ...

  5. springmvc配置MappingJackson2HttpMessageConverter实现属性驼峰和下划线的转换

    需求 php调用java接口时,因为php那边的属性都是下划线风格,java这边的属性都是驼峰的风格.配置springmvc的json转换,在requestBody的时候(调用对象的set 方法)将j ...

  6. ftp服务及其实现之vsftpd

    本文最早发布于我的51CTO博客,目前已迁移至博客园. 简介 FTP,File Transfer Protocol,文件传输协议 文件服务器,具备存储和共享文件(权限设置合理的情况下)的功能 命令端口 ...

  7. DML和DQL 总结

    一:MySql的存储引擎 问题的引入: 由于不同用户对数据的容量,访问速度,数据安全性有着不同的要求. 为了满足不同用户的需求,mysql数据库采用多种存储引擎来进行数据的存储! 1.1:查询mysq ...

  8. InvokeRepeating重复定时器

    JS // Starting in 2 seconds.// a projectile will be launched every 0.3 secondsvar projectile : Rigid ...

  9. 「WC 2019」数树

    「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...

  10. KVM源代码阅读--内核版本3.17.4

    为了更加深入的学习虚拟化,因此我必须把KVM源代码搞清楚,这是一个必须要挖的坑.我会把自己的一些阅读的代码贴上来,可能会有理解不对的地方,希望和大家一起交流,请多提意见,以便于纠正错误.所用的内核版本 ...