[译]C# 7系列,Part 5: private protected 访问修饰符
原文:https://blogs.msdn.microsoft.com/mazhou/2017/10/05/c-7-series-part-5-private-protected/
C#有几个可访问性修饰符,public、internal、internal protected和private。
- public: 具有此可访问性声明的成员可以在此成员所在程序集中或引用该成员所在程序集的任何其他程序集中可见。也就是说,访问不受限制。
- internal:具有此可访问性声明的成员可以在此成员所在程序集中可见,但对成员所在程序集之外的任何程序集不可见。也就是说,访问权限仅限于成员所在程序集内部。
- protected:具有此可访问性声明的成员可以在此成员所在程序集中包含该成员的类型的派生类型中以及此成员所在程序集之外的任何程序集中包含该成员的类型的派生类型中可见。也就是说,访问权限仅限于包含该成员的类型及此类型的派生类型。
- internal protected:具有此可访问性声明的成员可以在成员所在程序集内部或外部的包含该成员的类型的派生类型内可见,也可以对成员所在程序集内的任何类型可见。也就是说,访问权限仅限于成员所在程序集或派生类型(译注:任意程序集)。
- private:具有此可访问性声明的成员可以在其所在类型内可见,但对任何派生类型、同一程序集中的其他类型或所在程序集外的类型不可见。也就是说,访问权限仅限于包含该成员的类型。
private protected
C# 7.2增加了一个新的可访问性级别:private protected。这是为了匹配CLR中已经存在的相同的访问级别。
- private protected:具有此可访问性声明的成员可以在成员所在程序集中从包含该成员的类型派生的类型中可见。它对于非派生自包含该成员的类型或成员所在程序集外部的任何类型都是不可见的。也就是说,访问权限仅限于成员所在程序集内的包含该成员的类型及此类型的派生类型。
如果开发人员希望实现仅对内部组件级别可见的东西,这是非常有用的。
示例
为了演示private protected的行为,我创建了一个包含两个项目的解决方案:一个是类库项目,另一个是引用该类库项目的控制台应用程序。我在类库项目中创建了类型:
public class Base
{
protected private void M()
{
Console.WriteLine("From Base.M()");
}
} public class D1 : Base
{
new public void M()
{
Console.WriteLine("From D1.M()");
base.M();
}
}
在类型Base中,我声明了一个private protected成员M(),然后在派生自Base的D1类中,我创建了一个方法M()并在内部调用base.M()。这两种类型在同一个程序集中,所以我应该可以从D1访问base.M()。
然后我创建另外一个类型C:
public class C
{
public void M()
{
Base b = new Base();
b.M(); D1 d = new D1();
d.M();
}
}
我试图在C.M()方法中调用b.M(),但是因为C没有继承Base,所以我没有访问Base.m()的权限,因此代码无法工作;我看到这个编译错误:
![]()
最后,我在控制台程序项目中创建了一个类型,它不在Base类型所在的序集。如果我试图在这里访问Base.M(),我将得到这个编译错误:
![]()
注意:要想重现上面的示例,你需要将你的项目升级到C# 7.2或更新版本。
![]()
结论
现在,在C# 7.2中,我们有5个级别的可访问性:public、internal、protected、internal protected和private protected。新加入的private protected将收益于仅对所在程序集中的派生类型可访问,以便为某些成员提供特殊的内部实现。有关更多详细信息,请参阅这个页面。
系列文章:
- [译]C# 7系列,Part 1: Value Tuples 值元组
- [译]C# 7系列,Part 2: Async Main 异步Main方法
- [译]C# 7系列,Part 3: Default Literals 默认文本表达式
- [译]C# 7系列,Part 4: Discards 弃元
- [译]C# 7系列,Part 5: private protected 访问修饰符 (本文)
- [译]C# 7系列,Part 6: Read-only structs 只读结构
- [译]C# 7系列,Part 7: ref Returns ref返回结果
- [译]C# 7系列,Part 8: in Parameters in参数
- [译]C# 7系列,Part 9: ref structs ref结构
- [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理 (完)
[译]C# 7系列,Part 5: private protected 访问修饰符的更多相关文章
- 解析Visual C# 7.2中的private protected访问修饰符
去年12月份,随着Visual Studio 2017 Update 15.5的发布,Visual C#迎来了它的最新版本:7.2. 在这个版本中,有个让人难以理解的新特性,就是private pro ...
- 关于public private protected访问修饰符
这个似乎都是老生常谈了,特别是找工作第一轮笔试的时候很爱考这些,再罗列一次,特别要注意继承的情况: 默认状态:即是不加修饰符的时候,所谓的default状态,在类内部可以被访问,在相同的包下面 ...
- Java 中的 protected 访问修饰符你真的了解吗?
protected Java 中的 protected 访问修饰符 总结 在同一个包中,类中 protected 或 default 修饰的属性或方法可以在类外被其对象 (实例) 外部访问,也可以被子 ...
- Java基础——protected访问修饰符探讨
Java基础——protected访问修饰符探讨 根据官方说法:(如图) protected修饰符是可以修饰其他包中的子孙类的,但是我做了个实验,结果发现了一个有趣的现象! 具体请往下看: packa ...
- 简述public private protected internal修饰符的访问权限
public 关键字是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. protected 关键字是一个成员访问修饰符.受保护成员在它的类中可访问并且可由派生类访问. ...
- Java中的protected访问修饰符
在某个类中定义的protected 方法和属性和默认权限方法和属性是一样的.比如,某类的protected 方法和属性在包外是不能通过该类实例进行访问的(你能在包外访问一个类的默认权限的方法和属性吗? ...
- protected访问修饰符
子类可以调用, 但实例化的对像不可调用 new object;
- 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)
访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...
- php中的访问修饰符 private、protected、public的作用范围
1. private 只能在类内部使用 2. protected 可以在类内部和继承类里使用.类外部不能使用[即实例化后的对象无法调用] 3. public 全部范围适用. 4.子类复写父类中的方法时 ...
随机推荐
- Learning Markov Clustering Networks for Scene Text Detection
Learning Markov Clustering Networks for Scene Text Detection 论文下载:https://arxiv.org/pdf/1805.08365v1 ...
- kali linux 修改更新源和更新命令
1.修改sources.list源文件: vim /etc/apt/sources.list #aliyun 阿里云 deb http://mirrors.aliyun.com/kali kali-r ...
- 全球 43 亿 IPv4 地址已耗尽!IPv6,刻不容缓
大家都知道目前网络协议使用的主要是 IPv4,全称为 Internet Protocol version 4,作用是为每一个网络和每一台主机分配一个 IP,IP 地址是一个 32 位的二进制数,算下来 ...
- Redis系列(四):Redis持久化和主从复制原理
一.持久化 所谓的持久化就是把内存中的数据写到磁盘中去,防止服务宕机后内存数据丢失.Redis4.0之前提供了两种持久化方式:RDB(默认) 和AOF,Redis4.x之后新增了一种混合持久化(本文所 ...
- 简单入门Kubernetes
什么是Kubernetes 官网 https://kubernetes.io/ 中文版:https://kubernetes.io/zh/ 个人理解 基于容器技术 分布式架构 弹性伸缩 隔离物理机 和 ...
- 【Android - IPC】之Serializable和Parcelable序列化
1.序列化的目的 (1)永久的保存对象数据(将对象数据保存到文件或磁盘中): (2)通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的,因此序列化的目的是将对象数据 ...
- SQL语句总结基础篇
创建数据库 CREATE DATABASE 数据库名称; 删除数据库 DROP DATABASE 数据库名称; 创建新表 create table 表名(列 类型 ,列 类型 ,..); 根据已有的表 ...
- VLAN实验4(在eNSP上利用单臂路由实现VLAN间路由)
原理概述: 以太网中,通常会使用VLAN技术隔离二层广播域来减少广播的影响*并增强 网络的安全性和可管理性.其缺点足同时也严格地隔离了不同VLAN之间的任何二层流量,使分属于不同VLAN的用户 不能直 ...
- 生活小插曲(长篇连载,持续更新ing)^_^
这个帖子,长期记录一些小小的生活插曲 在北京朋友开店了-关于同学开快餐店的故事.今天下午听说这个朋友在附近开了一个店,下午5点多吧,出门去他那里去了.走路过去的.在那里聊了将近一个小时吧.对最近我们自 ...
- 记录我的 python 学习历程-Day02-while 循环/格式化输出/运算符/编码的初识
一.流程控制之--while 循环 循环就是重复做同一件事,它可以终止当前循环,也可以跳出这一次循环,继续下一次循环. 基本结构(基本循环) while 条件: 循环体 示例 # 这是一个模拟音乐循环 ...