1. 程式人生 > 實用技巧 >C#:類的訪問修飾符和類成員的訪問修飾符

C#:類的訪問修飾符和類成員的訪問修飾符

關於類的訪問修飾符常見的有兩個:公開的(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);
        }
    }
}

通過圖例來理解一下成員訪問修飾符

我們還可以通過一個表格來總結一下,成員訪問修飾符的範圍:

以上便是對類的訪問控制和類成員訪問控制修飾符的一個總結;記錄下來以便以後查閱。