首页 > Python基础教程 >
-
C#教程之解析Visual C# 7.2中的private protected访问修饰
去年12月份,随着Visual Studio 2017 Update 15.5的发布,Visual C#迎来了它的最新版本:7.2. 在这个版本中,有个让人难以理解的新特性,就是private protected访问修饰符(Access Modifier)。至此,C#语言的访问修饰符有以下几种:
- private
- protected
- public
- internal
- internal protected
- private protected
既然有了private和protected,那么private protected又是什么?它跟internal protected又有什么关系?本文简单介绍一下。
private protected是怎么回事
在解释private protected之前,首先让我们回顾一下internal protected访问修饰符。internal protected表示,相同程序集(Assembly)中的其它类型,或者当前类的子类,具有访问该类中internal protected成员的能力,可以用下图表示:
在上图中:
- 程序集A中的X类,可以访问A类中的Method方法
- 程序集A中的B类,可以重载A类中的Method方法,B类中的其它成员也可以访问A类中的Method
- 程序集B中的C类,可以重载A类中的Method方法,C类中的其它成员也可以通过base.Method()访问A类中的Method
- 程序集B中C类的Method方法重载了A类的Method方法,因此,internal关键字被去掉,于是,程序集B中的Y类,无法访问C类中的Method方法
因此,internal protected表示internal或者protected。
然而,private protected表示,仅有相同程序集(Assembly)中继承于当前类型的类,才能访问该类中private protected成员。换句话说,private protected就是访问者必须在相同程序集中(internal),同时还必须是被访问类型的子类(protected),可以用下图表示:
因此,private protected表示internal并且protected。
private protected何时使用
理论上讲,private protected完善了C#语言的封装性,提供了另一层级别的成员访问保护,听起来感觉让人费解又没什么用。那么,什么时候使用这个访问修饰符呢?现假设你正在设计一个框架,其中有个类,它提供对象存储功能,它的职责是保存给定的对象,而它的每一种实现都需要依赖于一个对象的序列化机制,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public sealed class SerializationHelper { public string Serialze( object s) { using ( var memoryStream = new MemoryStream()) { var serializer = new XmlSerializer(s.GetType()); serializer.Serialize(memoryStream, s); return Encoding.UTF8.GetString(memoryStream.ToArray()); } } } public abstract class DataStorage { private readonly SerializationHelper serializer = new SerializationHelper(); protected SerializationHelper Serializer => serializer; protected abstract void SaveObject( object obj); } public sealed class InMemoryDataStorage : DataStorage { private readonly List< string > serializedData = new List< string >(); protected override void SaveObject( object obj) => serializedData.Add(Serializer.Serialze(obj)); } |