C#:類的訪問修飾符和類成員的訪問修飾符
阿新 • • 發佈:2020-10-25
關於類的訪問修飾符常見的有兩個:公開的(public)、私有的(internal)
- public修飾符修飾的類:在任何地方都能訪問到他
- internal修飾符修飾的類:只可以在當前程式集中訪問,在其他程式集不可見,即:不可訪問
- internal修飾符修飾類的時候,可以省略;即internal是一種預設的類的訪問級別。
新建一個解決方案,在該解決方案下新增兩個專案,我們稱一個專案為一個程式集,類的訪問控制,就由下面的例子展開。
在MyClassLibrary中新增一個public修飾的MyLibrary類和Student類(由於沒有使用任何修飾符,所以編譯器預設它是internal,即私有的)
namespace MyClassLibrary
{
public class MyLibrary
{
Student stu = new Student();
}
class Student
{
MyLibrary my = new MyLibrary();
}
}
分析:無論類是公開的還是私有的,在MyClassLibrary程式集中,對於其他類都是可見的
- 為了驗證上述,我又在MyClassLibrary專案中,新增了一個資料夾,在該資料夾下新增了一個類,在該類中訪問私有的Student
namespace MyClassLibrary.NewFolder1 { internal class ThirdClass { Student stu = new Student(); } }
說明私有型別,在程式集內部的訪問是不受限制的。
在另外一個程式集FirstApp中新增對MyClassLibrary程式集的引用,然後訪問MyClassLibrary程式集中的類
分析:public的MyLibrary型別,對於其它程式集是可見的;而internal(我們稱它為顯示私有的)ThirdClass型別和(隱式私有的)Student型別對於其它程式集是不可見的;
通過簡單的圖例展示一下,公開和私有型別的類,訪問許可權是怎麼樣的
對圖例的說明:
- 為了形象表示公開和私有,上圖將私有的類框在了程式集內部,將公開的類暴露出程式集;
- 由於私有的型別是我們宣告類的時候預設的訪問級別,它對於本程式集處處可見,所以就不再展示程式及內部各類之間的訪問;
關於類的成員的訪問修飾符常見的有五個:public、internal、proteced、private;
- public修飾的類成員,在本程式集或引用本程式集合的其它程式集中都可以訪問該成員;
- internal修飾的類成員,在本程式集內可以訪問到該成員;
- protected修飾的類成員,只能在本類中或者派生自該類的子類中訪問該成員;
- private修飾的成員,只能在本類中訪問該成員。
下面通過程式碼示例展示在同一程式集中訪問修飾符的使用:
namespace A
{
public class A1
{
public string Name { get; set; }
internal string hobby { get; set; }
private int accountId;
public A1()
{
A2 a2 = new A2();
//internal修飾的成員 在本程式集中 都是可以訪問的
Console.WriteLine(a2.Adress + "" + a2.Name);
}
}
class A2
{
public string Name { get; set; }
internal string Adress { get; set; }
private int size;
public A2()
{
A1 a1 = new A1();
Console.WriteLine(a1.Name + "" + a1.hobby);
}
}
}
在同一程式集中,internal、public修飾的成員的訪問是不受限制的
在引用該程式集的另一程式集中觀察訪問修飾符的使用:
程式集B中宣告父型別Shape
namespace B
{
public class Shape
{
protected int Height { get; set; }
protected int Width { get; set; }
decimal cost;
public int Area { get; set; }
}
class Car
{
public Car()
{
Shape shape = new Shape();
Console.WriteLine(shape.Area);//只能訪問到public的Aera,其餘都不可訪問
}
}
}
在程式集A中,先新增B程式集的引用,然後新增如下程式碼
namespace A
{
public class A1
{
public string Name { get; set; }
internal string hobby { get; set; }
private int accountId;
public A1()
{
Shape shape = new Shape();
Console.WriteLine(shape.Area);//也是隻有一個public成員能夠被訪問
}
}
class Square : Shape
{
public Square()
{
A1 a1 = new A1();
//hobby是internal型別在本程式集中都可以訪問;Name是public,在任何地方都可以被訪問到
Console.WriteLine(a1.hobby+""+a1.Name);
//由於Height、Width是protected,所以在Shape的派生類中,可以訪問到這兩個程式
Console.WriteLine(Height + "" + Width + "" + Area);
}
}
}
通過圖例來理解一下成員訪問修飾符
我們還可以通過一個表格來總結一下,成員訪問修飾符的範圍:
以上便是對類的訪問控制和類成員訪問控制修飾符的一個總結;記錄下來以便以後查閱。