ตอน 19 Statement


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

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

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

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

 

“คุณจะรู้ตัวว่าคุณเขียนโปรแกรมมากเกินไปเมื่อคุณพยายามไล่แมลงวันที่เกาะอยู่บนหน้าจอด้วยเมาส์เคอร์เซอร์ สิ่งนี่เพิ่งเกิดกับตัวของผมเอง มันน่ากลัวมาก”

Juuso Heimonen

Statement บทที่ 4 ภาษา C# ระดับปานกลาง

ในบทนี้ท่านจะได้เรียนเรื่องต่อไปนี้

  • Statement
  • สมาชิกของคลาสและ struct
  • Access modifier
  • Type modifier
  • Assembly
  • Field
  • properties
  • Method
  • constructor
  • destructor
  • method Parameter
  • method Signature
  • method overloading

 

Statement

อันที่จริง Statement (อ่านว่า สเต็ทเม็นท์ แปลว่าประโยคคำสั่ง) ในภาษา C# ไม่แตกต่างจากประโยคในภาษามนุษย์มากนัก แต่ก็เหมือนภาษาคอมพิวเตอร์อื่นๆ ที่รูปแบบของประโยคจะซับซ้อนน้อยกว่าภาษามนุษย์ แต่มีกฎเกณฑ์ที่เคร่งครัดกว่ามาก ยกตัวอย่างประโยคภาษามนุษย์

   ฉันชอบแมว

ใครก็ตามที่อ่านประโยคข้างบนจะเข้าใจได้ทันที แต่หากผู้เขียนเขียนเพียงว่า

   ฉันชอบ

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

   int foo = bar + 2; 

อย่างนี้คอมไพเลอร์อ่านแล้วจะเข้าใจและสามารถแปลเป็นภาษา MSIL ได้ทันที ความหมายของคำสั่งนี้คือ ให้นำค่า 2 มาบวกกับค่าที่อยู่ในตัวแปรชื่อ bar จากนั้นให้นำไปเก็บไว้ในตัวแปรแบบเลขจำนวนเต็มที่สร้างใหม่ชื่อ foo

โปรดสังเกตเครื่องหมาย ; (semi-colon อ่านว่าเซมิ-โคลอน เครื่องหมายอัฒภาค) ว่าทำหน้าที่เหมือนเครื่องหมาย full stop (เครื่องหมายจุด คือมหัพภาค) ภาษาอังกฤษ คือทำหน้าที่บอกการจบประโยค

หากผู้เขียนเขียนว่า

int foo =

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

   int foo = 
   bar + 1; 

อย่างนี้ถือว่าใช้ได้ เพราะ statement ในภาษา C# เราจะกด enter เพื่อขึ้นบรรทัดใหม่อย่างไรก็ได้ตามใจชอบ คอมไพเลอร์คงถือว่าทุกบรรทัดเป็น statement เดียวกัน จนกว่าจะพบเครื่องหมาย semi-colon จึงจะนับว่าจบ statement

คอมพิวเตอร์จะทำงานตามคำสั่งแต่ละ statement จากบนสุดลงล่าง ยกตัวอย่างเช่น

public Bar()
{
   statement1
   statement2
   statement3
}

คอมพิวเตอร์จะทำงานตามคำสั่งใน statement1 ก่อน เมื่อจบแล้วจะทำงานตามคำสั่งใน statement2 และ statement3 ตามลำดับ ยกเว้นว่าจะพบ statement ที่มีคำสั่งให้วนซ้ำ ข้าม หรือกระโดดไปยัง statement อื่นเช่นคำสั่ง goto เป็นต้น

Anders Hejlsberg บิดาแห่งภาษา C# ขณะเป็น Austin Powers

 

สมาชิกของคลาสและ struct

เมื่อเขียนโปรแกรมภาษา C# เราใช้เวลาส่วนมากไปกับการสร้าง type การสร้าง type คือการนิยามคลาส หรือ struct เมื่อนิยามคลาสและ struct เราใช้เวลาส่วนมากไปกับการประกาศ และนิยามสมาชิกของมัน

สมาชิกของคลาสและ struct อาจประกอบด้วยสิ่งต่างๆ ดังนี้

  • constants
  • fields
  • methods
  • properties
  • events
  • indexers
  • operators
  • instance constructors
  • destructors
  • static constructors
  • type

ในกรณีที่นิยามคลาสโดยสืบสันดานจาก base class สมาชิกของคลาส อาจประกอบด้วยสิ่งต่างๆ ดังนี้

  • constants
  • fields
  • methods
  • properties
  • events
  • indexers
  • operators
  • type จาก base class

ลองดูตัวอย่างโค้ดดังต่อไปนี้

 

    class Foo
    {
        int i;
        public int I
        {
            get { return i; }
            set { i = value; }
        }
        struct Bar
        {
            int a;
            int b;
        }
        public Foo()
        {
            int var1;
        }
        private void Method1()
        {
            int i;
        }
    }

ผู้เขียนจะใส่เลขบรรทัดเพื่อให้สะดวกในการอธิบายดังนี้

1    class Foo
2    {
3       int i;
4       public int I
5       {
6          get { return i; }
7          set { i = value; }
8       }
9    struct Bar
10   {
11      int a;
12      int b;
13   }
14   public Foo()
15   {
16      int var1;
17   }
18   private void Method1()
19   {
20      int i;
21   }
22 }

 

นี่คือตัวอย่างการนิยามคลาสชื่อ Foo ภายในคลาสนี้ ผู้เขียนนิยามสมาชิกของคลาสไว้ห้าตัวคือ

  1. บรรทัดที่ 3 data field ชื่อ i
  2. บรรทัดที่ 4 property ชื่อ I
  3. บรรทัดที่ 9 struct ชื่อ Bar
  4. บรรทัดที่ 14 instance constructor ชื่อ Foo()
  5. บรรทัดที่ 18 method ชื่อ Method1

โปรดสังเกตว่าในคลาสนี้มีการนิยามตัวแปรชื่อ i สองตัว บรรทัดที่ 3 และบรรทัดที่ 20 ตัวแปรสองตัวนี้แม้จะมีชื่อเดียวกันและอยู่ในคลาสเดียวกัน แต่ก็เป็นคนละตัวกัน โดยตัวแปร i ในบรรทัดที่ 3 มีภาวะเป็น class data field ขณะที่ตัวแปร i ในบรรทัดที่ 20 ทำหน้าที่เป็น method local variable การเปลี่ยนแปลงค่าตัวแปร i ตัวหนึ่งจะไม่มีผลกระทบกับตัวแปร i อีกตัวหนึ่ง

โค้ดที่อยู่ภายนอกคลาส Foo จะ “เข้าถึง” (access คืออ่านหรือเขียนค่าหรือเรียก method) สมาชิกต่างๆ ของคลาส Foo ไม่ได้ นอกเสียจากว่าเราจะกำหนด “ตัวกำหนดการเข้าถึง” (access modifier) ไว้

 

Access modifier

access modifier คือ keyword ทำหน้าที่ประกาศว่า client class จะเข้าถึงสมาชิกของ type ได้หรือไม่อย่างไร access modifier มีสี่ตัวดังนี้

  • public : เข้าถึงได้โดยไม่มีข้อจำกัดใดๆ
  • protected : เข้าถึงได้จากในคลาสนั้นและคลาสที่สืบสันดานไปจากคลาสนั้น
  • internal : เข้าถึงได้จากทุกไฟล์ใน assembly เดียวกัน (เหมือน friend ใน VB.NET และ C++)
  • private : client class เข้าถึงไม่ได้ เป็นสมาชิกที่ใช้ได้ภายในคลาสนั้นเท่านั้น

ลองดูโค้ดตัวอย่างต่อไปนี้

 

    class Foo
    {
        int bar1;
        private int bar2;
        public int bar3;
        protected int bar4;
        internal int bar5;
    }
ผู้เขียนจะใส่เลขบรรทัดเพื่อให้สะดวกในการอธิบายดังนี้

1    class Foo
2    {
3       int bar1;
4       private int bar2;
5       public int bar3;
6       protected int bar4;
7       internal int bar5;
8    }

 

ในตัวอย่างนี้ผู้เขียนนิยามคลาสชื่อ Foo ที่มีสมาชิกเป็น data filed ห้าตัว เป็นตัวแปรแบบเลขจำนวนเต็ม ชื่อ bar1 ถึง bar5 โดยกำหนด access modifier แต่ละตัวไว้ดังนี้

  • ตัวแปร bar1 ไม่ได้กำหนด access modifier จะกลายเป็น private โดยอัตโนมัติ
  • ตัวแปร bar2 กำหนด access modifier เป็น private เข้าถึงได้เฉพาะในคลาส Foo
  • ตัวแปร bar3 กำหนด access modifier เป็น public client class เข้าถึงได้ไม่จำกัด
  • ตัวแปร bar4 กำหนด access modifier เป็น protected เข้าถึงได้เฉพาะในคลาส Foo และคลาสที่สืบสันดานจากคลาส Foo
  • ตัวแปร bar5 กำหนด access modifier เป็น internal เข้าถึงได้จากโค้ดที่อยู่ภายใน assembly เดียวกับคลาส Foo

นอกจาก access modifier แล้ว ภาษา C# ยังมี modifier อื่นๆ เพื่อใช้แก้ไขเปลี่ยนแปลงการประกาศ type ดังจะกล่าวถึงในหัวข้อถัดไป

 

 

Type modifier

เราสามารถนิยาม type ในภาษา C# ได้อย่างพลิกแพลง โดยการกำหนด modifier ซึ่งในหัวข้อก่อนหน้านี้ผู้เขียนอธิบาย access modifier ไปแล้ว ในหัวข้อนี้เราจะมาดู modifier แบบอื่นๆ ที่เหลือทั้งหมด

  • abstract ใช้เพื่อระบุว่าคลาสนี้มีไว้ใช้ทำเป็น base class
  • const ประกาศสร้างตัวคงค่า
  • event ประกาศสร้าง event
  • extern อ้างถึง method ที่อยู่ภายนอก assembly
  • new ใช้เมื่อสืบสันดานแล้วต้องการซ่อนสมาชิกของ base class
  • override ใช้เมือสืบสันดานแล้วต้องเขียนนิยามใหม่ทับสมาชิกของ base class
  • partial ระบุว่า type นี้ประกอบด้วยไฟล์ source code หลายไฟล์
  • readonly อ่านได้ เขียนไม่ได้
  • sealed ใช้เพื่อระบุว่าจะนำคลาสนี้ไปใช้เป็น base class ไม่ได้
  • static ใช้ระบุว่าสมาชิกนั้นๆ เป็นของคลาส ไม่ได้เป็นของ object
  • unsafe ประกาศบริเวณ unsafe
  • virtual ใช้ระบุว่าสมาชิกนั้นๆ ให้นำไป override ได้
  • volatile อนุญาตให้ระบบปฏิบัติการหรือ thread อื่นแก้ไขตัวแปรชนิดนี้ได้

หากท่านอ่านคำอธิบายย่อๆ ข้างบนแล้วยังไม่เข้าใจชัดเจนก็ไม่เป็นไร เพราะในภาคปฏิบัติ ไปผู้เขียนจะอธิบาย modifier แต่ละตัวอีกครั้งเมื่อเราพบมันภายในโค้ดที่ใช้งานจริง

ตอนต่อไป : Assembly

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: