一文搞懂C#中類成員的可訪問性
公眾號「DotNet學習交流」,分享學習DotNet的點滴。
1、成員訪問修飾符
在C#中類成員訪問修飾符一共有5個,分別是public、private、protected、internal、protected internal。
類B能否訪問一個類A的成員,取決于類B的兩個特征:
1、類B是否派生自類A
2、類B和類A是否在同一程序集
2、成員的可訪問性
準備
在第一個命名空間ClassMemberAccessibility_Demo中定義一個類ClassA,ClassA有5個屬性分別被public、private、protected、internal、protected internal訪問修飾符修飾,定義一個ClassB,再定義一個ClassC繼承自ClassA,如下所示:
namespace ClassMemberAccessibility_Demo
{
public class ClassA
{
public int Member1 { get; set; }
private int Member2 { get; set; }
protected int Member3 { get; set; }
internal int Member4 { get; set; }
protected internal int Member5 { get; set; }
}
public class ClassB
{
}
public class ClassC : ClassA
{
?
}
internal class Program
{
static void Main(string[] args)
{
}
}
}
在第二個命名空間中添加對第一個命名空間的引用,然后在第二個命名空間,定義類ClassD,再定義一個ClassE,ClassE繼承自ClassA,如下所示:
using ClassMemberAccessibility_Demo;
namespace ClassMemberAccessibility_Demo2
{
public class ClassD
{
?
}
public class ClassE : ClassA
{
?
}
internal class Program
{
static void Main(string[] args)
{
}
}
}
在同一程序集但不繼承ClassA
ClassB與ClassA在同一程序集,但是不繼承自ClassA,ClassA類成員對ClassB的可見性如下所示:

在ClassB內可訪問Member1、Member4、Member5,修飾符分別是public、internal、protected internal。
在同一程序集且繼承自ClassA
ClassC與ClassA在同一程序集,并且繼承自ClassA,ClassA類成員對ClassC的可見性如下所示:

創建一個ClassC實例,可訪問Member1、Member3、Member4、Member5,修飾符分別是public、protected、internal、protected internal。
不在同一程序集且不繼承自ClassA

在ClassD內只能訪問由public修飾的Member1。
不在同一程序集,但是繼承自ClassA

可訪問Member1、Member3、Member5,分別由public、protected、protected internal。
3、總結
5個修飾符的含義總結如下:
| 修飾符 | 含義 |
|---|---|
| public | 對任何類可訪問 |
| private | 只在類的內部可訪問 |
| protected | 對所有繼承該類的類可訪問 |
| internal | 對該程序集內所有類可訪問 |
| protected internal | 對所有繼承該類或在該程序集內聲明的類可訪問 |
要注意protected internal是protected和internal的并集而不是交集?。?!
5個修飾符的可訪問級別如下:

成員可訪問性的總結如下:
| 同一程序集非派生 | 同一程序集派生 | |
|---|---|---|
| public | ?? | ?? |
| private | ||
| protected | ?? | |
| internal | ?? | ?? |
| protected internal | ?? | ?? |
| 不同程序集非派生 | 不同程序集派生 | |
|---|---|---|
| public | ?? | ?? |
| private | ||
| protected | ?? | |
| internal | ||
| protected internal | ?? |
??表示可訪問
參考
《C#圖解教程(第4版)》——Daniel M. Solis
摘要
C#中類成員的訪問修飾符有public、private、protected、internal、protected internal共5種,本文介紹了這5種修飾符的用法與可訪問性。

浙公網安備 33010602011771號