ตอน 9 : เรื่องของ managed code


ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

เว็บไซต์นี้เป็นตัวอย่างเนื้อหาบางตอนในหนังสือ "เรียนรู้ด้วยตนเอง OOP C# ASP.NET" ครอบคลุม บทที่ 1 ถึงบทที่ 6 (ในหนังสือมี 21 บท) เนื้อหาใน Blog อาจอาจแตกต่างจากในหนังสือเพราะเป็นเนื้อหาที่ยังไม่ได้ตรวจแก้ขัดเกลา (edit)

กดที่นี่เพื่อดูรายละเอียดเนื้อหาในแต่ละบท

กดที่นี่เพื่อไปยังเว็บบอร์ด ถาม-ตอบ 

 

 

เรื่องของ managed code

 

หากท่านสร้างโปรแกรมด้วยเครื่องมือที่ไม่ใช่ .NET ผลลัพธ์ที่ได้จะเป็นโค้ดภาษาเครื่อง (native machine code) อยู่ในรูปของไฟล์ .exe หรือ .dll ที่เก็บข้อมูลเป็น binary (อ่านว่าไบนารี แปลว่าเลขฐานสอง) ซึ่งวินโดวส์สามารถนำไปดำเนินการได้โดยตรง วินโดวส์ (ระบบปฏิบัติการ) จะทำหน้าที่เรียกให้โปรแกรมทำงาน จัดสรรหน่วยความจำ แต่จะไม่รับรู้การทำงานของโปรแกรม และไม่รับประกันสิ่งผิดพลาดที่อาจเกิดขึ้น (เช่นโปรแกรมอ้างถึง array element ที่เกินขอบเขต) โปรแกรมลักษณะนี้ไม่ใช่ managed code (เรียก unmanaged code)

เมื่อท่านสร้างโปรแกรมด้วยเครื่องมือที่เป็น MNF ผลลัพธ์ที่ได้จะเป็นโค้ดภาษากลาง (Microsoft Immediate language หรือ MSIL) อยู่ในรูปของไฟล์ .exe หรือ .dll ที่เก็บข้อมูลเป็น binary เช่นเดียวกัน แต่วินโดวส์ไม่สามารถนำไปดำเนินการได้ MNF จะทำหน้าที่เรียกให้โปรแกรมทำงาน จัดสรรหน่วยความจำ สร้างและทำลาย object ในโปรแกรม MNF จะรับรู้การทำงานของโปรแกรมตลอดเวลา และจะแจ้งเตือนเมื่อมีสิ่งผิดพลาดเกิดขึ้น (เช่นโปรแกรมอ้างถึง array element ที่เกินขอบเขต) โปรแกรมลักษณะนี้คือ managed code

 

ภาพ 204: Java Runtime Environment

 

หลักการเช่นนี้คล้ายภาษา Java โดยตัวแปลภาษา Java จะผลิตผลลัพธ์เป็น ไบต์โค้ด (byte code) ซึ่งทำงานได้กับคอมพิวเตอร์ทุกชนิด (platform) ที่ติดตั้งโปรแกรม J2SE Runtime Environment ไว้

managed code แปลว่าโค้ดที่ถูกจัดการ หมายถึงโปรแกรมที่เราเขียนได้รับการดูแลจัดการ ไม่ได้ถูกปล่อยให้ทำงานไปโดยขาดการควบคุมอย่าง unmanaged code ผู้ทำหน้าที่ดูแลจัดการดังกล่าวนี้คือส่วน CLR ของ MNF นั่นเอง

 

เรื่องของ CLR

CLR หรือ Common Language Runtime คือส่วนประกอบสำคัญอย่างหนึ่งของ MNF หน้าที่ของ CLR มีดังต่อไปนี้

  • แปลโปรแกรมประยุกต์จากภาษา MSIL ให้เป็นรหัสภาษาเครื่อง
  • เรียกให้รหัสภาษาเครื่องที่แปลแล้วทำงาน
  • จัดสรรหน่วยความจำ
  • รับประกันความถูกต้องของ type (type safety)
  • ดูแลด้านความปลอดภัยของโค้ดที่ทำงาน
  • จัดให้มีการแจ้งเตือนความผิดพลาดแบบ runtime error
  • สนับสนุนการทำงานหลายกระบวนการ (multi-thread)
  • สนับสนุนการแก้ไขโปรแกรม (debug)

 

ภาพ 205: CLR มีองค์ประกอบทั้งหมด 11 ส่วน

 

  1. CLR มีองค์ประกอบทั้งหมด 11 ส่วนดังต่อไปนี้
  2. ทำหน้าที่โหลดคลาสเข้าสู่ CLR
  3. ทำหน้าที่แปลภาษา MSIL เป็นภาษาเครื่อง
  4. ทำหน้าที่บริหารโค้ดระหว่างการทำงาน
  5. ทำหน้าที่จัดสรรหน่วยความจำและ Garbage collection
  6. ตัวจัดการด้านการแก้ไขโปรแกรม
  7. ตัวตรวจสอบความเข้ากันของ type
  8. ตัวตรวจสอบความปลอดภัย
  9. ตัวแจ้งเตือนเมื่อเกิดความผิดพลาด
  10. ตัวทำให้โปรแกรมประยุกต์แลกเปลี่ยนข้อมูลกับโปรแกรมแบบ COM ได้
  11. ตัวสนับสนุนการทำงานหลายกระบวนการ
  12. ตัวทำให้โปรแกรมประยุกต์สามารถเรียกใช้ type ต่างๆ ของ MNF ได้

 

ในเรื่อง CLR มีคำจาร์กอนหลายคำที่ท่านควรรู้ความหมาย คือ PE, assembly, JIT, Garbage collector, metadata, native code และ MSIL ผู้เขียนจะอธิบายความหมายโดยย่อของแต่ละคำดังต่อไปนี้

  • PE ย่อจาก Portable Executable หมายถึงไฟล์ที่ได้จากการคอมไพล์ภาษา MNF เช่นภาษา C# ให้เป็นภาษา MSIL แล้ว
  • assembly ในหนึ่งงานอาจได้ผลลัพธ์เป็น PE หลายๆ ไฟล์ ทั้งหมดเรียกรวมกันว่า assembly
  • JIT ย่อจาก Just In Time คือการแปลภาษา MSIL ให้เป็นภาษาเครื่องขณะ runtime โดยโปรแกรมจะถูกแปลเฉพาะส่วนที่กำลังทำงานเป็นส่วนๆ ไป
  • Garbage collector การรวบรวม object ในหน่วยความจำที่ไม่ใช้แล้วมาทำลายเพื่อพื้นฟูพื้นที่ว่างในหน่วยความจำ
  • metadata เกิดจากสองคำคือคำว่า meta หมายถึง “เหนือ” และ data คือข้อมูล ในที่นี้หมายถึง “ข้อมูลที่ใช้พรรณนาข้อมูลอื่น” CLR ใช้ metadata เพื่อรับรู้ลักษณะของ type หนึ่งๆ และลักษณะที่ type นั้นอ้างอิงถึง type อื่นๆ
  • native code หมายถึงโค้ดที่ถูกแปลเป็นภาษาเครื่องแล้ว (คือภาษาที่จำเพาะเจาะจงให้ทำงานกับ CPU ตระกูลใดตระกูลหนึ่ง)
  • MSIL ย่อจาก MicroSoft Immediate Language คือภาษาใหม่ที่บริษัท Microsoft ประดิษฐ์ขึ้นเพื่อเป็นภาษาระดับกลางใน MNF ตัวแปลภาษาระดับสูง (VB.NET, C#, J#) ทุกภาษาจะแปลโค้ดโปรแกรมประยุกต์ที่เขียนด้วยภาษาระดับสูงให้เป็นภาษา MSIL จากนั้น CLR จะแปลเป็น native code ขณะโปรแกรมประยุกต์ทำงานอีกครั้งหนึ่ง

 

ภาพ 206: โดยใช้ JIT ทำให้ CLR สามารถตรวจพบความผิดพลาดที่เกิดขึ้นขณะโปรแกรมทำงานได้ (runtime error) เช่นการเรียกใช้พอร์ทสื่อสารที่ไม่มีหรือไม่ว่าง

 

การจัดสรรหน่วยความจำ

สถาปัตยกรรม .NET Framework นอกจากจะมีส่วนที่เป็นคลาสไลบรารีแล้ว ยังมีส่วนสำคัญมากอีกส่วนหนึ่งชื่อ Common language runtime หรือเรียกย่อๆ ว่า CLR ทำหน้าที่โหลด (load) โค้ดโปรแกรมที่คอมไพล์แล้วของเรา (อยู่ในสภาพของภาษา intermediate language หรือ MSIL คือภาษาระดับกลาง) มาคอมไพล์ซ้ำอีกครั้งให้กลายเป็น native code หรือ machine code ที่ซีพียูสามารถนำไปปฏิบัติได้

นอกจากมีหน้าที่คอมไพล์แบบ runtime แล้ว CLR ยังมีหน้าที่จัดสรรหน่วยความจำด้วย เมื่อ object ถูกสร้างขึ้นจากคลาส CLR จะทำหน้าที่จัดสรรหน่วยความจำให้โดยอัตโนมัติ นั่นหมายความว่าโปรแกรมเมอร์ไม่ต้องทำหน้าที่จองและปลดปล่อยหน่วยความจำหน่วยความจำด้วยตนเอง

เมื่อเราสร้าง object CLR จะจองหน่วยความจำให้เรา และเมื่อ object จบบทบาทลงกลไกของ .NET Framework อีกตัวหนึ่งมีชื่อว่า garbage collector (คนเก็บขยะ) จะทำหน้าที่ “เวนคืน” พื้นของหน่วยความจำบริเวณนั้น ทำให้หน่วยความจำเป็นอิสระเพื่อให้ CLR จะนำไปใช้จัดสรรให้ object อื่นๆ ที่ถูกสร้างขึ้นใหม่ต่อไป

CLR จะแบ่งหน่วยความจำ (RAM) ในเครื่องคอมพิวเตอร์ออกเป็นสองส่วนคือ stack (อ่านว่า สแตก) และ heap (อ่านว่า ฮีพ) โดยจะใช้ stack เพื่อเก็บสิ่งที่มีพลวัตสูง เช่น ลำดับของกระบวนการในคำสั่ง (อย่างการ call ไปยังเมธอด) และข้อมูลที่ต้องการเข้าถึงตามลำดับก่อนหลัง ส่วน heap จะถูกใช้เพื่อเก็บส่วนข้อมูลสมาชิกของ object ทั้ง stack และ heap เป็นโครงสร้างข้อมูล (data structure) ปรกติธรรมดาที่ท่านคงเคยเรียนมาแล้วในวิชาเขียนโปรแกรมขั้นพื้นฐาน หากท่านลืมหมดแล้วก็ไม่เป็นไร เพราะผู้เขียนจะทบทวนความจำให้

 

เรื่องของ stack

โปรแกรมเมอร์บางคนได้ยินคำว่า stack แล้วรู้สึกวิงเวียนคล้ายจะเป็นลม เพราะคิดว่าเป็นเรื่องสูงส่งที่มีแต่โปรแกรมเมอร์ที่องค์การนาสาเท่านั้นที่บังอาจเข้าใจได้ ไม่จริงเลย อันที่จริง stack มีหลักการง่ายๆ ที่แม้แต่พนักงานล้างจานก็เข้าใจได้ดี

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

การเก็บข้อมูลใน stack ก็เช่นเดียวกัน ข้อมูลที่ถูกนำมาไว้ใน stack ก่อน จะลงไปอยู่ล่างสุดของ stack ข้อมูลใหม่จะถูกนำไปซ้อนไว้เหนืออันแรก และซ้อนกันไปเรื่อยเช่นนี้ ดังนั้นข้อมูลที่เข้าไปใน stack ก่อนจะออกไม่ได้ จนกว่าข้อมูลที่อยู่เหนือมันถูกนำออกไปหมดแล้ว เราจึงต้องนำข้อมูลที่ใส่เข้าไปภายหลังออกมาให้หมดเสียก่อน หลักการเช่นนี้เรียกว่า “เข้าก่อนออกที่หลัง” (first in, last out หรือเรียกย่อว่า LIFO ไลโฟ)

 

ภาพ 207 โครงสร้างข้อมูลแบบ stack ใน .NET Framework มีลักษณะเหมือน stack ธรรมดา โดยด้านล่างของ stack คือตำแหน่ง 0 (Loc 0) ตำแหน่งบนสุด (stack top) คือตำแหน่งที่ถัดจากข้อมูลใน stack เมื่อข้อมูลถูกนำมาเก็บใน stack ข้อมูลที่มาอันแรกจะถูกเก็บที่ตำแหน่ง 0 ข้อมูลต่อไปจะถูกเก็บที่ตำแหน่ง 1 ไล่เรียงไปเช่นนี้ และค่าของ stack pointer (ตัวชี้ตำแหน่งยอดของ stack) ก็จะถูกเพิ่มค่าขึ้นทุกครั้ง

 

เมื่อโปรแกรมเรียกเมธอด โค้ดในเมธอดจะถูก CLR นำมาใส่ไว้ใน stack (push) ที่ตำแหน่งบนสุดจากนั้นพารามิเตอร์ของเมธอดจะถูกมาซ้อนไว้ข้างบน และแปรท้องถิ่นภายในเมธอดจะถูกนำไปซ้อนไว้ในตำแหน่งที่สูงขึ้นไปอีก

เมื่อข้อมูลถูกเรียกออกจาก stack ข้อมูลบนสุดของ stack จะถูกดึงออกไป (pop) ก่อนและ stack pointer จะถูกลดค่าลงเพื่อชี้ไปยังข้อมูลตัวถัดไปใน stack

เมื่อโปรแกรมของเราเรียกการทำงานไปยังเมธอด โค้ดในเมธอดจะถูก CLR นำมาซ้อนไว้บน stack ตามด้วยพารามิเตอร์ของเมธอด ขณะที่โปรแกรมทำงานตามคำสั่งต่างๆ ในเมธอด และพบกับตัวแปรท้องถิ่นภายในเมธอด CLR จะนำค่าของตัวแปรขึ้นไปซ้อนไว้บนยอดของ stack อีกชั้นหนึ่ง

 

เรื่องของ heap

เมื่อโปรแกรมของเราเริ่มทำงาน CLR จะจองเนื้อที่ในหน่วยความจำ (RAM บนเมนบอร์ด) เป็นพื้นที่ต่อเนื่องไว้ส่วนหนึ่ง โดยยังไม่ตกลงใจว่าจะใช้เก็บอะไร พื้นที่ดังกล่าวนี้เรียกว่า managed heap หรือ heap เมื่อมีการ “นิว” (การใช้ operator new เพื่อสร้างอินสแตนซ์ของคลาส) CLR จึงจะจัดสรรพื้นที่ใน heap เพื่อเก็บสมาชิกทั้งหลายของ object และกำหนด pointer เพื่อชี้ไปยังพื้นที่ว่างถัดไป หากมีการสร้าง object อีกก็จะมีการจัดสรรพื้นที่ใน heap อีก (และเลื่อน pointer ด้วย) ดังนั้น object ที่ถูกสร้างจากคลาสทุกตัวจะมีที่เก็บข้อมูลสมาชิกเป็นของตัวเอง

 

ภาพ 208: Heap ใน unmanaged code จะถูกสร้างจากโครงสร้างข้อมูลแบบ binary tree ที่แต่ละ node จะอยู่กระจายกันในหน่วยความจำ แต่ heap ของ managed code จะเป็นพื้นที่ติดกันทั้งหมดจึงทำงานได้เร็วกว่า

 

การทำงานที่พูดถึงในย่อหน้าบนเป็นวิธีบริหารหน่วยความจำ (manage memory) ของ MNF แต่ถ้าท่านต้องการเขียนโปรแกรมแบบไม่ให้ MNF บริหารหน่วยความจำ (unmanaged memory) ก็สามารถทำได้ ในกรณีนี้ heap จะไม่ใช่พื้นที่ต่อเนื่องกัน แต่จะเป็นพื้นที่ในหน่วยความจำตรงโน้นบ้างตรงนี้บ้าง ที่ถูกเชื่อมโยงด้วยลิงค์ลิสต์ ดังนั้นการทำงานแบบ managed จะเร็วกว่าเพราะ heap จะมีสภาพเป็นพื้นที่ต่อเนื่องกัน ส่วน unmanaged จะทำงานช้ากว่า เพราะเมื่อโปรแกรมต้องการเข้าถึงส่วนเก็บข้อมูลใดๆ มันจะต้องท่องไปในลิงค์ลิสต์จนกว่าจะพบส่วนของ heap ที่ต้องการ

 

เรื่องของ garbage collector

ในการทำงานแบบ manage memory ส่วน garbage collector (ต่อไปจะเรียกย่อๆ ว่า GC) ซึ่งเป็นกลไกอย่างหนึ่งของ MNF ที่คอยตรวจสอบรายการ object ภายใน heap อยู่เสมอ หากพบว่า object ใดไม่อยู่ในขอบเขตการใช้งานแล้ว มันจะพิจารณาว่า object นั้นเป็นขยะ (garbage)

GC จะแบ่ง object ที่ถือกำเนิดและอาศัยอยู่ใน heap ออกเป็นสามชั่วรุ่น คือ 0, 1 และ 2 โดยชั่วรุ่น 0 เป็นชั่วรุ่นที่เพิ่งเกิดใหม่ GC จะรวบรวม object ชั่วรุ่นที่ 0 ที่ไม่อยู่ในขอบเขตการใช้งานแล้วเอาไว้ และจะปรับระดับ object ที่ยังถูกใช้งานอยู่ให้เป็นชั่วรุ่นที่ 1 และ 2 ตามลำดับ เมื่อถึงเวลาที่เหมาะสม GC จะทำลาย object ที่ไม่อยู่ในขอบเขตการใช้งานแล้วในชั่วรุ่นที่ 0 เมื่อ heap ชั่วรุ่นที่ 0 เริ่มมีพื้นที่ไม่เพียงพอสำหรับการสร้าง object ใหม่ GC จะเริ่มตรวจดูชั่วรุ่นที่ 1 และ 2 ตามลำดับ เพื่อทำลาย object ที่พ้นสมัยแล้ว

 

ภาพ 209: ภาพโครงสร้างของ heap และและการทำงานของ GC

 

เรื่องของ Dispose และ Finalize

ผู้เขียนอธิบายเรื่องการบริหารหน่วยความจำของ MNF เพื่อให้ท่านเข้าใจว่า GC ทำลายเฉพาะสิ่งที่อยู่ใน heap เท่านั้น หาก object ของเราเรียกใช้ทรัพยากรอื่นๆ ที่เป็น unmanaged resort เช่น เปิดไฟล์ข้อมูล เชื่อมต่อกับฐานข้อมูล เชื่อมต่อกับเครือข่าย จองใช้พื้นที่ขนาดใหญ่ในหน่วยความจำ ฯลฯ คงจะดีหากเราปลดปล่อยทรัพยากรเหล่านี้ก่อนที่ object จะถูกทำลายโดย GC

ในกรณีที่ object ของเราสืบสันดานมาจาก object อื่น ย่อมเป็นความคิดที่ดีเช่นกัน หากเราจะปลดปล่อยทรัพยากรที่ base class เรียกใช้แต่ยังไม่ได้ปลดปล่อยด้วย

คลาสที่ใช้ทรัพยากรแบบ unmanaged resort มักมีเมธอดแบบ pubic ชื่อ Dispose อยู่ด้วย คำสั่งในเมธอดนี้เป็นคำสั่งใช้ทำหน้าที่ปลดปล่อย unmanaged resort ต่างๆ เมธอด Dispose มีไว้เพื่อให้โค้ดที่สร้าง object จากคลาสนี้สามารถปลดปล่อยทรัพยากรที่ object นั้นจองไว้ได้

ปัญหาอย่างหนึ่งของเมธอด Dispose คือผู้ใช้มักลืมเรียกเมธอดนี้ทำให้ทรัพยากรต้องค้างเติ่งอยู่หลังจาก GC ทำลาย object ไปแล้ว .NET Framework จึงจัดเตรียมกลไกอย่างหนึ่งไว้เป็นเมธอดชื่อ Finalize ทำหน้าที่เป็นเหมือนยามคอยเฝ้าระวัง หากโค้ดที่สร้าง object ลืมเรียก Dispose เพื่อปลดปล่อย unmanaged resort เมธอด Finalize จะทำหน้าที่เรียก Dispose ให้โดยอัตโนมัติ

ตั้งแต่ต้นของบทนี้จนถึงหัวข้อนี้ ท่านได้รับรู้ข้อมูลเบื้องต้นทั้งหมดเกี่ยวกับ CRL ไปแล้ว แต่ MNF ยังมีส่วนสำคัญอีกส่วนหนึ่งคือ class library ดังจะอธิบายในหัวข้อต่อไป

 

แนะนำ .NET Framework class library

ภาษา C# ไม่มี runtime library ของมันเองโดยเฉพาะต่างหาก runtime library ของภาษา C# คือ .NET Framework class library ซึ่งมันใช้ร่วมกับภาษา .NET อื่นๆ ทุกภาษา

.NET Framework class library (ต่อไปจะเรียกย่อว่า FCL) เป็นแหล่งรวม คลาส interface และ value type ต่างๆ ประมาณ 2,500 ตัว สามารถเรียกใช้ได้จากทุกภาษาที่เป็นภาษาสำหรับ .NET (คือภาษาที่สร้างตาม common language specification หรือ CLS)

 

ภาพ 210: หนังสืออ้างอิง .NET Framework class library ของสำนักพิมพ์ Microsoft Press

 

FCL จัดให้มีคลาสต่างๆ ที่จำเป็นต้องใช้ในการเขียนโปรแกรมทั่วๆ ไป อาทิ

  • คลาสที่ทำหน้าที่เป็น data type พื้นฐาน (อย่าง int)
  • คลาสที่ encapsulate โครงสร้างข้อมูล
  • คลาสที่ใช้เพื่อติดต่อกับโลกภายนอก
  • คลาสเรียกการตรวจสอบความปลอดภัย
  • คลาสเพื่อเข้าถึงข้อมูล
  • คลาสเพื่อจัดให้มีส่วนติดต่อกับผู้ใช้เป็นกราฟิกอย่างเพียบพร้อม (rich client-side GUI)

คลาสใน FCL มีทั้งคลาสที่นำไปใช้โดยตรงก็ได้ หรือจะนำไปใช้เป็น base class เพื่อสืบสันดานเป็นคลาสใหม่ก็ได้ (เรียกว่า concrete class) และมีคลาสที่นำไปใช้โดยตรงไม่ได้ ต้องนำไปใช้เป็น base class ได้เท่านั้น (เรียกว่า abstract class)

เช่นเดียวกับที่ปรากฏในภาษา Java (ที่เรียก package) เพื่อให้ใช้งานได้ง่าย FCL แบ่งคลาสต่างๆ ออกเป็นหมวดหมู่เรียกว่า namespace โดยมี namespace ทั้งหมดดังนี้

Accessibility
IEHost.Execute
Microsoft.Aspnet.Snapin
Microsoft.Build.BuildEngine
Microsoft.Build.Framework
Microsoft.Build.Tasks
Microsoft.Build.Tasks.Deployment.Bootstrapper
Microsoft.Build.Tasks.Deployment.ManifestUtilities
Microsoft.Build.Tasks.Hosting
Microsoft.Build.Utilities
Microsoft.CLRAdmin
Microsoft.CSharp
Microsoft.IE
Microsoft.JScript
Microsoft.JScript.Vsa
Microsoft.SqlServer.Server
Microsoft.VisualBasic
Microsoft.VisualBasic.ApplicationServices
Microsoft.VisualBasic.CompilerServices
Microsoft.VisualBasic.Devices
Microsoft.VisualBasic.FileIO
Microsoft.VisualBasic.Logging
Microsoft.VisualBasic.MyServices
Microsoft.VisualBasic.MyServices.Internal
Microsoft.VisualBasic.Vsa
Microsoft.VisualC
Microsoft.Vsa
Microsoft.Vsa.Vb.CodeDOM
Microsoft.Win32
Microsoft.Win32.SafeHandles
Microsoft.WindowsCE.Forms
Microsoft.WindowsMobile.DirectX
Microsoft.WindowsMobile.DirectX.Direct3D
Microsoft_VsaVb
RegCode
System
System.CodeDom
System.CodeDom.Compiler
System.Collections
System.Collections.Generic
System.Collections.ObjectModel
System.Collections.Specialized
System.ComponentModel
System.ComponentModel.Design
System.ComponentModel.Design.Data
System.ComponentModel.Design.Serialization
System.Configuration
System.Configuration.Assemblies
System.Configuration.Install
System.Configuration.Internal
System.Configuration.Provider
System.Data
System.Data.Common
System.Data.Design
System.Data.Odbc
System.Data.OleDb
System.Data.OracleClient
System.Data.Sql
System.Data.SqlClient
System.Data.SqlServerCe
System.Data.SqlTypes
System.Deployment.Application
System.Deployment.Internal
System.Diagnostics
System.Diagnostics.CodeAnalysis
System.Diagnostics.Design
System.Diagnostics.SymbolStore
System.DirectoryServices
System.DirectoryServices.ActiveDirectory
System.DirectoryServices.Protocols
System.Drawing
System.Drawing.Design
System.Drawing.Drawing2D
System.Drawing.Imaging
System.Drawing.Printing
System.Drawing.Text
System.EnterpriseServices
System.EnterpriseServices.CompensatingResourceManager
System.EnterpriseServices.Internal
System.Globalization
System.IO
System.IO.Compression
System.IO.IsolatedStorage
System.IO.Ports
System.Management
System.Management.Instrumentation
System.Media
System.Messaging
System.Messaging.Design
System.Net
System.Net.Cache
System.Net.Configuration
System.Net.Mail
System.Net.Mime
System.Net.NetworkInformation
System.Net.Security
System.Net.Sockets
System.Reflection
System.Reflection.Emit
System.Resources
System.Resources.Tools
System.Runtime
System.Runtime.CompilerServices
System.Runtime.ConstrainedExecution
System.Runtime.Hosting
System.Runtime.InteropServices
System.Runtime.InteropServices.ComTypes
System.Runtime.InteropServices.CustomMarshalers
System.Runtime.InteropServices.Expando
System.Runtime.Remoting
System.Runtime.Remoting.Activation
System.Runtime.Remoting.Channels
System.Runtime.Remoting.Channels.Http
System.Runtime.Remoting.Channels.Ipc
System.Runtime.Remoting.Channels.Tcp
System.Runtime.Remoting.Contexts
System.Runtime.Remoting.Lifetime
System.Runtime.Remoting.Messaging
System.Runtime.Remoting.Metadata
System.Runtime.Remoting.Metadata.W3cXsd2001
System.Runtime.Remoting.MetadataServices
System.Runtime.Remoting.Proxies
System.Runtime.Remoting.Services
System.Runtime.Serialization
System.Runtime.Serialization.Formatters
System.Runtime.Serialization.Formatters.Binary
System.Runtime.Serialization.Formatters.Soap
System.Runtime.Versioning
System.Security
System.Security.AccessControl
System.Security.Authentication
System.Security.Cryptography
System.Security.Cryptography.Pkcs
System.Security.Cryptography.X509Certificates
System.Security.Cryptography.Xml
System.Security.Permissions
System.Security.Policy
System.Security.Principal
System.ServiceProcess
System.ServiceProcess.Design
System.Text
System.Text.RegularExpressions
System.Threading
System.Timers
System.Transactions
System.Transactions.Configuration
System.Web
System.Web.Caching
System.Web.Compilation
System.Web.Configuration
System.Web.Configuration.Internal
System.Web.Handlers
System.Web.Hosting
System.Web.Mail
System.Web.Management
System.Web.Mobile
System.Web.Profile
System.Web.RegularExpressions
System.Web.Security
System.Web.Services
System.Web.Services.Configuration
System.Web.Services.Description
System.Web.Services.Discovery
System.Web.Services.Protocols
System.Web.SessionState
System.Web.UI
System.Web.UI.Adapters
System.Web.UI.Design
System.Web.UI.Design.MobileControls
System.Web.UI.Design.MobileControls.Converters
System.Web.UI.Design.WebControls
System.Web.UI.Design.WebControls.WebParts
System.Web.UI.HtmlControls
System.Web.UI.MobileControls
System.Web.UI.MobileControls.Adapters
System.Web.UI.MobileControls.Adapters.XhtmlAdapters
System.Web.UI.WebControls
System.Web.UI.WebControls.Adapters
System.Web.UI.WebControls.WebParts
System.Web.Util
System.Windows.Forms
System.Windows.Forms.ComponentModel.Com2Interop
System.Windows.Forms.Design
System.Windows.Forms.Design.Behavior
System.Windows.Forms.Layout
System.Windows.Forms.PropertyGridInternal
System.Windows.Forms.VisualStyles
System.Xml
System.Xml.Schema
System.Xml.Serialization
System.Xml.Serialization.Advanced
System.Xml.Serialization.Configuration
System.Xml.XPath
System.Xml.Xsl
System.Xml.Xsl.Runtime

 

แต่ละ namespace อาจประกอบด้วย คลาส interface และ value type จำนวนหนึ่ง ยกตัวอย่างเช่น namespace ชื่อ System.IO.Ports ทำหน้าที่อำนวยความสะดวกในการเขียนโปรแกรมเพื่อติดต่อกับ port สื่อสารอนุกรม namespace นี้มีคลาสอยู่ภายในสี่คลาส delegate สามตัว และ enumeration หกตัว

ในแต่ละ namespace จะมีการแบ่งกลุ่มย่อยออกมาอีก โดยทุก namespace มี base namespace ชื่อ System และ namespace นั้นอาจมี namespace ย่อยอีกหลายตัว ยกตัวอย่างเช่น namespace ชื่อ System.Xml มี base ชื่อ System ตัวมันเองชื่อ Xml และ namespace System.Xml มี namespace ย่อยอีก 7 กลุ่มคือ

  • System.Xml.Schema
  • System.Xml.Serialization
  • System.Xml.Serialization.Advanced
  • System.Xml.Serialization.Configuration
  • System.Xml.XPath
  • System.Xml.Xsl
  • System.Xml.Xsl.Runtime

โปรดสังเกตว่าชื่อของ namespace แต่ละกลุ่มจะมีเครื่องหมายจุดคั่น namespace ทางซ้ายจะเป็น base namespace ของ namespace ทางขวา ยกตัวอย่างเช่น namespace System.Xml.Schema จะมี namespace System เป็น base namespace ของ namespace Xml และ namespace Xml จะเป็น base namespace ของ namespace Schema

ใน MNF คำว่า namespace มีสองความหมาย ที่กล่าวถึงในย่อหน้าบนคือ class library namespace ยังมี namespace อีกชนิดหนึ่งคือ namespace ของผู้เขียนโปรแกรมประยุกต์

 

ตอนต่อไป: วิธีเขียนโค้ดเรียกใช้งาน FCL

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • โกศล  On พฤศจิกายน 20, 2007 at 9:00 am

    อธิบายได้เข้าใจมากเลยครับผม ok

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: