ตอน 18 : นิพจน์ในภาษา C# (Expression)


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

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

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

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

 

 

นิพจน์ในภาษา C# (Expression)

ในทางคณิตศาสตร์ 2+2 หรือ x-y คือตัวอย่างของนิพจน์ง่ายๆ ในภาษา C# นิพจน์คือการรวมตัวกันของ value (เช่น เลข 2) ตัวแปร (เช่น Foo) และตัวกระทำ (เช่น ลบ -) เมื่อนำมารวมเข้าด้วยกันสามารถผลิตค่าใหม่ออกมาได้ ยกตัวอย่างเช่น

x = i + 10;

นี่คือคำสั่งที่สมบูรณ์หนึ่งบรรทัด ส่วนที่เป็นนิพจน์คือส่วนที่อยู่ทางขวาของเครื่องหมายเท่ากับ (คือ i + 10) ค่าที่มันผลิตได้ถูกนำไปเก็บไว้ในตัวแปร x

ต่อไปนี้เป็นตัวอย่างของนิพจน์ในภาษา C#

a + 1
a++
a+
+a
i > a
i ==
(x * y) + (z * 2)
foo << 2
bar is int

ผู้สร้างภาษา C# จัดเตรียมองค์ประกอบที่จำเป็นสำหรับสร้าง expression (อ่านว่า เอ็กซ์เพรสชัน) มาให้อย่างอุดม นักเขียนโปรแกรมภาษา C++ และภาษา Java จะพบว่า expression ในภาษา C# เหมือนกันทุกประการกับภาษาของตน และสามารถข้ามหัวข้อนี้ไปได้โดยไม่พลาดข้อมูลสำคัญใดๆ

ตัวกระทำแบบฝ่ายเดียว (unary operator ยูนารีโอเปอร์เรเตอร์) ทำให้เขียนโปรแกรมได้กระชับไม่เยิ่นเย้อ ยกตัวอย่างเช่น ในภาษา VB หากต้องการเพิ่มค่าของตัวแปร i ขึ้นหนึ่ง (คือหากเดิม i เป็น 1 จะกลายเป็นสอง) จะต้องเขียนว่า

i = i + 1;

ในขณะที่ภาษา C# เขียนเพียง

i++ ;

อีกตัวอย่างของการใช้ unary operator คือ

if (!ProductFound(“001”))

นี่คือการใช้ตัวกระทำ ! เพื่อกลับค่าตรรกะของ method ProductFound() สมมุติว่าเราสร้าง method ชื่อ ProductFound() ซึ่งทำหน้าที่ค้นหาสินค้าในฐานข้อมูลตามเลขประจำตัว โดยมี return type เป็นบูลลีน หากหาพบข้อมูลจะส่งค่ากลับมาเป็น true (จริง) มิฉะนั้นจะส่งค่า false (เท็จ) กลับมา ในตัวอย่างโค้ดข้างบนการใส่ unary operator ! ทำให้ความหมายกลายเป็น “หากไม่พบสินค้าหมายเลข 001”

ตัวกระทำแบบสองฝ่าย (Binary operator) เป็น operator ที่เราคุ้นเคยที่สุด ยกตัวอย่างเช่น

a = b + c;

คำสั่งบรรทัดนี้นำค่าในตัวแปร b และ c มาบวกกันแล้วนำผลลัพธ์ที่ได้ไปเก็บไว้ในตัวแปร a

x = y * 2;

คำสั่งบรรทัดนี้นำค่าในตัวแปร y ไปคูณกับ 2 แล้วนำผลลัพธ์ที่ได้ไปเก็บไว้ในตัวแปร x

ตัวกระทำแบบสามฝ่าย (Ternary operator) operator แบบนี้เราไม่ค่อยได้ใช้บ่อยนัก มันช่วยทำให้โค้ดกระชับ แต่อ่านเข้าใจยาก ยกตัวอย่างเช่น

s = x !=0 ? 1 : 2;

หมายถึงถ้า x ไม่ได้มีค่าเป็นศูนย์ให้นำเลข 1 ไปใส่ตัวแปร s มิฉะนั้นให้ s เท่ากับ 2 ปรกติเราเขียนโดยใช้คำสั่ง if ได้ดังนี้

if (x != 0)
{
     s = 1;
}
else
{
     s = 2;
}

จะเห็นว่าการใช้ Ternary operator เขียนโค้ดได้สั้นกว่ามาก แต่เวลาอ่านอาจต้องใช้เวลาชั่วขณะกว่าจะเข้าใจ ขณะที่การใช้ if แค่มองผ่านๆ ก็เข้าใจได้อย่างรวดเร็ว

ตัวกระทำ หรือ Operator ในภาษา C# เป็นสิ่งที่ดีเด่น น่าสนใจ สนุก และมีประโยชน์ ในตารางนี้เป็น predefined operator หรือตัวกระทำที่ถูกกำหนดหน้าที่มาแล้ว แต่เราอาจทำ overload ต่อตัวกระทำเหล่านี้ได้ตามใจชอบ

 

การประกาศ (Declaration)

เวลาที่เราใช้ไปในการเขียนโปรแกรมภาษา C# ส่วนใหญ่หมดไปกับการเขียนนิยามของคลาส ในนิยามของคลาสจะเต็มไปด้วยการประกาศสิ่งต่างๆ เช่น field method property event indexer และอื่นๆ การประกาศเหล่านี้เราต้องตั้งชื่อสิ่งต่างๆ เองทั้งหมด ชื่อทั้งหมดต้องเป็นตัวอักษรในภาษาอังกฤษ และมีระเบียบการตั้งชื่อให้เหมาะสม (ดูหัวข้อการตั้งชื่อในตอนที่แล้ว) ตัวอย่างการประกาศดังนี้

int foo;

อย่างนี้เป็นการประกาศตัวแปรชื่อ foo ให้มีชนิดเป็นเลขจำนวนเต็ม (integer) โดยไม่ได้ระบุขอบเขตการเรียกใช้ (access modifier) ทำให้มันมีขอบเขตฯ เป็นแบบ private ไปโดยอัตโนมัติ

public class ShowThumb

โค้ดบรรทัดนี้เป็นตัวอย่างการประกาศคลาสชื่อ ShowThumb

เราจะตั้งชื่อซ้ำกันในพื้นที่ (declaration space) เดียวกันไม่ได้ ยกตัวอย่างเช่นใน method หนึ่งจะประกาศตัวแปรสองตัวที่มีชื่อเดียวกันไม่ได้ หรือจะประกาศคลาสสองคลาสที่มีชื่อเดียวกันภายใน name space เดียวกันไม่ได้

เราจะประกาศตัวแปรตามลำดับอย่างไรก็ได้ตามใจชอบ แต่จะเรียกใช้ตัวแปรก่อนการประกาศตัวแปรนั้นๆ ไม่ได้ ตัวแปรท้องถิ่น (เช่นตัวแปรภายใน method) จะมีขอบเขตอยู่ภายใน block นั้นๆ จะถูกสร้างเมื่อโปรแกรมทำงานมาถึงคำสั่งบรรทัดที่ประกาศตัวมัน และจะถูกทำลายเมื่อโปรแกรมออกจาก block ที่มันอาศัยอยู่ กรุณาดูตัวอย่างโค้ดต่อไปนี้

for (int i = 0; i < 10; i++)
{
     Console.WriteLine(i.ToString())
}

ในตัวอย่างนี้ block คือ block ของคำสั่ง for ซึ่งอยู่ระหว่างวงเล็บปีกกาทั้งสอง ที่บรรทัดคำสั่ง for มีการสร้างตัวแปรแบบ int ชื่อ i ซึ่งจะเรียกใช้งานได้ภายใน block ของ for เท่านั้น เมื่อ for จบการทำงานและออกจาก block นี้ตัวแปร i จะหายไป

 

ไบรอัน ดับเบิลยู เคอร์นิฮัน (Brian Wilson Kernighan) นักวิทยาศาสตร์คอมพิวเตอร์แห่งห้องทดลองเบลล์ เขาเป็นผู้ร่วมเขียนตำรา The C Programming Language และเป็นคนแรกที่ริเริ่มธรรมเนียม Hello, world 

 

array

array คือตัวแปรตัวเดียวแต่เก็บข้อมูลได้เป็นชุดเหมือน table ในฐานข้อมูล คือสามารถกำหนดให้มีกี่ column กี่ row ก็ได้ ยกตัวอย่างเช่น

int[] foo;

foo = new int[5];

คำสั่งสองบรรทัดนี้ประกาศ array ซึ่งมี type เป็น int มีขนาด column เดียว จำนวนห้า row หรือเรียกอีกอย่างหนึ่งว่าเป็น array มิติเดียว (single dimension) row แต่ละ row ใน array เรียกว่า array element (เรียกย่อๆ ว่า AE) วิธีนำ array ไปใช้งานเป็นดังนี้

foo[0] = 12;
foo[1] = 5;
foo[2] = 123;
foo[3] = 777;
foo[4] = 987;

การใช้งาน array เราสามารถอ้างถึง AE ของ array ได้โดยใช้วงเล็บเหลี่ยมตามด้วยตัวเลขระบุ AE เรียกว่า array index (เรียกย่อว่า AI) ในภาษา C# AI จะเริ่มด้วยเลขศูนย์ ดังนั้นในตัวอย่างนี้เราประกาศ array ขนาด 5 AE ดังนั้น AI จึงมีค่า 0 ถึง 4

โปรดอย่าสับสนระหว่างตัวเลขกำหนด AE ขณะประกาศ array กับตัวเลข AI ขณะใช้งาน array แม้ทั้งสองจะอยู่ในวงเล็บเหลี่ยมเหมือนกัน แต่เป็นคนละเรื่องกัน ให้จำไว้ว่า AI แรกจะเท่ากับ 0 และ AI สุดท้ายย่อมเท่ากับ AE – 1 เสมอ

เราสามารถนำกลไก array มาใช้กับ object ใดๆ ก็ได้ แม้แต่ object ที่เรานิยามขึ้นเอง โปรดพิจารณาตัวอย่างโค้ดต่อไปนี้

1   public class test
2   {
3      string s;
4      public string S
5      {
6         get { return s; }
7       set { s = value; }
8      }
9   }
10
11 class Program
12 {
13    static void Main(string[] args)
14    {
15    test[] myTest;
16    myTest = new test[10];
17
18    for (int i = 0; i < 3; i++)
19       myTest[i] = new test();
20
21    myTest[0].S = "aaa"
22    myTest[1].S = "bbb"
23    myTest[2].S = "ccc"
24
25    for (int i = 0; i < 3; i++)
26       Console.WriteLine(myTest[i].S);
27    Console.ReadLine();
28    }
29 }

โค้ดที่เห็นข้างบรรทัดที่ 1 ถึง 9 นิยามคลาสชื่อ test ซึ่งเป็นคลาสที่มีสมาชิกสองตัวคือ filed s และ property S ไว้ใช้งานคู่กัน ถัดบรรทัดที่ 11 ถึง 30 คือคลาส Program ซึ่งทำหน้าที่เป็น client class เรียกใช้ test บรรทัดที่ 15 สร้าง array ชื่อ myTest เป็นตัวแปรอ้างอิง object กำหนดให้มี type เป็น test และใส่เครื่องหมายวงเล็บเหลี่ยมไว้หลัง test ด้วยเพื่อระบุว่านี่เป็นการประกาศ array

บรรทัดที่ 16 กำหนดจำนวน AE ของ array ให้มีขนาด 10 AE บรรทัดที่ 18,19 สร้าง instance ของคลาส test เป็น array ของ object จำนวน 3 ตัว (อันที่จริงเป็น array ของตัวแปรที่ใช้อ้างอิง object และในคำสั่งสองบรรทัดนี้เราสร้าง instance ของ object ขึ้นมาสาม instance ด้วยเช่นกัน) บรรทัด 21, 22, 23 set property S ของ object แต่ละตัวให้เป็น aaa,bbb และ ccc ตามลำดับ เพื่อเป็นการทดสอบว่า object แต่ละสามารถเก็บข้อมูลได้ถูกต้องหรือไม่ บรรทัด 25,26

จะเห็นว่าการสร้าง array ของ object ทำได้ง่ายพอๆ กับการสร้าง array ของ value type โปรดอย่าสับสนระหว่าง object array กับ indexer เพราะเป็นคนละเรื่องกัน indexer เป็นการทำงานกับกลุ่ม object ย่อย ที่อยู่ภายใน object หลัก (กรุณาดูเรื่อง indexer ในบทที่ 5)

 

สรุปท้ายบท

ทั้งหมดในบทนี้คือพื้นฐานภาษา C# หากท่านเคยเขียนโปรแกรมภาษา C, C++ Java หรือ PHP มาก่อนท่านจะพบว่าบทนี้ไม่มีอะไรแปลกใหม่มากนัก แต่ถ้าท่านเป็นมือใหม่ เนื้อหาในบทนี้นับว่าเข้มข้นและมีสิ่งใหม่ที่ต้องเรียนรู้มาก หากท่านไม่เข้าใจทุกอย่างโดยสมบูรณ์ก็ไม่เป็นไร เพราะเรื่องทั้งหมดนี้ผู้เขียนจะอธิบายอีกครั้งในภาคปฏิบัติ บทต่อไปเป็นเรื่องภาษา C# ที่ลึกขึ้นอีกระดับ แต่ก็เป็นเรื่องที่นักเขียนโปรแกรมภาษา C# ทุกคนจำเป็นต้องรู้

 

คำถามท้ายบท

  1. อะไรทำให้ภาษา C# เป็นภาษาที่ทนทาน
  2. คุณสมบัติอะไรที่มีในภาษา C# แต่ไม่มีในภาษา C++
  3. จงเขียนโปรแกรม hello world และทดสอบโปรแกรม
  4. คุณสมบัติอะไรในภาษา C# ที่คล้ายคุณสมบัติที่มีในภาษา Python
  5. จงอธิบายความหมายของคำว่า code behind
  6. Value Type คืออะไร
  7. Reference Type คืออะไร
  8. การทำ Boxing และ Unboxing คืออะไร
  9. ข้อแตกต่างที่สำคัญระหว่างคลาสและ struct คืออะไร
  10. นิพจน์คืออะไร

ตอนต่อไป : Statement

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • ชฏารัตน์  On พฤศจิกายน 15, 2007 at 3:25 pm

    เฉลยคำถามด้วยได้ไหม๊ค่ะ

  • Unknown  On สิงหาคม 18, 2008 at 5:30 pm

    Welcome to enter (wow gold) and (wow power leveling) trading site, (Rolex) are cheap, (World of Warcraft gold) credibility Very good! Quickly into the next single! Key words !

ใส่ความเห็น

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: