ทั้ง Namespace (C#) และ Package (Java) ใช้เพื่อจัดกลุ่มโค้ด ป้องกันชื่อชนกัน (Naming Conflict) และจัดการ Visibility แต่มีรายละเอียดที่ต่างกัน
Package ใน Java
- ประกาศด้านบนสุดไฟล์:
package com.example.project; - โครงสร้างไดเรกทอรี ต้องตรงกับ Package Structure
- หนึ่งไฟล์ = หนึ่ง Package
- ควบคุม Access ได้:
package-private(default) จำกัดใน Package เดียวกัน
Namespace ใน C#
- ประกาศด้วย Block:
namespace MyProject { ... } - โครงสร้างโฟลเดอร์ ไม่ต้องตรงกับ Namespace
- หนึ่งไฟล์ สามารถมีหลาย Namespace ได้
- ไม่มี Access Modifier เหมือน package-private (ใช้
internalสำหรับ Assembly-level)
ตัวอย่าง Syntax
Java Package
package com.company.project.module;
public class MyClass { ... }
C# Namespace
namespace MyCompany.Project.Module
{
public class MyClass { ... }
}
// หรือ File-scoped namespace (C# 10+)
namespace MyCompany.Project.Module;
public class MyClass { ... }
ตารางเปรียบเทียบ
| คุณสมบัติ | Java Package | C# Namespace |
|---|---|---|
| Syntax | package name; | namespace name { } |
| Directory Mapping | บังคับ ต้องตรงกัน | ไม่บังคับ (แนะนำให้ตรงเพื่อความสวยงาม) |
| Multiple per File | ไม่ได้ (1 file = 1 package) | ได้ (หลาย namespace ในไฟล์เดียว) |
| Access Control | มี package-private (default) | ไม่มี (ใช้ internal สำหรับ assembly) |
| Nested | ไม่ได้ | ได้ (namespace ใน namespace) |
C# internal vs Java package-private
internal ใน C# จำกัดการเข้าถึงใน Assembly เดียวกัน (DLL/EXE เดียว) ไม่ใช่ Namespace