C# Namespace

posted on 22 Nov 2004 20:04 by tidno1 in csharp-and-dotnet

จริง ๆ วันนี้กะจะเขียนเรื่อง property และ indexer แต่ยังเรียบเรียงความคิดเพื่อเขียนให้อ่านรู้เรื่องไม่ได้ วันนี้จึงขอลัดคิวเอาเรื่องง่าย ๆ อย่าง Namespace ก่อนละกัน

ในอดีตนั้นการเขียนโปรแกรมยุค basic รุ่งเรื่องนั้นการเขียน code เป็นแบบสปาเกตตี้ จนมีแนวคิดเรื่อง Top Down Programming มีการมองโปรแกรมเป็นส่วนๆ มีการรวมก้อนของ code ที่ใช้งานซ้ำ ๆ กันเป็น function

พอมาถึงยุคของ Bottom Up Programming หรือ OOP (ก่อนหน้านั้น Bottom Up Programming ถือว่าเป็นการคิดที่กลับหัวกลับหาง และน่าเกลียดรุนแรงมาก ถึงขนาดที่มีคนพูดไว้เลยว่า Bottom Up Programmingก็คือการที่ design ประตูรถยนต์ก่อน แล้วจึงค่อยสร้างรถให้มีรูปร่างเข้ากันกับประตู) เราก็มีการนำฟังก์ชันที่ใช้งานบ่อย ๆ มารวมกันเป็น class (ความจริงก็ไม่ตรงนักหรอก แต่จะเปรียบเทียบให้เห็น)

พอมาซักระยะนึงก็เกิดปัญหาตรงที่ว่ามีการตั้งชื่อคลาสซ้ำกันมากมาย(อย่างเช่น gui ก็จะมีคลาส button ของหลาย ๆ เจ้า) จึงได้เกิดแนวคิดที่เรียกว่า Namespace ขึ้นเป็นการจับกลุ่มของคลาส(หรือกลุ่มของnamespace)เช่น

namespace System{
class Console{
void WriteLine(){...}
....
}
}

namespace MyCompany{
class Console{
void WriteLine(){...}
....
}
}

เวลาเราจะใช้ก็ระบุด้วย '.' (จุด) หรือ '::' (ใน c++)

เช่น System.Console.WriteLine("Hello, World");
หรือจะย่อชื่อด้วย keyword using
using System;
เวลาจะใช้ก็เหลือแค่
Console.WriteLine("Hello, World");
คราวนี้จะเกิดปัญหาขึ้นเมื่อเราใช้ namespace สองอันที่มี function ชื่อเดียวกัน

using System;
using MyCompany;

แล้วเวลาเราใช้ Console.WriteLine ก็จะใช้ไม่ได้เพราะมันไม่รู้จะใช้ namespace ไหนถ้าเราจะใช้เราก็ต้องใช้เต็ม ๆ เป็น
System.Console.WriteLine("Hello, World");
MyCompany.Console.WriteLine("Hello, World");

แล้วถ้าต้องพิมพ์อย่างนี้ไปทั้งโปรแกรม แล้วถ้าชื่อ namespace ยาว ๆ หรือซ้อนกันหลาย ๆ ชั้น
อย่างเช่น การสร้างปุ่มใน gui เรามีคลาส Button มาจากสองบริษัท

Exteen.Cpe16.Champ.Button กับ Microsoft.System.Form.Button

เราคงไม่อยากพิมพ์อย่างนี้ทั้งโปรแกรมแน่ ๆ แต่เรามีทางออกนั่นก็คือการใช้ alias พระเอกของวันนี้(เขียนมาตั้งนาน จะโชว์แค่เรื่องเดียวอะแหละ)
using Exteen.Cpe16.Champ = ET;
using Microsoft.System.Form = MS;

ET.Button b1 = new ET.Button();
MS.Button b2 = new MS.Button();

เขียนไปมาชักมัน คราวหน้ากะจะหาเรื่อง OOP มาลงบ้าง ไม่รู้จะเขียนได้แค่ไหนเหมือนกัน

Comment

Comment:

Tweet

ขอบคุณครับ  ลืมหมดแล้ว  ได้อ่านทวน  นึกออกมาขึ้นได้เยอะ  เห็นภาพชัดดี

#2 By Ej!4h (103.7.57.18|58.8.70.233) on 2012-07-04 06:05

เป็นประโยชน์มากครับ ขอบคุณbig smile

#1 By Emarald (203.188.44.65) on 2008-09-03 09:57