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