URLhttps://learnscript.net/zh-hant/programming/data/namespaces-and-scope/
    複製連結移至說明  範例

    命名空間,有效範圍介紹

    閱讀 5:16·字數 1581·發佈 
    Youtube 頻道
    訂閱 375

    命名空間

    命名空間是一種識別碼的管理方案,這些識別碼被用於任何可能的實體,比如,變數,函式,類別等。同一識別碼在不同的命名空間中,其指向的目標和表示的含義是互不幹擾的。

    為何需要命名空間?

    大型專案會用到眾多的變數,函式等實體,當他們的含義接近時,采用相同的識別碼將是合理的,而命名空間可以消除相同識別碼之間的沖突。

    巢狀命名空間

    命名空間可以呈現為一種巢狀或樹狀結構,一個命名空間可被包含在另一個命名空間中,並具有自己的識別碼。

    什麽是完整名稱?

    在巢狀命名空間中,完整名稱是指一個識別碼從根命名空間開始計算的路徑,由於他是完整的,因此只要給出完整名稱,就可以定位到相關的識別碼,無論目前所處的命名空間是哪一個。

    什麽是巢狀型別?

    如果在某個型別所在的命名空間中定義另一個型別,那麽被定義的型別就是巢狀型別。

    在下面的 C# 程式碼中,列舉FlowerColor是巢狀型別,他被定義在類別Flower中。

    namespaces_and_scope.cs
    // 類別 Flower,表示一朵花
    class Flower
    {
    	// 巢狀型別 Color
    	enum Color
    	{
    		// 沒有色彩
    		None = 0,
    		// 紅色
    		Red = 1,
    		// 白色
    		White = 2,
    		// 藍色
    		Blue = 3,
    	}
    
    // 欄位 Color,表示花的色彩,隨機產生 private Color color = (Color)new Random().Next(1, 4); // … }

    明確命名空間

    要定義明確命名空間,一般需要使用特定的關鍵字,並給出命名空間的完整名稱,或相對於目前命名空間的路徑,名稱。

    在下面的 C# 程式碼中,我們明確定義了命名空間World.Animals,他包含了類別Lion

    namespaces_and_scope.cs
    // 命名空間 World.Animals
    namespace World.Animals
    {
    	// 類別 Lion,表示獅子
    	class Lion { }
    }

    隱含命名空間

    隱含命名空間的定義一般由語言自動完成,通常會依據程式碼檔案的名稱和路徑,或某些實體來建置。常見的一種情況是函式,每個函式都擁有自己的命名空間,因此你可以在函式內定義與函式外變數同名的變數。

    模組,套件

    模組和套件都具有命名空間的效果,他們可以用於區別功能不同的程式碼。一般情況下,模組是比套件更小的單位,但一些語言可能會做出相反的處理。模組通常會包含變數,函式,類別等實體,而套件通常是多個模組的集合。在使用模組或套件之前,需要進行相應的匯入操作。

    下面的 Node.js 模組stat,包含了統計學校總人數的函式getPeopleCount,以及表示學生和教師數量的變數studentCountteacherCount

    school/stat.js
    // 模組 stat
    // 學生的數量
    exports.studentCount
    // 教師的數量
    exports.teacherCount
    
    // 統計學校內的總人數 exports.getPeopleCount = function () { return exports.studentCount + exports.teacherCount }

    在匯入模組stat後,我們使用了相關的變數和函式。

    namespaces_and_scope.js
    // 匯入模組 stat
    const stat = require('./school/stat')
    
    // 設定學校人數 stat.studentCount = 100 stat.teacherCount = 10
    // 呼叫模組的 getPeopleCount 函式,取得學校內的總人數 console.log(`學校內的總人數為:${stat.getPeopleCount()}`)
    學校內的總人數為:110

    有效範圍

    有效範圍是指識別碼的有效作用範圍,在該範圍內,識別碼是可以被識別的。在命名空間系統中,一個識別碼的有效範圍不僅限於其所在的命名空間,還包括包含在該命名空間中的命名空間。在這樣的規則下,根命名空間中的識別碼具有全域效果,可以被其他命名空間識別,比如,全域變數,全域函式。

    當某個識別碼在目前命名空間中不存在時,一般會在樹狀結構中逐步向根命名空間搜尋,直到該識別碼在某個命名空間中被找到,或以類似於「未定義」的警告結束。

    下面的 C# 函式sum會進行加法計算,計算結果被儲存至函式外的total變數。

    *.cs
    // 變數 total,用於儲存計算結果
    int total = 0;
    // 函式 sum,進行加法計算
    void sum(int num)
    {
    	// 函式內可以存取函式外的變數 total
    	total += num;
    }
    
    // 呼叫 sum sum(7); sum(9); Console.WriteLine($"結果為:{total}");
    結果為:16

    原始碼

    namespaces_and_scope.cs·codebeatme/programming·GitHub
    school/stat.js·codebeatme/programming·GitHub
    namespaces_and_scope.js·codebeatme/programming·GitHub