ตอน 14 : โปรแกรม Hello world

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


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

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

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

 

 

โปรแกรม Hello world

 

ข้างล่างนี้คือโค้ดภาษา C# ที่สั้นที่สุด ทำหน้าที่พิมพ์คำว่า Hello world บนจอภาพ

 

using System;

public class Hello
{
     static void Main()
     {
          Console.WriteLine("Hello world");
     }
}

 

นี่เป็นโปรแกรมแบบ Console application คือไม่มีกรอบวินโดว์ (WinForm) แต่จะแสดงการทำงานเลียนแบบเท็กซ์โหมดเหมือนโปรแกรมใน MS-DOS

using System;

บรรทัดแรกทำหน้าที่บอกให้ตัวแปลภาษา (compiler) นำ name space ชื่อ System ซึ่งอยู่ใน .NET Framework Class library มารวมไว้ใน name space ของคลาสนี้ด้วย

public class Hello

บรรทัดนี้ทำหน้าที่ประกาศชื่อคลาส คำว่า public ทำหน้าที่กำหนดว่าคลาสนี้ใครก็นำไปใช้งานได้

static void Main()

บรรทัดนี้ทำหน้าที่ประกาศชื่อ method ซึ่งเป็นสมาชิกของคลาส Hello method ชื่อ Main() เป็น method พิเศษซึ่งจะเริ่มทำงานก่อนโดยอัตโนมัติเมื่อเราสั่งให้โปรแกรมทำงาน คำว่า static เป็น keyword ทำหน้าที่บอกว่า method นี้เป็น method ของ type นี้ มิได้เป็น method ของ object

Console.WriteLine("Hello world");

คำสั่งบรรทัดนี้ทำหน้าที่แสดงข้อความ Hello world บนจอภาพโดยเรียกใช้ method WriteLine ซึ่งเป็น method สมาชิกของคลาส Console

 

โครงสร้างของโปรแกรมในภาษา C#

source code ภาษา C# จะถูกเก็บเป็นไฟล์นามสกุล .cs ซึ่งเป็นเท็กซ์ไฟล์ธรรมดา (plain text file) สามารถสร้างจาก text editor อะไรก็ได้ แต่โดยปรกติและเราจะใช้เครื่องมืออำนวยความสะดวก เป็นภาพแวดล้อมที่ช่วยให้พัฒนาได้ง่ายขึ้น (หรือ IDE ย่อจาก Integrated Development Environment) เช่น Visual Studio ของบริษัทไมโครซอฟท์

หากท่านยังไม่ต้องการเสียเงินซื้อ Visual Studio แต่ต้องการ IDE ดีๆ สำหรับการเรียนรู้ บริษัทไมโครซอฟท์มี Visual Studio แบบที่ให้ใช้ได้ฟรีเรียกว่า Express Edition ซึ่งมีประสิทธิภาพใกล้เคียงกับเวอร์ชันปรกติให้ดาวน์โหลดใช้ได้ฟรี โดยแบ่งออกเป็นแบบรวมทุกภาษา และแยกตามภาษาต่างๆ ให้เลือกตามความต้องการ สำหรับผู้ต้องการเขียน web application ก็มี Visual Web Developer 2005 Express Edition ให้ดาวน์โหลดได้ฟรีเช่นกัน

source code ภาษา C# อาจจะประกอบด้วยไฟล์ .cs เพียงไฟล์เดียว แต่ตามปรกติแล้วภายในหนึ่ง project จะประกอบด้วยไฟล์ .cs และไฟล์ชนิดอื่นๆ เป็นจำนวนมาก source code ทั้หงมดอาจจะเป็น name space เดียวกันหรือแยกเป็นหลาย name space ก็ได้ ภายในหนึ่ง name space มักประกอบด้วย คลาส struct, interface, delegate และ enum จำนวนมาก (ดูภาพ 302)

ภาพ 302: โครงสร้างของโปรแกรมในภาษา C#

 

ในกรณีที่เราสร้างโปรแกรมประยุกต์สำหรับใช้งานในเว็บ (Web application software development) จะมีไฟล์ “หน้าเว็บ” (WebForm) เพิ่มขึ้นมาด้วยคู่กับทุก .cs ไฟล์ โดยจะมีนามสกุล .aspx การที่ผู้สร้าง .NET ทำเช่นนี้ก็เพื่อที่จะแยกส่วนแสดงผล (presentation คือไฟล์ .aspx ซึ่งเก็บโค้ด html) ออกจากส่วนประมวลผล (ไฟล์ source code ภาษา C# คือไฟล์นามสกุล .cs) การแบ่งเป็นสองไฟล์เช่นนี้ ช่วยผลกระทบระหว่างกันในกรณีแบ่งงานกันทำระหว่างนักออกแบบทางศิลปะและโปรแกรมเมอร์ (หลักการนี้มักเรียกกว่า code behind)

 

namespace

เพื่อหลีกเลี่ยงการตั้งชื่อ type ซ้ำกันและเพื่อการจัดหมวดหมู่ type ในกลุ่มเดียวกันไว้ด้วยกัน Microsoft .NET Framework (MNF) จึงจัดให้มีระบบที่เรียกว่า Namespace ขึ้น ลองดูตัวอย่างโค้ดต่อไปนี้

 

namespace CsharpBook.Chapter04
{
     class Foo
     {
          public Foo()
          {
               int i;
               Foo f2;
          }
     }
}

 

ผู้เขียนนิยาม namespace ชื่อ CsharpBook.Chapter04 ขึ้น ภายใน Namespace นี้มีคลาสชื่อ Foo อยู่เพียงคลาสเดียว การอ้างถึง type Foo หากอ้างถึงโดยใช้ชื่อเต็ม (fully-qualified class name หรือ FQCN) จะเป็น CsharpBook.Chapter04.Foo

หากผู้เขียนนำโค้ดนี้ไปคอมไพล์ให้เป็นไลบราลี จะได้เป็นไฟล์ assembly แบบ .dll ชื่อ CsharpBook.dll ที่นำไปใช้ใน project อื่นๆ ได้ ผู้ที่นำไปใช้เพียงแค่ add reference ถึงไฟล์นี้ก็จะสามารถเรียกใช้ type Foo ได้โดยระบุ FQCN เป็น CsharpBook.Chapter04.Foo ดังตัวอย่างต่อไปนี้

class Bar

{

    CsharpBook.Chapter04.Foo myFoo = new CsharpBook.Chapter04.Foo();

}

หากผู้นำไลบราลีไปใช้ไม่ต้องการระบุ FQCN เพราะยืดยาวเกินไป ก็สามารถนำ namespace CsharpBook.Chapter04 ผนวกเข้ากับ namespace ของตนได้ จะทำให้สามารถอ้างถึง type Foo ได้เหมือนกับเป็น type ที่อยู่ภายใน namespace ของตน ดังตัวอย่างต่อไปนี้

 

using CsharpBook.Chapter04;
namespace mySpace
{
     class Bar
     {
          Foo myFoo = new Foo();
     }
}

 

ท่านอาจจะคิดเสียว่า namespace คือครอบครัวหนึ่ง ทุกคนในครอบครัวมีนามสกุลเดียวกัน มี 195 ครอบครัวที่สืบเชื่อสายมาจากตระกูลเดียวกันคือ System.Object

เหตุผลที่ผู้สร้าง .NET Framework ตัดสินใจแยกหมวดหมู่คลาสในไลบรารีออกเป็น namespace นอกจากจะเพื่อความสะดวกในการเรียกใช้แล้ว ยังเพื่อป้องกันปัญหาเรื่องการตั้งชื่อคลาสซ้ำกันด้วย ยกตัวอย่างเช่นหากใน namespace aa มีคลาสชื่อ a ใน namespace bb ก็สามารถมีคลาสชื่อ a ได้ด้วย

ผู้สร้าง .NET Framework สนับสนุนให้ผู้เขียนโปรแกรมบน .NET Framework สร้าง namespace ของตนเองขึ้น หาก namespace ครอบคลุม source code ไฟล์หลายไฟล์ จะเรียกกลุ่มไฟล์ที่ประกอบเป็น name space เดียวกันว่า แอสเซมบลี (Assembly อย่าสับสนกับภาษาแอสเซมบลี กรุณาอ่านรายละเอียดเรื่องแอสเซมบลีในหัวข้อถัดไป) ในหนึ่งแอสเซมบลีอาจประกอบด้วยหลาย namespace ก็ได้

สรุปว่า namespace คือวิธีจัดหมวดหมู่ของคลาส โดยใช้ keyword namespace ตามด้วยชื่อของ namespace หากมี namespace ซ้อนกันหลายชั้นให้ใช้เครื่องหมาย จุด ขั้นระหว่าง namespace คลาสใดๆ ที่อยู่ภายในวงเล็บปีกกาของ namespace จะถือว่าเป็นคลาสที่อยู่ใน namespace เดียวกัน

นอกจากคลาสภายใน namespace อาจประกอบด้วยสิ่งอื่น เช่น struc, Interface, Delegate และ enum เป็นต้น

มิใช้เฉพาะไลบรารีที่เราสร้างขึ้นเองที่ใช้หลัก namespace เช่นนี้ แต่ Microsoft .NET Framework Library ก็ใช้หลักการนี้เช่นกัน (ดูรายละเอียดในบทที่ 2 หัวข้อ วิธีเขียนโค้ดเรียกใช้งาน FCL)

แนวคิดเรื่อง namespace ก็เหมือนกับเรื่อง type ที่ไม่ใช่เรื่องของเฉพาะภาษา C# เท่านั้น ภาษาอื่นๆ ใน .NET ล้วนเป็นไปตามแนวคิดนี้ทั้งสิ้น (Java ก็ใช้แนวคิดเดียวกันนี้ด้วย) แต่เนื่องจากภาษา C# เป็นภาษาหลักของ .NET Framework แนวคิดเรื่อง namespace และ type จึงไม่สามารถแยกออกจากภาษา C# ได้

 

Type ในภาษา C#

เมื่อท่านสร้างซอฟท์แวร์ด้วยภาษา C# ท่านจะพบว่าท่านใช้เวลาส่วนใหญ่ไปกับการตรวจหา type ที่ต้องการจาก .NET Framework class library ส่วนเวลาที่เหลือจะหมดไปกับการออกแบบและสร้าง type ของท่านเอง

ในหนังสือเล่มนี้ท่านจะพบคำว่า type บ่อยที่สุด และคำว่า “คลาส” รองลงมา บางครั้งผู้เขียนก็ใช้สองคำนี้สลับกันไปมา สาเหตุที่เป็นเช่นนั้นเพราะหัวใจของ .NET Framework (และ Java platform ด้วย) คือ Type เมื่อท่านเขียนโค้ดในสภาพแวดล้อม .NET ท่านจะหนีเรื่อง Type ไปไม่พ้น เพราะทุกสิ่งทุกอย่างใน .NET Framework คือ type ทั้งนั้น

ผู้สร้าง .NET Framework ต้องการให้ทุกภาษาปราศจาก pointer และทำทุกอย่างได้ด้วย type ทุกภาษาใน .NET จึงมีคุณสมบัติ Type-safe ซึ่งช่วยป้องกันมิให้โปรแกรมเข้าถึงตำแหน่งในหน่วยความจำที่ไม่ได้รับอนุญาต โปรแกรมที่ทำงานใน .NET Framework จึงไม่กวนระบบ นี่เป็นจุดแข็งข้อหนึ่งของ .NET

ในเมื่อเราสามารถใช้ type สร้าง object ได้ คำพูดว่าทุกสิ่งทุกอย่างใน .NET มาจาก type ก็เท่ากับพูดว่าทุกสิ่งทุกอย่างใน .NET มีสภาพเป็น object ไปหมด และเมื่อตรวจสอบการสืบสันดานย้อนขึ้นไปแล้วท่านจะพบว่า object ทั้งหมดล้วนสืบทอดมาจากบรรพบุรุษเดียวกัน ต้นตระกูลที่ว่านี้คือ type ที่มีชื่อว่า System.Object

นอกจาก System.Object แล้ว ใน .NET Framework ยังมี type จำนวนมากเตรียมไว้ให้ท่านเลือกใช้ คือมีอยู่ประมาณ 7,500 คลาส แม้จะมีจำนวนมาก การเลือกใช้คลาสเหล่านี้กลับไม่ยาก เพราะมันถูกจัดหมวดหมู่ไว้เป็นอย่างดี หมวดหมู่เหล่านี้เรียกว่าnamespace ซึ่งคลาสไลบรารีจะถูกแบ่งออกเป็น namespace ทั้งหมดจำนวน 195 namespace ตามประเภทการใช้งาน

การเขียนโค้ดใน .NET Framework เรื่องของ type เป็นเรื่องที่ลึกซึ้งกินใจมาก แต่ก่อนหน้าสมัย .NET คือสมัยการเขียนโค้ดยุค Win32 SDK ก็ใช่ว่าจะไม่มีคำว่า type แต่สมัยนั้นคำว่า type ไม่มีอะไรพิเศษ โดยทั่วไปจะหมายถึง data type สำหรับ primitive type อาทิ จำนวนเต็ม จำนวนจริง บูลลีน เป็นต้น ยกตัวอย่างคำสั่งบรรทัดนี้

int foo;

เป็นการสร้างตัวแปรที่มี data type เป็นแบบจำนวนเต็ม (integer) คำว่า type ในบริบทนี้มีมานานแล้วตั้งแต่สมัยภาษาซีใน Unix ภาษา C# ก็มี data type ในลักษณะนี้ (บางทีเรียก build-in data type) แต่คำว่า type ใน .NET Framework กินความกว้างกว่านั้นเพราะมี type ที่เกิดจากคลาสด้วย

หมายเหตุ: data type กับ abstract data มีความคล้ายคลึงกัน ยกเว้นว่าหากพูดถึง abstract data มักหมายถึงการนิยามทั้งชนิดของข้อมูล และวิธีที่ operator กระทำกับ type ใดๆ

ต้นตอของ type (ที่มาจากคลาส) เริ่มในช่วงทศวรรษ 1960 เมื่อนักคอมพิวเตอร์ชาว นอร์เวย์ กลุ่มหนึ่งได้คิดประดิษฐ์ภาษา Simula (อ่านว่าซิมูลา) ขึ้นมา หลักการคิดของภาษานี้ให้ความหมายใหม่ให้แก่คำว่า type ซึ่งเป็นนิยามที่ตรงกับคำว่า type ที่เรากำลังพูดถึงกันอยู่ขณะนี้ เพราะคณะบุคคลที่ออกแบบ .NET Framework ได้ยึดถือหลักการบางอย่างที่มีในภาษา Simula ด้วย และเป็นการยึดถือแบบสุดขั้ว เพราะผู้ออกแบบ .NET Framework ได้เปลี่ยนทุกสิ่งทุกอย่างให้กลายเป็น type ไปทั้งหมดแม้แต่ primitive type (อย่าง integer) บัดนี้ได้กลายเป็น type ในนิยามแบบนี้ไปแล้วเช่นกัน

สาเหตุที่ผู้สร้าง .NET Framework ทำเช่นนี้ก็เพราะต้องการลดความซับซ้อนในการเขียนโปรแกรมสำหรับระบบปฏิบัติการ Windows การเขียนโปรแกรมแบบ Win32 ท่านต้องเรียนรู้วิธีเรียกใช้ฟังก์ชัน API ต่างๆ ที่มีเพิ่มขึ้นเรื่อยๆ ฟังก์ชันจำนวนมากที่มีลักษณะซ้ำซ้อน ทำให้นักเขียนโปรแกรมเริ่มมองว่าการเขียนโปรแกรมสำหรับทำงานในระบบปฏิบัติการ Windows ยุ่งยากมาก

ทีมผู้สร้าง .NET Framework แก้ปัญหานี้โดยนักเขียนโค้ดยุติการเขียนโปรแกรมแบบเรียกใช้ฟังก์ชัน API (รวมทั้ง Microsoft foundation class ด้วย) แล้วสร้าง Framework class library ขึ้นมาแทน โดยไลบรารีนี้มีคลาสต่างๆ ประมาณ 7,500 คลาสๆ เหล่านี้มีจุดเด่นที่สามารถสืบทอดคุณสมบัติตามลำดับได้ ทำให้การเพิ่มเติมคุณสมบัติใหม่ๆ เข้าไปใน Framework สามารถทำได้โดยไม่เกิดการซ้ำซ้อน ยกตัวอย่างเช่น เมื่อทีมงานต้องการเพิ่ม method ให้คลาสใด ก็สามารถใช้ชื่อซ้ำกับ method ที่มีอยู่แล้วได้ เพียงแค่กำหนด signature ของ method ใหม่ให้แตกต่างจากเดิมก็ใช้ได้แล้ว (คือการทำ method overloading โปรดอ่านรายละเอียดเรื่อง method overloading ในบทที่ 4)

 

Value type

ความเข้าใจว่า type คืออะไร ตัวแปรคืออะไร value type กับ reference type เหมือนหรือแตกต่างกันอย่างไร เป็นสิ่งสำคัญอย่างที่สุดในการเขียนโปรแกรมทุกภาษา โดยเฉพาะอย่างยิ่งภาษา C# ดังนั้นขอให้ท่านอ่านสองหัวข้อต่อไปนี้ให้เข้าใจ ลองดูตัวอย่างโปรแกรมต่อไปนี้

int foo = 4;

int bar = 12;

foo = foo + bar;

บรรทัดแรกคำสั่ง int เป็น keyword ในภาษา C# ทำหน้าที่กำหนด type (primitive type) ของตัวแปร คำว่า int ย่อมาจากคำว่า integer (อ่านว่าอินทีเจอร์ แปลว่าเลขจำนวนเต็ม) การเก็บเลขจำนวนเต็มแบบ int ของ .NET จะใช้เนื้อที่ในหน่วยความจำขนาด 32 บิต หากใช้เพื่อเก็บจำนวนเต็มลบและจำนวนเต็มบวกจะเก็บค่าได้สูงสุดภายในย่าน -2,147,483,648 ถึง 2,147,483,647

สมมุติว่าผู้เขียนคอมไพล์โปรแกรมนี้ และสั่งให้ทำงาน CLR (Common Language Runtime เป็นส่วนหนึ่งของ .NET) จะทำหน้าที่จัดสรรหน่วยความจำ (คือ RAM ที่อยู่บนเมนบอร์ด) เพื่อใช้เก็บข้อมูลต่างๆ ในโปรแกรม เมื่อ CLR เห็นคำสั่ง int foo = 4; (ซึ่งอยู่ในสภาพโค้ดภาษาเครื่อง) มันจะสร้างกล่องใบหนึ่ง เป็นกล่องที่มีความโตขนาด 32 บิต และติดป้ายชื่อไว้ว่า foo (คำว่า foo ไม่มีความหมายอะไรพิเศษ จะใช้ชื่ออะไรก็ได้) จากนั้น CLR จะนำเลข 4 ไปใส่ในกล่องนี้ (ดูภาพ 303)

 

ภาพ 303: CLR จองหน่วยความจำขนาด 32 บิตเพื่อเก็บค่า int

 

ในภาพ 303 ท่านจะเห็นหน่วยความจำ RAM มีสภาพเป็นกล่องสิบสองใบ (ในการใช้งานจริงอาจมีหลายล้าน ใบ) หนึ่งใบเท่ากับ 8 บิต หรือหนึ่งไบต์ เมื่อเราใช้คำสั่ง int CLR จะรู้ทันทีว่าต้องจองพื้นที่ในหน่วยความจำสี่ไบต์ (เพราะสี่ไบต์เท่ากับ 32 บิต) มันจึงจองไบต์ที่ 1 ถึงไบต์ที่ 4 ไว้และติดป้ายชื่อไว้ว่า foo ซึ่งเป็นชื่อของตัวแปรที่เรากำหนด จากนั้น CLR จะนำเลข 4 ไปใส่ไว้ในหน่วยเก็บข้อมูลนี้

int bar = 12;

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

 

ภาพ 304: สภาพของหน่วยความจำเมื่อสร้างตัวแปร bar เสร็จแล้ว

 

foo = foo + bar;

คำสั่งบรรทัดนี้สั่งให้นำค่าของตัวแปร foo มาบวกกับค่าของตัวแปร bar ได้ผลลัพธ์เท่าใดให้นำไปเก็บไว้ในตัวแปร foo (ดูภาพ 305)

 

ภาพ 305 การนำค่าจากตัวแปรสองตัวมาบวกกัน

 

ค่าของตัวแปร foo คือ 4 นำมาบวกกับค่าของตัวแปร bar ซึ่งเป็น 12 ผลลัพธ์ที่ได้คือ 16 CLR จะนำค่านี้ไปเก็บไว้ในตัวแปร foo ดังนั้นเมื่อโปรแกรมนี้จบการทำงาน ค่าของตัวแปร foo จะเท่ากับ 16 (ดูภาพ 306)

 

ภาพ 306: สภาพของหน่วยความจำหลังจากทำคำสั่งสุดท้ายเสร็จแล้ว

 

จากตัวอย่างโปรแกรมที่อธิบายมานี้ท่านจะเห็นว่าตัวแปรเก็บค่าโดยตรง เมื่อมีการเปลี่ยนแปลงค่า (ในตัวอย่างคือผลลัพธ์จากการบวก) สิ่งที่เก็บอยู่ในตัวแปรก็จะเปลี่ยนไปโดยตรง การเก็บข้อมูลลักษณะนี้เรียกว่า value type

ในภาษา C# สิ่งที่เป็น value type คือบรรดาตัวแปรชนิดจำนวนเต็มต่างๆ (integral type) จำนวนมีทศนิยม (floating-point และ decimal type) ตัวแปรแบบ บูลลีน และโครงสร้างข้อมูลที่ผู้ใช้กำหนดเอง (user defined type หรือ struct)

ต่อไปลองดูโปรแกรมตัวอย่างที่เป็น struct บ้าง

 

public struct Sample

{

     public int foo;

}

 

นี่คือโค้ดที่จะสร้างโครงสร้างข้อมูลแบบผู้ใช้กำหนดเองหรือ struct ผู้เขียนตั้งชื่อมันว่า Sample และผู้เขียนกำหนดให้ struct ตัวนี้มีสมาชิกเพียงตัวเดียวชื่อ foo ซึ่งเป็นตัวแปรแบบเลขจำนวนเต็ม

 

Sample first = new Sample

first.foo = 5;

Sample second = first;

first.foo = 6;

Console.writeLine(second.foo);

 

คำสั่งบรรทัดแรกสร้าง object ชื่อ first จาก struct บรรทัดที่สองนำ 5 ไปเก็บในตัวแปร foo ซึ่งเป็นสมาชิกของ object ชื่อ first บรรทัดที่สามสร้าง object อีกตัวชื่อ second บรรทัดที่สี่นำ 6 ไปเก็บในตัวแปร foo ของ object second บรรทัดสุดท้ายสั่งให้แสดงค่าในตัวแปร foo ของ object second บนจอภาพ ท่านคิดว่าผลลัพธ์ที่ได้คืออะไร

 

คำตอบคือ 5

 

ทำไมจึงเป็นเช่นนั้น? สาเหตุที่เป็นเช่นนั้นเพราะทั้ง first และ second เป็น object ที่ถูกสร้างจาก struc มันจึงเป็น object แบบ value type และเนื่องจาก object ที่เป็น value type มีที่เก็บข้อมูลเป็นของตัวเองในหน่วยความจำ เมื่อเราเปลี่ยนแปลงค่าของ first ค่าของ second จะไม่เปลี่ยนตามไปด้วย

เรื่อง value type เป็นเรื่องปรกติธรรมดา ที่พบได้ทั่วไปในภาษาคอมพิวเตอร์ต่างๆ ยกตัวอย่างเช่น ในภาษาแอสเซมบลี value type เทียบได้กับการอ้างถึงหน่วยความจำแบบ direct addressing

เวลาสร้างตัวแปรแบบ value type ท่านต้องกำหนดค่าให้มันด้วย (initial หรือ assign) มิฉะนั้นเมื่อนำไปใช้จะเกิด compile-time error ยกตัวอย่างเช่น

 

int foo;

int bar = 12;

int foo = foo + bar;

 

หากท่านคอมไพล์โปรแกรมนี้ ตัวแปลภาษาจะแจ้งว่าบรรทัดที่สามมีความผิดพลาด เพราะเรานำตัวแปร foo ที่ถูกสร้างแล้วจากบรรทัดที่หนึ่ง แต่ยังไม่ได้ถูกกำหนดค่า (unassigned) ไปใช้งาน ข้อความแจ้งความผิด (error message) ที่ตัวแปลภาษาแสดงคือ Use of unassigned local variable ‘foo’

ตอนต่อไป : Reference type

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • Tiwarat  On ธันวาคม 19, 2006 at 4:13 pm

    ขอบคุณมากๆ นะคะ ให้ความรู้มากๆ เลย จะแวะมาบ่อยๆ นะคะ

  • noon  On เมษายน 19, 2007 at 4:15 pm

    ขอบคุณที่ช่วยหาคำตอบค่ะ ทำให้เข้าใจมากขึ้น เพราะตอนนี้กำลังศึกษาอยู่พอดีค่ะ 
     

  • Chomphun  On มกราคม 10, 2008 at 5:02 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: