[译]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.子类复写父类中的方法时 ...
随机推荐
- 数据类型-Java基础一-初学者笔记
初学者笔记 1.Java中的两种类型 在java源代码中,每个变量都必须声明一种类型(type). 有两种类型:primitive type和reference type.引用类型引用对象(ref ...
- Maven入门【小白千万别点进】
曾经有个女孩问我为什么要学Maven,我吧唧嘴就怼:Maven项目没有jar包它不香嘛,照样运行它不香嘛?如果让我一句话形容Maven,我会这样形容:"妈妈再也不用担心小明拿U盘去小红电脑里 ...
- 开源WPF控件库MaterialDesignInXAML推荐
今天介绍一个开源的C# WPF开源控件库,非常漂亮,重点是开源哦 WPF做桌面开发是很有优势的,除了微软自带的控件外,还有很多第三方的控件库,比如收费的Dev Express For WPF.Tele ...
- 经典算法之K近邻(回归部分)
1.算法原理 1.分类和回归 分类模型和回归模型本质一样,分类模型是将回归模型的输出离散化. 一般来说,回归问题通常是用来预测一个值,如预测房价.未来的天气情况等等,例如一个产品的实际价格为500元, ...
- Django如何启动源码分析
Django如何启动源码分析 启动 我们启动Django是通过python manage.py runsever的命令 解决 这句话就是执行manage.py文件,并在命令行发送一个runsever字 ...
- VisualVM分析与HelloWorld、springBoot项目
VisualVM分析与HelloWorld.springBoot项目 自从1995年第一个JDK版本JDKBeta发布,至今已经快25年,这些年来Java的框架日新月异,从最开始的Servlet阶段, ...
- 程序员常用markdown语法记忆小结
0.toc被中括号包围,实现自动提取标题生成目录 [TOC] 1.*的用法 * 一星:黑点 *二星:斜体* 三星:分割线 * * * **四星:粗体** 2.#的用法 # 1级标题 ## 2j ...
- Python如何爬取实时变化的WebSocket数据
一.前言 作为一名爬虫工程师,在工作中常常会遇到爬取实时数据的需求,比如体育赛事实时数据.股市实时数据或币圈实时变化的数据.如下图: Web 领域中,用于实现数据'实时'更新的手段有轮询和 WebSo ...
- gitlab 命令使用
利用 rm -rf 误删除文件夹, 恢复的办法(注意 要 提前备份或提交 其他新改变的代码, 否则执行下面的命令会让之前的新代码全部消失): git status git reset HEAD \* ...
- 深入理解 BigDecimal
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...