Namespaces

11 February 2016

namespace คืออะไร

ในภาษา C# เนมสเปซ (namespace) นั้นเป็นเซตของเมธอดและคลาส ที่ใช้ในการจัดการสิ่งเหล่านี้ให้เป็นกลุ่ม หรือเป็นการรวบรวมของออบเจ็ค มันเป็นแนวคิดแบบนามธรรมที่ใช้ในการกำหนดขอบเขตของออบเจ็คภายในโปรแกรม

Namespaces นั้นจะมีประโยชน์ในการป้องกันชื่อของคลาสที่ซ้ำกัน หรือว่าการนำคลาสนั้นกลับมาใช้โดยมีชื่อเดียวกันกับโปรเจ็คของเรา ยกตัวอย่างเช่น บริษัท A มีคลาสที่ชื่อว่า User และเมื่อคุณนำโค้ดจากบริษัท B มาใช้ ก็มีคลาสที่ชื่อว่า User เช่นเดียวกัน นี่เรียกว่าการชนกันของชื่อและเราสามารถใช้ namespace ในการแก้ไขปัญหานี้ได้ มันมีต้นกำเนิดแนวคิดมาจากพาธไฟล์ของคอมพิวเตอร์ ดังนั้น namespace จึงสามารถที่จะซ้อนกันเป็นลำดับเหมือนกับโฟล์เดอร์นั่นเอง

การสร้าง namespaces

ในการประกาศ namespace ในภาษา C# คุณต้องทำตามรูปแบบของการสร้างข้างล่างนี้

namespace Indentifier {
    // namespace members
}

และอีกรูปแบบหนึ่งในกรณีที่ namespace นั้นซ้อนกัน

namespace Indentifier {
    namespace SubIndentifier1 {
        // namespace members
    }
    // namespace members
}

โดยคำสั่ง namespace จะใช้เพื่อสร้าง namespace และ Identifier นั้นสำหรับเป็นชื่อให้กับ namespace ที่สร้างขึ้น การตั้งชื่อให้กับ namespace มีกฏเหมือนกันกับการตั้งชื่อตัวแปรและเมธอด และมักจะเริ่มต้นด้วยตัวพิมพ์ใหญ่ในบล็อคคำสั่งของ namespace นั้นเป็นที่ที่จะประกาศสมาชิกของมัน โดยสมาชิกสามารถเป็นคลาสหรือ namespace อื่น

มาดูตัวอย่างของการสร้าง namespace ในภาษา C#

namespace CompanyA {
    class User
    {
        string firstName;
        string lastName;
        public User(string fn, string ln)
        {
            firstName = fn;
            lastName = ln;
        }
        public string GetName() {
            return firstName + " " + lastName;
        }
    }
}

ในตัวอย่างด้านบน เราได้สร้าง namespace CompanyA โดยมีคลาส User เป็นสมาชิก ถ้าคุณยังไม่เข้าใจเกี่ยวกับคล่าในตอนนี้ ไม่ต้องกังวลเพราะคุณจะได้เรียนในบทต่อไป

การใช้และการเข้าถึง namespaces

เมื่อ namespace ได้ถูกสร้างขึ้น คุณสามารถที่จะใช้งานมันได้ 2 วิธีในภาษา C# แบบแรกเป็นการใช้โดยตรงโดยการเติม prefix ซึ่งเป็นชื่อของ namespace ข้างหน้าออบเจ็ค แบบที่สอง คือใช้คำสั่ง using เพื่อนำเข้า namespace มายังพื้นที่การเขียนโปรแกรมปัจจุบัน

การใช้ namespace โดยตรง

นี่เป็นวิธีที่ง่ายและตรงไปตรงมาในการใช้ Namespace ที่สร้างขึ้น โปรแกรมข้างล่างนี้เป็นตัวอย่า งของการเรียกใช้ namespace

using System;

namespace Namespaces
{
    class Program
    {
        static void Main(string[] args)
        {
            CompanyA.User a = new CompanyA.User("Mateo", "Marcus");
            Console.WriteLine(a.GetName());

            Console.ReadLine();
        }
    }
}

namespace CompanyA {
    class User
    {
        string firstName;
        string lastName;
        public User(string fn, string ln)
        {
            firstName = fn;
            lastName = ln;
        }
        public string GetName() {
            return firstName + " " + lastName;
        }
    }
}

เราได้ใช้ namespace CompanyA ที่เราได้สร้างขึ้นในตัวอย่างก่อนหน้า โดยการเข้าถึงคลาส User ภายใน namespace นี้เราจะใช้ CompanyA.User ที่เข้าถึงคลาสที่เราต้องการโดยตรง

การใช้คำสั่ง using

ในบางครั้งมันอาจจะไม่สะดวกที่จะใช้วิธี prefix ถ้าเรามีออบเจ็คเป็นจำนวนมากที่ต้องการเข้าถึงใน namespace หรือมันเป็น namespace ที่ซ้อนกันหลายชั้น คำสั่ง using สามารถออำนวยความสะดวกให้กับเราสำหรับเรื่องนี้

using System;
using CompanyA;

namespace Namespaces
{
    class Program
    {
        static void Main(string[] args)
        {
            User a = new User("Mateo", "Marcus");
            Console.WriteLine(a.GetName());

            Console.ReadLine();
        }
    }
}

namespace CompanyA {
    class User
    {
        string firstName;
        string lastName;
        public User(string fn, string ln)
        {
            firstName = fn;
            lastName = ln;
        }
        public string GetName() {
            return firstName + " " + lastName;
        }
    }
}

ในตัวอย่างด้านบน เราได้ใช้คำสั่ง using CompanyA เพื่อนำเข้า namespace เข้ามายังพื้นที่การเขียนโปรแกรมปัจจุบันของเรา ดังนั้น เราสามารถใช้ User โดยไม่จำเป็นต้องมี prefix ด้วย CompanyA อีกต่อไป

Namespace Aliases

มันเป็นไปได้ที่บางออบเจ็คใน namespace อาจจะมีชื่อที่เหมือนกัน ในการที่จะป้องกันปัญหาเมื่อตอนนำมาใช้งานกับโปรแกรม วิธีแรกที่เราสามารถทำได้คือการใช้ prefix อย่างที่ได้กล่าวไปก่อนนี้แล้ว แต่ในตอนนี้ เราจะใช้ namespace aliases ซึ่งก็คือการตั้งชื่อเสมือนให้กับ namespace โดยการเปลี่ยนชื่อของ namespace ที่ต้องการให้เป็นอย่างอื่นเพื่อใช้ในโปรแกรม มาดูตัวอย่างของการใช้งาน namespace aliases

using System;
using NX = CompanyA.User;
using NY = CompanyB.User;

namespace Namespaces
{
    class Program
    {
        static void Main(string[] args)
        {
            NX a = new NX("Mateo", "Marcus");
            NY b = new NY("Mateo", "Marcus");

            Console.WriteLine(a.GetName());
            Console.WriteLine(b.GetName());

            Console.ReadLine();
        }
    }
}

namespace CompanyA {
    class User
    {
        string firstName;
        string lastName;
        public User(string fn, string ln)
        {
            firstName = fn;
            lastName = ln;
        }
        public string GetName() {
            return firstName + " " + lastName;
        }
    }
}

namespace CompanyB {
    class User
    {
        string firstName;
        string lastName;
        public User(string fn, string ln) {
            firstName = fn;
            lastName = ln;
        }
        public string GetName()
        {
            return lastName + " " + firstName;
        }
    }
}

ในตัวอย่างเรามี namespace CompanyA และ CompanyB ซึ่ง namespace ทั้งสองนั้นต่างก็มีคล่าที่ชื่อ User เป็นสมาชิกเหมือนกัน ดังนั้น คำสั่ง using NX = CompanyA.User นั้นเพื่อทำการเปลี่ยน CompanyA.User ให้เป็น NX และคำสั่ง using NY = CompanyB.User เปลี่ยนให้เป็น NY ตามลำดับ ตอนนี้คุณลองพิจารณาโค้ดข้างล่างนี้


NX a = new NX("Mateo", "Marcus"); NY b = new NY("Mateo", "Marcus"); // are equivalent to CompanyA.User a = new CompanyA.User("Mateo", "Marcus"); CompanyB.User b = new CompanyB.User("Mateo", "Marcus");

ทั้งสองวิธีการนั้นจะให้ผลลัพธ์ที่เท่ากัน ผลลัพธ์ของการใช้ namespace alias สามารถทำให้เราเขียนโค้ดที่สั้นลงและเรียกใช้ namespace ได้รวดเร็วขึ้นโดยการตั้งชื่อใหม่ให้กับมัน

และนี่เป็นผลลัพธ์เมื่อเราได้ทำการรันโปรแกรม

Mateo Marcus
Marcus Mateo

จากผลัพธ์ ถึงแม้ว่าจะเป็นคล่าเดียวกันและเรียกใช้เมธอดเหมือนกัน แต่ว่า GetName ในแต่ละคลาสนั้นทำงานแตกต่างกัน

Nested namespaces

Namespace สามารถที่จะซ้อนกันกี่ระดับก็ได้ตามที่คุณต้องการ จากตัวอย่างโค้ดข้างล่างนี้

namespace A {
    namespace B {
        namespace C {
            // ...
        }
    }
    namespace B1 {
        // ...
    }
}

ในบทนี้ คุณได้เรียนเกี่ยวกับ namespace และรู้วิธีการสร้างและใช้มันเมื่อต้องการ และในบทนี้ คุณได้เห็นเกี่ยวกับคลาสและออบเจ็ค ซึ่งเป็นเรื่องสำคัญที่คุณจะได้เรียนในบทต่อไป

บทความนี้เป็นประโยชน์หรือไม่? Yes · No