日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發布時間:2023/12/4 C# 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解析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#語言的封裝性,提供了另一層級別的成員訪問保護,聽起來感覺讓人費解又沒什么用。那么,什么時候使用這個訪問修飾符呢?現假設你正在設計一個框架,其中有個類,它提供對象存儲功能,它的職責是保存給定的對象,而它的每一種實現都需要依賴于一個對象的序列化機制,比如:

1234567891011121314151617181920212223242526public 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));}

上面的代碼中,SerializationHelper提供了一種將對象序列化成XML字符串的機制;DataStorage是所有對象數據存儲的基類,它當然也為其子類提供了一個訪問對象序列化器的方式。由于這個對象序列化器是提供給其子類調用的,因此,DataStorage中的Serializer屬性是protected的。最后,InMemoryDataStorage繼承了DataStorage,通過調用由基類提供的Serializer屬性,實現了SaveObject方法。

整個實現當然沒有問題。可是,通過審核所有類型的可見性,我們發現,我們不打算將SerializationHelper這個類暴露給外界,也就是不希望其它的程序集能夠直接訪問SerializationHelper類,于是,我們將它設置成internal的。也就是:

123456789101112internal 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());????????}????}}

好了,問題來了,編譯器開始抱怨了,說SerializationHelper類的訪問級別比DataStorage.Serializer屬性的訪問級別要低:

道理顯而易見:DataStorage.Serializer屬性在DataStorage的子類中即可訪問,這個子類可以是在DataStorage所在的程序集中,也可以是在另一個程序集中。然而,這個屬性的依賴類型:SerializationHelper類,卻只能在DataStorage所在的程序集中才能被訪問。

于是,能量巨大的private protected閃亮登場。將DataStorage.Serializer屬性的訪問修飾符從protected改為private protected,問題就解決了:

1234567891011121314151617181920212223242526internal 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#新特性的支持。

原文地址https://www.cnblogs.com/kenwoo/p/9333042.html

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com


總結

以上是生活随笔為你收集整理的解析Visual C# 7.2中的private protected访问修饰符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产日韩欧美成人 | 你懂的在线观看网址 | 中字幕一区二区三区乱码 | 日本特级黄色大片 | 色九九| 国产91小视频| 成人调教视频 | 亚洲综合自拍 | 色婷av | 4438激情网 | 国产黄色大片视频 | 久久99深爱久久99精品 | 久久澡 | 淫片网站| 未满十八18禁止免费无码网站 | 伊是香蕉大人久久 | 开心色婷婷 | 成人日韩在线观看 | 爱爱一区 | 国产精品久久久久9999 | 久久久三级视频 | 黄色男人的天堂 | 日韩av在线导航 | 福利一区二区在线 | 国内一区二区视频 | 国产精品一区二区精品 | 欧美aa级 | 欧美三级视频在线观看 | 狠狠爱夜夜 | re久久| 国产主播喷水 | 什么网站可以看毛片 | 成人两性视频 | 三年中文在线观看中文版 | 男人天堂av在线播放 | 天天干天天爱天天操 | 欧美性bbw| 久久香焦 | 久久久久久久久一区 | 欧美精品免费视频 | 日本色综合网 | 一级香蕉视频在线观看 | 91视频黄色 | 亚洲欧美91 | 美日韩三级 | 亚洲激情视频在线观看 | 久久伊人一区二区 | 久草福利在线观看 | 三级网站视频 | 黑丝扣逼| heyzo在线播放 | 日韩一级视频 | 国产专区第一页 | 国产av无码专区亚洲av毛片搜 | 午夜av影视 | 亚洲视屏在线观看 | 少妇高潮一区二区三区99欧美 | 天堂在线v | 国产粉嫩呻吟一区二区三区 | 国产精品2区 | 无码人妻熟妇av又粗又大 | 国产在线精品播放 | 91丝袜一区二区三区 | 二区三区偷拍浴室洗澡视频 | 亚洲综合色自拍一区 | 在线高清观看免费观看 | 97成人在线视频 | 香蕉福利视频 | 蜜乳av 懂色av 粉嫩av | 中文字幕在线观看线人 | 佐山爱av在线 | 蜜桃无码一区二区三区 | 天天躁日日躁狠狠躁av麻豆 | 捆绑中国女人hd视频 | 欧美一区二区视频在线观看 | 在线观看免费大片 | 色综合99久久久无码国产精品 | 免费视频www在线观看网站 | 亚洲+小说+欧美+激情+另类 | 久久.com| 老牛嫩草二区三区观影体验 | 狠狠干,狠狠操 | 色片免费观看 | 在线视频第一页 | 午夜av电影在线观看 | 申鹤乳液狂飙 | 有码视频在线观看 | 亚洲第一成肉网 | 秋霞一级视频 | 欧美成人dvd在线视频 | 国产精品乱码一区二区 | 日韩成人影视 | 国产精品色网 | 成人小视频在线看 | av免费观看网站 | 国产精品熟妇一区二区三区四区 | 午夜tv| 国产98在线| 亚洲天堂一区二区三区四区 |