ตอน 25 assignment, type casting และคำสั่ง as

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

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

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

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

นี่คือตอน 2 ของหัวข้อ Inheritance และสิ่งที่ต่อเนื่องจาก Inheritance ในภาษา C#

 

assignment, type casting และคำสั่ง as

คำว่า assignment ในที่นี้หมายถึงการนำคลาสไปใช้สร้าง instance หรือการสร้าง object หรือการสร้างตัวแปร (variable) แบบ reference type นั่นเอง

ภาษา C# เป็นภาษาที่มีคุณสมบัติ type safety คือช่วยตรวจสอบความถูกต้อง (type check) ในการสร้างและการใช้งาน type ตลอดเวลาเพื่อป้องการความผิดพลาดที่เรียกว่า type error (เดิมทีนักเขียนโค้ดต้องระวังเอาเอง)

เมื่อมองในด้าน type check เราอาจแบ่ง type ออกได้เป็นสองแบบคือ

  • Static type: คือ type ที่ภาษา C# สามารถทำ type check ได้เลยโดยไม่ต้องหาค่าของมันขณะ runtime เสียก่อน
  • Dynamic type: คือ type ที่ต้องหาค่าตอน runtime ก่อนจึงจะทำ type check ได้

ต่อไปนี้ผู้เขียนจะอธิบายรายละเอียดเรื่อง Static และ Dynamic type โดยยกตัวอย่างโค้ด

การนิยามคลาสคือการสร้าง type ใหม่ขึ้น ดังนั้นหากเรานิยามคลาส 3 คลาสดังนี้

class A {…}
class B:A {…}
class C:B {…}

เมื่อเรานำคลาสไปใช้ดังนี้

  • A foo = new A(); ภาวะ static type ของ foo เกิดจากการกำหนด type เมื่อประกาศ type (ในที่นี้คือ A) และภาวะ dynamic type ของ foo เกิดจาก type ของ object ภายในตัว foo เอง (ในที่นี้คือ A เช่นกัน)
  • foo = new B(); ภาวะ dynamic type ของ foo คือ B
  • foo = new C(); ภาวะ dynamic type ของ foo คือ C
  • B bar = foo; ทำไม่ได้ จะเกิดคอมไพล์ error

เมื่อกำหนดให้ foo = new C(); เมื่อตรวจสอบ type ขณะ runtime จะได้ผลดังนี้

  • if(foo is C) ได้ผลลัพธ์เป็น true
  • if(foo is B) ได้ผลลัพธ์เป็น true เช่นเดียวกัน
  • if(foo is A) ได้ผลลัพธ์เป็น true แต่จะมี warning

เมื่อกำหนดให้ foo = null;

  • if(foo is C) ได้ผลลัพธ์เป็น false

ข้อสรุปเรื่องassignment

  • assignment คือการสร้าง object
  • assignment คือการสร้าง instance จากคลาสหรือ struct
  • assignment คือการสร้างตัวแปร object
  • assignment คือการสร้าง reference variable
  • เมื่อทำ assignment ภาษา C# จะทำ type check ให้โดยอัตโนมัติ

 

type casting

type casting คือการแปลง type จากแบบหนึ่งไปเป็นอีกแบบหนึ่ง เราสามารถแปลง type กลับไปกลับมาระหว่าง class ที่สืบสันดานกันได้ ยกตัวอย่างเช่น

เมื่อกำหนดให้ A foo = new C(); แล้วแปลง type โดยการ casting ผลที่ได้จะเป็นดังนี้

  • B bar = (B)foo; นี่คือการแปลง type ของ foo (เดิมเป็น C) ให้กลายเป็น type B สามารถทำได้เพราะ C เป็น subclass (derived class) ของ B
    เมื่อกำหนดให้ foo = null; แล้วทำ casting โดย
  • c = (C)foo ก็ทำได้เช่นเดียวกันเพราะเราสามารถ cast ให้ null เป็น reference type อะไรก็ได้

ข้อสรุปเรื่อง casting

  • casting คือการแปลง type
  • casting จาก null เป็น type อะไรก็ได้
  • casting ทำได้เฉพาะ type ที่อยู่ในตระกูลเดียวกัน (เช่น int เป็น double ได้)
  • casting ระหว่าง type คนละตระกูลไม่ได้ (เช่น string เป็น int ไม่ได้)

 

กรรมกรซอท์แวร์ชื่อ Emilio Guijarro ทดลองทำ casting แบบ prefix (คือแบบใส่วงเล็บไว้หน้า)เปรียบเทียบกับการทำ casting โดยใช้คำสั่ง as พบว่าการทำ casting โดยใช้คำสั่ง as ทำงานได้เร็วกว่ามาก ดังจะเห็นได้จากผลลัพธ์ของการทดสอบในแผนภูมิ (โปรดอ่านรายละเอียดในบทความของเขาที่ www.codeproject.com/csharp/csharpcasts.asp)

 

 

คำสั่ง as

คำสั่ง as ทำหน้าที่แปลง type จากแบบหนึ่งไปเป็นอีกแบบหนึ่งเหมือนการ casting ยกเว้นว่าการแปลงด้วย casting หากล้มเหลวเพราะ type ที่แปลงไม่เข้ากัน จะเกิด error แบบ exception ขึ้น แต่การใช้ as จะไม่เกิด exception แต่จะได้ผลลัพธ์เป็น null แทน ลองดูตัวอย่างโค้ดต่อไปนี้

  • เมื่อกำหนดให้ A foo = new C();
  • B bar = foo as B; แปลง type ของ foo จาก A เป็น B ทำได้ ไม่ error
  • C c = foo as C; แปลง type ของ foo จาก B เป็น C ทำได้ ไม่ error

เมื่อกำหนดให้ foo = null;

  • c = foo as C; แปลง type ของ foo จาก null เป็น C ทำไม่ได้ กลายเป็น null ตามเดิม

สรุปเรื่องคำสั่ง as

  • as คือการแปลง type
  • as จาก null เป็น type อะไรก็ได้
  • as ทำได้เฉพาะ type ที่อยู่ในตระกูลเดียวกัน (เช่น int เป็น double ได้)
  • as ระหว่าง type คนละตระกูล (เช่น string เป็น int) จะได้ผลลัพธ์เป็น null

ตอนต่อไป: method overriding, Name binding, การทำ hiding

Post a comment or leave a trackback: Trackback URL.

ใส่ความเห็น

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: