原文: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 5: private protected 访问修饰符的更多相关文章

  1. 解析Visual C# 7.2中的private protected访问修饰符

    去年12月份,随着Visual Studio 2017 Update 15.5的发布,Visual C#迎来了它的最新版本:7.2. 在这个版本中,有个让人难以理解的新特性,就是private pro ...

  2. 关于public private protected访问修饰符

    这个似乎都是老生常谈了,特别是找工作第一轮笔试的时候很爱考这些,再罗列一次,特别要注意继承的情况:     默认状态:即是不加修饰符的时候,所谓的default状态,在类内部可以被访问,在相同的包下面 ...

  3. Java 中的 protected 访问修饰符你真的了解吗?

    protected Java 中的 protected 访问修饰符 总结 在同一个包中,类中 protected 或 default 修饰的属性或方法可以在类外被其对象 (实例) 外部访问,也可以被子 ...

  4. Java基础——protected访问修饰符探讨

    Java基础——protected访问修饰符探讨 根据官方说法:(如图) protected修饰符是可以修饰其他包中的子孙类的,但是我做了个实验,结果发现了一个有趣的现象! 具体请往下看: packa ...

  5. 简述public private protected internal修饰符的访问权限

    public 关键字是类型和类型成员的访问修饰符.公共访问是允许的最高访问级别.对访问公共成员没有限制. protected 关键字是一个成员访问修饰符.受保护成员在它的类中可访问并且可由派生类访问. ...

  6. Java中的protected访问修饰符

    在某个类中定义的protected 方法和属性和默认权限方法和属性是一样的.比如,某类的protected 方法和属性在包外是不能通过该类实例进行访问的(你能在包外访问一个类的默认权限的方法和属性吗? ...

  7. protected访问修饰符

    子类可以调用, 但实例化的对像不可调用  new object;

  8. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  9. php中的访问修饰符 private、protected、public的作用范围

    1. private 只能在类内部使用 2. protected 可以在类内部和继承类里使用.类外部不能使用[即实例化后的对象无法调用] 3. public 全部范围适用. 4.子类复写父类中的方法时 ...

随机推荐

  1. CSS中如何使用背景样式属性,看这篇文章就够用了

    css背景样式属性介绍 背景样式就是自定义HTML标签的背景颜色或背景图像. 背景属性说明表 属性名 属性值 描述 background-color #f00.red.rgb(255,0,0) 设置背 ...

  2. 解决maven创建过慢问题和快捷键

    archetypeCataloginternal idea常用的快捷键 Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ct ...

  3. day 17 re模块 正则表达式

    import re    引用re模块 查找 finall:匹配所有,每一项都是列表中的一个元素 search:只匹配从左到右的第一个,得到的不是直接的结果而是一个变量,通过group方法获取结果,没 ...

  4. 01 jQuery配置、jQuery语法结构、jQuery对象与DOM对象的互相转换

    配置jQuery环境 下载jQuery    官网:jquery.com 学习或开发建议选择未压缩版,便于学习,发布建议选择压缩版,便于用户极速体验(点击下载若出现的是代码页 面,Ctrl+A全选复制 ...

  5. vue 结合 Echarts 实现半开环形图

    Echarts 实现半开环形图 1.先看看实现的图 2.HTML部分 创建id 是 chart 的div标签. <div class="content-item"> & ...

  6. 手机端web(iPad)页面自适应js

    有关编写手机页面(ipad页面)自适应的方法有很多,比如:bootstrap,rem等等.下面分享给大家一个js控制viewPort视区自适应缩放的方法(我给它命名为phone.js): 将phone ...

  7. python_网络编程

    网络ISO(国际标准化组织)--->网络体系结构标准(OSI模型)OSI: 网络信息传输比较复杂需要很多功能协同-->将功能分开,降低耦合度,让每个模块完成一定的功能-->将这些模块 ...

  8. PHP获取绝对路径dirname(__FILE__)和__DIR__比较

    我们都知道,要获取当前PHP脚本所在目录的绝对路径,dirname(__FILE__) 和 __DIR__都可以实现.那么什么情况下用 dirname(__FILE__),什么情况下用 __DIR__ ...

  9. java基础(3)--详解String

    java基础(3)--详解String 其实与八大基本数据类型一样,String也是我们日常中使用非常频繁的对象,但知其然更要知其所以然,现在就去阅读源码深入了解一下String类对象,并解决一些我由 ...

  10. 《Windows内核安全与驱动开发》 3.2 内存与链表

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.2 内存与链表 1. 尝试生成一个链表头并将其初始化. 2. 尝试向内存 ...