于是,能量巨大的private protected闪亮登场。将DataStorage.Serializer属性的访问修饰符从protected改为private protected,问题就解决了:
internal 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(); private 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)); }不过,一旦使用了private protected访问修饰符,DataStorage.Serializer属性就只能在DataStorage所在的程序集的子类中访问了。
private protected如何使用private protected访问修饰符是C# 7.2的新特性。自从使用Roslyn编译器服务的C# 6.0开始,C#编译器的版本更新就可以与.NET Framework和Visual Studio的发布分离开来了。这一点在C# 7.x(包括7.1和7.2)的发布中逐步显现出来。在Visual Studio 2017的编译高级选项中,开发人员可以很方便地选择所需的C#版本:
如上图所述,在C#项目上点右键,在项目属性的Build标签页中,点击Advanced按钮,在Advanced Build Settings对话框中,通过Language version下拉框来选择所需的C#语言版本。其中:
C# latest major version (default):C#最新的主版本,也就是与Visual Studio一起发布的主要版本,在VS2017上对应C# 7.0
C# latest minor version (latest):C#的最新版,通常通过VS2017的升级包获得
要使用private protected访问修饰符,则需要在此选择C# latest minor version (latest),或者C# 7.2.
总结本文对C# 7.2的新特性:private protected访问修饰符进行了解析,并通过案例来说明它的应用场景以及Visual Studio 2017对于C#新特性的支持。