ตอน 32 Object และ collection initializes

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

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

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

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

 

 

Object และ collection initializes

 

object initializes (ต่อไปจะเรียกย่อว่า OI) เป็นคุณสมบัติเริ่มมีใช้ใน C#3.0 ช่วยอำนวยความสะดวกในการกำหนดค่าเริ่มต้นให้แก่ object ทำให้เขียนโค้ดได้กระชับขึ้น สมมุติว่าเรามีคลาสดังต่อไปนี้

class Student
{
    public string name;
    public string address;
    int age;

    public int Age
    {
        get { return age; }
        set { age = value; }
    }
}

โค้ดที่เห็นข้างบนเป็นนิยามคลาสชื่อ Student เป็นคลาสธรรมดาไม่มีอะไรพิเศษ เมื่อสร้าง object จากคลาสนี้และกำหนดค่าเริ่มต้นให้แก่ object ใน C#2.0 เราจะใช้คำสั่งดังต่อไปนี้

class Program
{
    static void Main(string[] args)
    {
        Student myStudent = new Student();
        myStudent.name = "somchai";
        myStudent.address = "123 sukumvit road, Bangkok";
        myStudent.Age = 20;
    }
}

แต่คุณสมบัติ OI ใน C#3.0 ช่วยให้เราสามารถเขียนโค้ดอย่างนี้แทนได้

var myStudent = new Student(name = “somchai”,
address = "123 sukumvit road, Bangkok",
Age = 20);

นอกจากจะทำให้โค้ดสั้นลงแล้ว OI ยังช่วยเพิ่มความยืดหยุ่นในการเขียนโค้ดได้ ในโค้ดตัวอย่างนี้จะเห็นว่าเราไม่ต้องสร้าง constructor และทำ overload constructor หลายๆ แบบเพื่อรับพารามิเตอร์หลายๆ รูปแบบ เพราะ CI ทำงานได้ทั้งกับ field ที่เป็น public และ properties

นอกจาก C#3.0 จะมี object initializes แล้วยังมี collection initializes (ต่อไปจะเรียกย่อว่า CI) ด้วย หลักการและหน้าที่ของ CI ก็เหมือน OI แปลกกันที OI ทำงานกับ object เพียงตัวเดียวขณะที่ CI ใช้กับชุดหรือกลุ่มของ object โดยมี syntax ดังนี้

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

สมมุติว่าเราต้องการสร้าง object collection จากคลาส Student สามารถทำได้ดังนี้

List<Customer> custList = new List<Customer> {
   new Customer
   {
     name = "somchai", address = "Bangkok",
   },
   new Customer
   {
      name = "malee", address = "Bangkok",
   },
   new Customer
   {
      name = "boonme", address = "Kanjanaburi",
   }
};

ข้อสรุปเรื่อง Object และ collection initializes
• OI อำนวยความสะดวกในการสร้างและกำหนดค่าเริ่มต้นให้ object
• CI อำนวยความสะดวกในการสร้างและกำหนดค่าเริ่มต้นให้ชุดของ object
• เริ่มมีใช้ใน C#3.0
• ช่วยให้การเขียนโค้ดยืนหยุ่นและกระชับขึ้น

 

Anonymous types

Anonymous types (ต่อไปจะเรียกย่อว่า AT) เป็นคุณสมบัติเริ่มมีใช้ใน C#3.0 ช่วยอำนวยความสะดวกในการสร้าง และกำหนดค่าเริ่มต้นให้แก่ object โดยไม่ต้องกำหนด type ทำให้การเขียนโค้ดยืดหยุ่นขึ้นจากตัวอย่างโค้ดในหัวข้อ object และ collection initializes เราสามารถสร้างและกำหนดค่าเริ่มต้นให้ object ที่สร้างจากคลาส Student โดยอาศัย object initializes ได้ดังนี้

var myStudent = new Student(name = “somchai”,
address = "123 sukumvit road, Bangkok",
Age = 20);

จากโค้ดข้างบน โปรดสังเกตว่าเรากำหนดให้ object myStudent มี type เป็น var ซึ่งเป็น Implicitly typed local variables (ดูรายละเอียดในหัวข้อก่อนหน้านี้) เมื่อคอมไพล์แล้ว myStudent จึงจะได้รับ type ที่แท้จริง (คือ Student) นับว่าช่วยให้การเขียนโค้ดยืดหยุ่นดี แต่ AT ก้าวหน้าไปอีกขึ้นหนึ่ง เพราะเมื่อใช้ AT เราสามารถสร้างและกำหนดค่าเริ่มต้นให้ object โดยเขียนโค้ดแบบนี้ได้

var myStudent = new(name = “somchai”,
address = "123 sukumvit road, Bangkok",
Age = 20);

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

public sealed class <Projection>f__0
{
    // Methods
    public <Projection>f__0();
    public override bool Equals(object);
    public override int GetHashCode();
    public override string ToString();
    // Properties
    public string Address { get; set; }
    public string Name { get; set; }
    // Fields
    private string _Address;
    private string _Name;
} 

Anonymous types
• ช่วยให้เราสร้าง object ได้โดยไม่ต้องระบุ type
• syntax คล้าย object initializes แต่ไม่ระบุ type
• มักใช้ร่วมกับ Implicitly typed local variables
• compiler จะสร้าง type ให้ขณะคอมไพล์ (late binding)

 

Implicitly typed arrays

Implicitly typed arrays (ต่อไปจะเรียกย่อว่า ITA) เป็นคุณสมบัติเริ่มมีใช้ใน C#3.0 ช่วยอำนวยความสะดวกในการประกาศ และกำหนดค่าเริ่มต้นให้แก่ array โดยไม่ต้องกำหนด type, ขนาด และ dimension ทำให้การเขียนโค้ดยืดหยุ่นขึ้น

เดิมทีใน C#2.0 เมื่อเราต้องการประกาศ และกำหนดค่าเริ่มต้นให้แก่ array จะใช้คำสั่งดังนี้

int[] arr = new int[] { 1, 2, 3, 4, 5 };

โค้ดบรรทัดบนทำหน้าที่ประกาศ array ชื่อ arr กำหนดให้มี data type เป็น int และกำหนดค่าเริ่มต้นให้เป็น 1 ถึง 5 ทำให้ได้ array แบบ dimension เดียวที่มี array element ห้าตัว แต่ใน C#3.0 เราสามารถเขียนโค้ดแบบนี้ได้

var[] arr = new[] { 1, 2, 3, 4, 5 };

เป็นการประกาศ array ชื่อ arr และกำหนดค่าเริ่มต้นให้เป็น 1 ถึง 5 ทำให้ได้ array แบบ dimension เดียวที่มี array element ห้าตัวเช่นเดียวกัน โปรดสังเกตว่าเราไม่ได้กำหนด data type แต่เราใช้ var ซึ่งเป็น Implicitly typed local variables แทน เมื่อคอมไพล์ arr จะมี data type เป็น int โดยถูกกำหนดโดยนัยจากข้อมูลที่เราให้เป็นค่าเริ่มต้นของมัน

 

ข้อสรุปเรื่อง Implicitly typed arrays
• ช่วยให้เราสร้าง array ได้โดยไม่ต้องระบุ type
• syntax คลายการนิยาม array ธรรมดาแต่ไม่ระบุ type
• มักใช้ร่วมกับ Implicitly typed local variables
• compiler จะกำหนด type ให้ขณะคอมไพล์

 

ที่ท่านอ่านจบไปในบทนี้คือหัวข้อสำคัญต่างๆ ที่เกี่ยวกับภาษา C# ระดับสูงและคุณสมบัติใหม่ๆ บางอย่าง ที่เพิ่มขึ้นใน C#3.0 บทต่อไปท่านจะได้เรียนวิธีเขียนโปรแกรมภาษา C# เพื่อสร้าง web application ก่อนที่จะเริ่มภาคปฏิบัติในบทที่ 7 ต่อไป

คำถามท้ายบทที่ 5

  1. เมื่อเรานิยามคลาส หากเราไม่ระบุ base class ภาษา C# จะถือว่า base class คืออะไร
  2. versioning คืออะไร
  3. assignment คืออะไร
  4. type casting แตกต่างจาก boxing และ unboxing อย่างไร
  5. การแปลง type ด้วยคำสั่ง as แตกต่างจากการทำ type casting อย่างไร
  6. method ต้องมี modifier เป็นแบบใดเราจึงจะสามารถ override ได้
  7. early binding คืออะไร
  8. late binding คืออะไร
  9. การทำ hiding ต้องใช้คำสั่งอะไร
  10. คลาสที่ไม่ใช่ Interface ซึ่งโค้ดภายในมีแต่ประกาศนิยามสมาชิก เรียกว่าอะไร
  11. หากไม่กำหนด modifier ให้ abstract method จะมีภาวะเป็นอะไร
  12. Interface มีขึ้นเพื่อสนับสนุนหลักการอะไร
  13. Interface มีประโยชน์อย่างไร
  14. อะไรคือ object collection
  15. IEnumerator คืออะไร
  16. หากจะใช้ IEnumerator เราต้องเตรียม method ใดไว้บ้าง
  17. Indexer คืออะไร
  18. Iterator คืออะไร
  19. Regex คืออะไร
  20. generic มีมาเพื่อแก้ปัญหาอะไร
  21. operator overloading คือการทำอะไร
  22. delegate คืออะไร
  23. pointer คืออะไร
  24. วิธีประกาศ pointer ที่ชี้ไปยัง pointer ทำอย่างไร
  25. ก่อนคอมไพล์โค้ดที่มี unsafe ต้องกำหนดอะไร
  26. Implicitly typed local variables มีประโยชน์อย่างไร
  27. lambda expression คืออะไร
  28. object initializes คืออะไร
  29. Anonymous types คืออะไร
  30. Implicitly typed arrays คืออะไร

เฉลยคำถาม

ตอนต่อไป: การเขียนโปรแกรมบนเว็บ

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • Ekkawit Limwattanapanichayakul  On กันยายน 7, 2007 at 3:54 am

    เป็นประโยชน์มากครับ ถ้าอยากจะทำเป็นเว็บร่วมกันเผยแพร่บทความก็ติดต่อผมได้นะครับ 

ใส่ความเห็น

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: