ตอน 12 : เปรียบเทียบภาษา C# กับภาษาอื่นๆ

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

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

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

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

 

 

เปรียบเทียบภาษา C# กับภาษาอื่นๆ

ถ้าพูดถึงความใกล้เคียงกับภาษาอื่นๆ ภาษา C# ใกล้เคียงกับภาษา Java มากที่สุด โดยมีความเหมือนกันถึง 70% ดั้งนั้นนักเขียนโปรแกรมภาษา Java จึงอาจย้ายมาเขียนภาษา C# ได้โดยศึกษาว่ามีสิ่งใดที่แตกต่างกันบ้าง ภาษา C# ยังมีความคล้ายคลึงกับภาษ C++.NET และภาษา VB.NET เป็นอย่างมาก ทำให้นักเขียนโปรแกรมภาษา C# สามารถอ่าน-เขียนโค้ดในภาษากลุ่มนี้ได้เมื่อฝึกฝนเพียงเล็กน้อย

ยกตัวอย่างความเหมือนกันระหว่างภาษา C# และภาษา Java คือเรื่องการสืบสันดาน (Inheritance) ทั้งคู่เป็นแบบสืบจากคลาสหลักได้คลาสเดียว ขณะที่ภาษา C++ สามารถสืบจากคลาสหลักได้มากกว่าหนึ่ง (Multiple inheritance) โดยภาษา C# และภาษา Java ใช้ Interface มาทดแทน Multiple inheritance เหมือนกันทั้งคู่ อีกตัวอย่างหนึ่งที่ภาษา C# และ Java มีร่วมกันคือเรื่อง Garbage Collection ซึ่งมีทั้งใน C# และ Java แต่ไม่มีใน C++ จึงทำให้ดูเหมือนว่าภาษา Java ต่อยอดมาจากภาษา C++ และ C# ต่อยอดมาจาก Java อีกที แต่ถูกดัดแปลงให้แตกต่างออกไปมากพอที่บริษัท ซัน จะไม่อาจฟ้องร้องว่าไมโครซอฟท์ลอกเลียนภาษา Java

 

ภาพ 303: เครื่องแม่ข่าย Sun Fire V40z ของบริษัท Sun Microsystems เจ้าของภาษา Java

 

ที่เป็นเช่นนั้นเพราะทั้ง Java และ C# มีต้นสายมาจาก C++ ทำให้สองภาษานี้ดูคล้ายกัน แต่ภาษา C# ไม่ใช่ภาษา Java มันมีกลไกที่เป็นเอกลักษณ์หลายอย่าง เช่น พารามิเตอร์แบบ reference และ output การจัดเก็บ object ไว้ใน stack (struct) การทำ Versioning และยังมีสิ่งใหม่ๆ ที่เป็น “ของดี” มอบให้นักเขียนโปรแกรมหลายอย่าง เช่น delegate, properties และ operator overloading ซึ่งท่านจะไม่พบในภาษา Java

ภาษา C# มีอะไรดี

ผู้เขียนขอแนะนำว่าถ้าท่านคิดจะเขียนโปรแกรมใน .NET เป็นโปรแกรมง่ายๆ เล็กๆ น้อยๆ ท่านควรใช้ภาษา VB.NET แต่ถ้าท่านต้องการเขียนโปรแกรมที่ซับซ้อนขึ้น เช่น โปรแกรมควบคุมฮาร์ดแวร์ และโปรแกรมเกมสามมิติ ท่านควรเรียนรู้ภาษา C# ไว้ด้วย เพราะแม้ .NET จะมีภาษาให้เลือกใช้หลายสิบภาษา แต่ภาษา C# เป็นพื้นเมืองของ .NET เมื่อค้นใน web จะพบข้อมูลและตัวอย่างโค้ดเป็นภาษา C# มากกว่าภาษาอื่น

บิดาของภาษา C# คือ Hejlsberg กล่าวว่า “จุดขาย” ของภาษา C# มีสี่ประการดังนี้

เป็นภาษาที่เน้นชิ้นส่วน (Component oriented)

แนวคิดเรื่องซอฟท์แวร์ชิ้นส่วนมีมานานแล้ว เหมือนเลโก้ (ของเด็กเล่น) ที่เป็นบล็อกพลาสติกเล็กๆ สีสดใด ถูกออกแบบไว้อย่างดี ทำให้สามารถนำมาใช้ต่อกันเป็นอะไรได้สารพัด ภาษา C# เอื้ออำนวยการใช้งานลักษณะนี้ โดยให้ท่านสร้าง properties method และ event เองได้ง่ายๆ เป็นเอกสารอธิบายการทำงานไปในตัว (คือผลิตเอกสาร XML จาก source code ได้เลย) การดึงโค้ดที่ท่านเคยเขียนไว้มาใช้ก็ทำได้ง่าย ไม่ต้องทำเป็นไฟล์ header ที่ใช้งานไม่ค่อยสะดวก

 

ภาพ 304: ปัจจุบันมีตำราสอนการประยุกต์ใช้ XML อยู่มาก

 

สิ่งต่างๆ เป็น object ทั้งหมด

ในภาษา C++ พวก type พื้นฐานต่างๆ (เช่น int, double) ถือเป็น primitive type คือเป็น type ที่ฝังอยู่ในภาษา จึงดูเหมือนไม่มีที่มาที่ไป เพราะสามารถเรียกใช้ได้อย่างลอยๆ ส่วนภาษา Smalltalk และภาษา Lips พวก type พื้นฐานล้วนเป็น object ซึ่งเป็น reference type ทั้งหมด ทำให้การทำงานมีประสิทธิภาพลดลง ส่วนในภาษา C# แม้ทุกอย่างเป็น object หมด แต่ type พื้นฐานจะมีภาวะเป็น value type จึงไม่ลดทอนประสิทธิภาพ ยกตัวอย่างเช่น

int foo;

นี่คือการนิยามตัวแปรชื่อ foo มี type เป็น int หรือจำนวนเต็ม เนื่องจาก type int แม้จะดูเหมือน type พื้นฐานแต่อันที่จริงมันคือคลาส System.int32 ดังนี้ foo จึงมีภาวะเป็น object แต่จะพิเศษกว่า object ธรรมดาตรงที่มันเป็น value type

foo + 1;

ในตัวอย่างโค้ดข้างบน แม้เลข 1 จะเป็นตัวเลขที่เราพิมพ์เข้าไป (literal) แต่มันก็ยังกลายเป็น object ที่มี type เป็น System.int32 ไปด้วย เนื่องจากทุก type ล้วนสืบสันดานจาก System.Object เลข 1 จึงสามารถเรียกใช้ method ต่างๆ ที่นิยามไว้ใน System.Object ได้ ยกตัวอย่างเช่น

string Bar = 1.ToString();

เป็นภาษาที่ทนทาน

คำว่าทนทาน (robust) ในที่นี้หมายถึงทนต่อความผิดพลาด ไม่ทำให้ระบบแฮงค์หรือระบบอืด ทั้งนี้เพราะภาษา C# มีของดีสี่อย่างคือ (1) Garbage collection เป็นกลไกบริหารหน่วยความจำเพื่อทำลาย object ที่หมดเงื่อนไขในการดำรงอยู่ ป้องกันความเผอเรอของนักเขียนโปรแกรมที่ทำให้เกิดอาการ “หน่วยความจำรั่ว” (memory leaks) (2) Exceptions เป็นตัวดักจับและรายความความผิดพลาดแบบ run-time error (3) Type-safety ป้องกันการเรียกใช้ตัวแปรที่ยังไม่ได้ถูกกำหนดค่าเริ่มต้น ป้องกันการ casts ที่ไม่ปลอดภัย (4) Versioning เพื่อรักษาความปลอดภัยในการใช้คลาสและการสืบทอด

เขียนโค้ดแล้วไม่เหนื่อยฟรี

ไม่ได้หมายความว่าภาษา C# สามารถช่วยป้องกันไม่ให้ลูกค้าบิดพลิ้วเงินค่าจ้างได้ (หาทำได้คงจะดีเหมือนกัน) แต่หมายถึงภาษา C# จัดเตรียมกลไกไว้หลายอย่างที่ช่วยให้เรานำโค้ดที่เขียนไว้ใน “โปรเจค” หนึ่งไปใช้กับอีกโปรเจคหนึ่งได้ง่าย นอกจากนั้นภาษา C# ยังสามารถเรียกใช้คลาสหลายพันคลาสใน .NET Framework ได้โดยตรง ทำให้ลดเวลาการพัฒนาซอฟท์แวร์ได้มาก

ปรัชญาในการออกแบบภาษา C#

มาตรฐาน ECMA ระบุว่าภาษา C# มีปรัชญาการออกแบบดังนี้

  • เป็นภาษา OOP ยุคใหม่ที่เน้นความเรียบง่าย อเนกประสงค์
  • สนับสนุนหลักวิศวกรรมซอฟท์แวร์ เช่น มีการตรวจสอบ type ตรวจสอบขอบเขตของอาร์เรย์
  • ใช้เขียนงานประมวลผลแบบกระจายได้
  • การนำ source code ไปใช้กับระบบ (platform) ต่างๆ กันถือว่ามีความสำคัญ
  • การใช้ได้กับทุกประเทศถือว่าสำคัญ
  • สามารถสร้างซอฟท์แวร์ได้ทั้งขนาดใหญ่ และในระบบปฏิบัติการของอุปกรณ์พกพา
  • เน้นประหยัดหน่วยความจำและกำลังของหน่วยประมวลผล แต่ไม่ถึงขนาดภาษา C หรือแอสเซมบลี

คุณสมบัติอื่นๆ

ต่อไปนี้เป็นคุณสมบัติที่ท่านจะพบในภาษา C# แต่ไม่มีในภาษา C++

  • ไม่มีตัวแปรหรือ method โดดๆ ตัวแปรและ method ทุกตัวต้องเป็นสมาชิกของคลาส
  • ในบล็อกเดียวกันใช้ตัวแปรชื่อเดียวกันไม่ได้
  • ไม่มีฟังก์ชันที่อยู่ลอยๆ เรียกใช้ได้จากทุกแห่ง (อย่าง printf() ใน C)
  • มี name space สืบทอดกันเป็นลำดับชั้น
  • type ทั้งหมดแม้กระทั่ง primitive (เช่น int หรือ double) ล้วนมีที่มาจากคลาส
  • ค่าบูลลีนเมื่อใช้เป็นนิพจน์ตรวจสอบ (เช่นใน if) จะใช้สลับกับค่า int อย่างใน C++ ไม่ได้
  • ภาษา C# สนับสนุนตัวแปรแบบพอยน์เตอร์ (pointer) แต่ต้องใช้ในส่วน unsafe
  • Garbage collection ทำหน้าที่ตัดสินใจว่าจะทำลาย object ตัวใดเมื่อใด
  • Hejlsberg ตัดสินใจว่าไม่ต้องการใช้ภาษา C# มี multiple inheritance
  • เป็นภาษาที่เข้มงวดเรื่อง type

คุณสมบัติที่เพิ่มขึ้นในเวอร์ชัน 2.0

  • Partial class ช่วยให้เขียนคลาสเดียวแยกเป็นหลายไฟล์ได้
  • Generics คล้ายๆ template ในภาษา C++
  • คลาสแบบ static เป็นคลาสที่นำไปใช้สร้าง object ไม่ได้ แต่ช่วยให้ทำตัวแปรและ method แบบ global ได้
  • เพิ่ม Iterator และ yield คล้ายคลึง yield ในภาษา Python
  • Anonymous delegate ช่วยให้เขียนการทำงานแบบ Call back ได้ง่ายขึ้น
  • signature แบบ Covariance และ contravariance สำหรับ delegate
  • ค่าแบบ Nullable เพื่อความสะดวกในการเขียนโค้ดติดต่อกับฐานข้อมูลแบบ SQL

คุณสมบัติที่เพิ่มขึ้นในเวอร์ชัน 3.0

  • เพิ่มคำสั่ง from, where, select เพื่อทำงานกับ SQL
  • เพิ่มวิธีสร้าง object และการกำหนดค่าเริ่มต้นแบบใหม่ที่ช่วยให้เขียนโค้ดได้กระชับขึ้น
  • นิพจน์แลมดา (Lambda expression) ช่วยให้เขียนโค้ดได้กระชับขึ้น
  • type แบบ anonymous ช่วยให้การกำหนด type ทำได้คล่องตัวขึ้น
  • ตัวแปรท้องถิ่นที่มี type เป็น implicit
  • อาร์เรย์ที่มี type เป็น implicit
  • method แบบ extension ช่วยให้สามารถต่อเติม method ใหม่ให้ type ได้
  • Expression trees ทำให้มองนิพจน์แลมดาเป็นข้อมูล (แทนที่จะเป็นโค้ด) ได้

ตอนต่อไป: โปรแกรม Hello World

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • sweety  On พฤศจิกายน 22, 2009 at 3:22 pm

    เปรียบเทียบดีจังขอบคุณมากค่ะ

  • Namsom  On เมษายน 28, 2010 at 5:20 pm

    ขอบคุณที่มีคนใจดีอย่างนี้ขอให้เฮ็งๆๆ นะคะ ^^

ใส่ความเห็น

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: