一.寫在前面的話
好久沒有停下來總結自己,轉眼間15年過去好些天,回首過去的日子,亦或失去,亦或所得!生活的節奏,常常讓我們帶着急急忙忙的節奏去追趕,也許這並不是每個人所期望的生活方式!於他人,於自己,都是平凡生活中的小人物,不奢求榮華富貴,不祈求飛黃騰達,但求得心安理得,平安無恙,擁有屬於自己的那一份小幸福足以!從本篇開始,慢慢悉基礎,不急不躁,一步步總結,沉淀自己。也希望和各位高手們學習,願意虛心接受你們的建議。
二.前言
C#中為了數據的安全性以及代碼的拓展,定了幾種訪問級別,根據對應的訪問修飾符,可以獲取Class里面對應的字段、屬性、方法等。
常見的訪問修飾符有:
(1)public 公有訪問。不受任何限制。
(2)private 私有訪問。只限於本類成員訪問,子類。
(3)protected 保護訪問。只限於本類和子類訪問。
(4)internal 內部訪問。只限於本項目內訪問,其他不能訪問。
(5)protected internal 內部保護訪問。只限於本項目或是子類訪問,其他不能訪問
根據MSDN上面的解釋,我們也可以理解對應修飾符的作用。https://msdn.microsoft.com/zh-cn/library/wxh6fsc7.aspx
三.常見成員類型的訪問修飾符
(1)接口(interface)
接口成員訪問修飾符默認為public,且不能顯示使用訪問修飾符。
(2)類(class)
構造函數默認為public訪問修飾符。
析構函數不能顯示使用訪問修飾符且默認為private訪問修飾符。
類的成員默認訪問修飾符為private;
(3)枚舉(enum)
枚舉類型成員默認為public訪問修飾符,且不能顯示使用修飾符。
(4)結構(struct)
結構成員默認為private修飾符。
結構成員無法聲明為protected成員,因為結構不支持繼承。
(5)嵌套類型
嵌套類型的默認訪問修飾符為private。 和類,結構的成員默認訪問類型一致。
四.訪問修飾符測試
(1) 定義程序集AccessModifiersOne,添加DoData.cs類,分別在類中定義相關修飾符的方法。
可以看到在DoData.cs中,通過方法GetNeedData均可以訪問對應的方法,GetPublicData、GetPrivateData、
GetInternalData、GetProtectedData、GetProtectedInternalData。在自身Class中訪問方法不受限制。
/******************************************************************************** ** auth: liupeng ** date: 2016/1/11 星期一 16:14:25 ** desc: 訪問修飾符 ** Ver.: V1.0.0 *********************************************************************************/
namespace AccessModifiersOne { public class DoData { /// <summary>
/// 公共方法 /// </summary>
/// <returns></returns>
public string GetPublicData() { return "My Name Is Public Data"; } /// <summary>
/// 私有方法 /// </summary>
/// <returns></returns>
private string GetPrivateData() { return "My Name Is Private Data"; } /// <summary>
/// 受保護方法 /// </summary>
/// <returns></returns>
protected string GetProtectedData() { return "My Name Is Protected Date"; } /// <summary>
/// 程序集級別方法 /// </summary>
/// <returns></returns>
internal string GetInternalData() { return "My Name Is Internal Data"; } /// <summary>
/// 受保護程序集級別方法 /// </summary>
/// <returns></returns>
protected internal string GetProtectedInternalData() { return "My Name Is Prtected Internal Data"; } /// <summary>
/// 取數據 /// </summary>
public void GetNeedData() { this.GetPublicData(); this.GetPrivateData(); this.GetInternalData(); this.GetProtectedData(); this.GetProtectedInternalData(); } } }
(2)在AccessModifiersOne程序集中添加DoDataTwo.cs,實例化一個DoData對象,可以看到對象只能訪問到GetPublicData
、GetInternalData、GetProtectedInternalData方法,其中GetPrivateData、GetProtectedData方法不能訪問到,證實了private不對外訪問。
/******************************************************************************** ** auth: liupeng ** date: 2016/1/11 星期一 16:28:15 ** desc: 尚未編寫描述 ** Ver.: V1.0.0 *********************************************************************************/
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AccessModifiersOne { class DoDataTwo { public void GetNeedData() { var needDataObj = new DoData(); needDataObj.GetPublicData(); needDataObj.GetInternalData(); needDataObj.GetProtectedInternalData(); } } }
(3)在AccessModifiersOne程序集中添加DoDataThree.cs,同時繼承DoData.cs,實例化一個DoDataThree對象,可以看到該對象可以訪問GetPublicData、
GetProtectedData、GetInternalData、GetProtectedInternalData方法,證實了protected在自身類和繼承類中可以訪問。
/******************************************************************************** ** auth: liupeng ** date: 2016/1/11 星期一 16:33:08 ** desc: 尚未編寫描述 ** Ver.: V1.0.0 *********************************************************************************/
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AccessModifiersOne { public class DoDataThree : DoData { public void GetNeedAnotherData() { var needDataObj = new DoDataThree(); needDataObj.GetPublicData(); needDataObj.GetInternalData(); needDataObj.GetProtectedInternalData(); //訪問父類的protect方法
base.GetProtectedData(); } } }
(4)新建程序集AccessModifiersTwo,同時添加對AccessModifiersOne程序集的引用,添加GetData.cs,實例化一個DoData對象,通過實例化對象,可以看到
只能調用GetPublicData,證實了public訪問無限制。
/******************************************************************************** ** auth: liupeng ** date: 2016/1/11 星期一 16:37:35 ** desc: 尚未編寫描述 ** Ver.: V1.0.0 *********************************************************************************/
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AccessModifiersOne; namespace AccessModifiersTwo { public class GetData { public void GetNeedData() { var needDataObj = new DoData(); needDataObj.GetPublicData(); } } }
五.結束語
2016年1月瞬息間又過了差不多半個月,時間的在心頭的感覺默默然,活在當下,不期盼改變世界,至少先改變自己!一步一腳印,做出來!
一個自己維護的微信公眾號,目前文章不多,希望接下來的日子,會一直更新下去,寫自己的生活,分享技術,希望熱愛生活的技術宅,一起交流!