原文: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. EntityFramework Core 3多次Include导致查询性能低之解决方案

    前言 上述我们简单讲解了几个小问题,这节我们再来看看如标题EF Core中多次Include导致出现性能的问题,废话少说,直接开门见山. EntityFramework Core 3多次Include ...

  2. 华为USG防火墙nat环回配置

    网络环境介绍: 公司内网有一台web服务器,地址是192.168.100.100,web服务端口为80,并且为这台web服务器申请了DNS A记录的域名解析服务,解析记录是公司出口ip地址100.10 ...

  3. 程序员的进阶课-架构师之路(9)-平衡二叉树(AVL树)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  4. Linux命令行初学(一)

    linux命令大全:https://www.linuxcool.com/ 大概了解到有哪些命令,如果有需要的话可以在该网站上查询. 另外在实验楼学习了一些基础,该篇博客就此次对linux命令行的学习进 ...

  5. 第五章 Unity中的基础光照(1)

    [TOC] 渲染总是围绕着一个基础问题:我们如何决定一个像素的颜色?从宏观上来说,渲染包括了两大部分:决定一个像素的可见性,决定这个像素上的光照计算.而光照模型用于决定在一个像素上进行怎样的光照计算. ...

  6. js2——定时跳转

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. 洛谷 P3420 [POI2005]SKA-Piggy Banks 题解

    蒟蒻的第二篇题解 嗯,直接进入正题 先告诉你们这是并查集,好吧,标签上面有,再来分析这为什么是并查集. 根据题意: 每一个存钱罐能够用相应的钥匙打开或者被砸开,Byteazar已经将钥匙放入到一些存钱 ...

  8. Redis面试热点之底层实现篇

    通过本文你将了解到以下内容: Redis的作者.发展演进和江湖地位 Redis面试问题的概况 Redis底层实现相关的问题包括:常用数据类型底层实现.SDS的原理和优势.字典的实现原理.跳表和有序集合 ...

  9. Apache Maven从入门到升天

    喜欢就点个赞呗! GitHub项目JavaHouse同步收录 1 引入 在日常 Java 开发中,Maven 应该是必不可少的一个工具了,当然也有人使用 Gradle 的.那么 Maven 究竟是个啥 ...

  10. iOS本地数据存储

    http://www.jianshu.com/p/a3eeae99e902 大牛整理的超全