Namespace ใน C#
Namespace ใช้จัดระเบียบโค้ดให้เป็นกลุ่ม ตัดกันไม่ให้ชื่อคลาส/โครงสร้างชนิดเดียวกันชนกัน (Name collision) และช่วยให้ค้นหาและใช้งานโค้ดง่ายขึ้น
ไวยากรณ์พื้นฐาน
namespace NamespaceName
{
// ประกาศคลาส โครงสร้าง อินเทอร์เฟซ ฯลฯ
public class MyClass { }
}
ตัวอย่างโค้ดสมบูรณ์
using System;
namespace FirstSpace
{
class NamespaceClass
{
public void Func()
{
Console.WriteLine("อยู่ใน FirstSpace");
}
}
}
namespace SecondSpace
{
class NamespaceClass
{
public void Func()
{
Console.WriteLine("อยู่ใน SecondSpace");
}
}
}
class TestClass
{
static void Main(string[] args)
{
// ใช้ชื่อเต็ม (Fully qualified name)
FirstSpace.NamespaceClass fc = new FirstSpace.NamespaceClass();
SecondSpace.NamespaceClass sc = new SecondSpace.NamespaceClass();
fc.Func();
sc.Func();
Console.ReadKey();
}
}
ผลลัพธ์
อยู่ใน FirstSpace
อยู่ใน SecondSpace
การใช้งาน Namespace
1. using Directive (นำเข้า namespace)
using System; // นำเข้า namespace ทั้งหมด
using SysIO = System.IO; // Alias สำหรับชื่อยาวหรือชนกัน
2. Nested Namespaces
namespace Company.Project.Module
{
public class MyClass { }
}
// หรือ
namespace Company
{
namespace Project
{
namespace Module { }
}
}
3. File-scoped Namespaces (C# 10+)
// ไฟล์ทั้งไฟล์อยู่ใน namespace นี้ (ลด indentation)
namespace MyProject.Models;
public class User { }
public class Product { }
4. Global Using (C# 10+)
// ในไฟล์ GlobalUsings.cs หรือ .csproj
global using System;
global using System.Collections.Generic;
// ใช้ได้ทั่วโปรเจกต์โดยไม่ต้อง using ทุกไฟล์
แนวทางปฏิบัติที่ดี
- ใช้ PascalCase สำหรับชื่อ namespace (เช่น
MyCompany.MyProduct) - จัดกลุ่มตามฟังก์ชันหรือเลเยอร์ (Models, Services, Controllers)
- หลีกเลี่ยงชื่อที่ชนกับ .NET built-in namespaces
- ใช้ file-scoped namespace สำหรับไฟล์ที่มี namespace เดียว (C# 10+)
- พิจารณา global using สำหรับ namespace ที่ใช้บ่อยในโปรเจกต์
การเข้าถึงคลาสใน namespace อื่น
// 1. Fully qualified name
var obj = new MyCompany.MyProject.Services.UserService();
// 2. using directive (ด้านบนไฟล์)
using MyCompany.MyProject.Services;
var obj = new UserService();
// 3. using alias (แก้ชื่อชนกัน)
using Svc = MyCompany.MyProject.Services;
var obj = new Svc.UserService();