การสร้างเมธอด (method) ในภาษา C#

ในการเขียนโปรแกรมขนาดใหญ่ที่ประกอบด้วยการทำงานหลายส่วน การเขียนโปรแกรมที่ดีต้องแบ่งการทำงานออกเป็นส่วนย่อย หรือโมดูล (modules) โดยแต่ละโมดูลมีงานการทำงานทีเป็นอิสระต่อกัน ในภาษา C# เรียกโมดูลนี้ว่า เมธอด (method) แต่สำหรับภาษาอื่นๆ เช่น C, JavaScript หรือ PHP จะเรียกว่า ฟังก์ชัน (function)
ลักษณะของเมธอดคือเป็นชุดของคำสั่งที่อยู่ภายในเครื่องหมายปีกกา (curry brace)

ประโยชน์ที่ได้จากเขียนโปรแกรมให้อยู่ในรูปแบบโมดูลหรือเมธอด 

รูปแบบของเมธอดในภาษา C#

r_type m_name(param_type, param_name, param_type param_name, ...)
{
  //method body

}

ความหมาย
r_type  คือ ประเภทข้อมูลของค่าที่ส่งคืน ถ้าเมธอดที่สร้างขึ้นมาไม่มีการส่งค่าคืนก็ให้ใส่ void 

m_name คือ ชื่อเมธอด

param_type คือประเภทข้อมูลของตัวแปรที่ไว้รับค่าจากภายนอกเข้ามาใช้ในเมธอด

param_name คือชื่อตัวแปรที่ไว้รับค่าจากภายนอกเข้ามาใช้ในเมธอด

ดังนั้นเมธอดจึงมีลักษณะโดยทั่วไปดังนี้

Main เมธอด
โปรแกรมที่สร้างด้วยด้วยภาษา C# จำเป็นต้องมี Main เมธอด แต่โดยปกติแล้วเมื่อสร้าง project ขึ้นใหม่ Visual Studio (เครื่องมือในการพัฒนาโปรแกรมด้วย .NET Framework) จะสร้าง Main เมธอดให้โดยอัตโนมัติ Main เมธอดเป็นเมธอดที่เป็นจุดเริ่มต้นการทำงานของโปรแกรม กล่าวคือ เมื่อเปิดโปรแกรมขึ้นมา Main เมธอดจะถูกเรียกใช้งานเป็นที่แรกโดยอัตโนมัติ
ดังนั้นคำสั่งต่างๆ ที่อยู่ภายใน Main เมธอดจะถูกเรียกใช้ทันที

รูปแบบของ Main เมธอด

static void Main(string[] args)
{

}

จะเห็นว่า Main เมธอดเป็นเมธอดที่ไม่มีการส่งค่าคืน เพราะมี void อยู่หน้าชื่อเมธอด และสามารถรับค่ามาจากภายนอกผ่านตัวแปรแบบอาเรย์ของข้อความ (array of string) ที่ชื่อว่า args 
เราสามารถส่งค่าให้ Main เมธอดผ่านทาง command line argument

ต่อไปจะขอยกตัวอย่างการสร้างเมธอดโดยเริ่มจาก

เมธอดแบบง่ายที่ไม่มีการคืนค่า ไม่การรับค่าจากภายนอก

public void SayHello()
{
   Console.WriteLine("Hello World");
}

คำอธิบาย
เมธอดนี้มีการทำงานแสดงข้อความว่า Hello World ออกสู่หน้าจอ Command Promp หรือหน้าจอดำแบบ DOS

ผลลัพธ์

Hello

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

ตัวอย่างการเรียกใช้เมธอด

 static void Main(string[] args)
 {
    SayHello();
 }

 static void SayHello()
 {
    Console.WriteLine("Hello World");
 }

ผลลัพธ์

Hello World

 
Return Value
เมธอดสามารถคืนค่า (return value) หลังจากที่ทำงานเสร็จแล้ว ดังนั้น เราจึงสามารถสร้างตัวแปรมาเก็บค่าที่คืนกลับมาเพื่อนำไปใช้ต่อภายโปรแกรมได้
จะส่งค่าออกไปจากเมธอดหลังจากที่เมธอดทำงานเสร็จแล้วได้อย่างไร? การส่งค่าออกไปจากเมธอดทำได้โดยใช้คำสั่ง return ตามด้วยค่าที่ต้องการส่งออกไป
ข้อมูลหรือตัวแปรที่จะส่งออกไปจากเมธอดต้องมีชนิดข้อมูลตรงกับชนิดข้อมูลที่ได้ประกาศไว้หน้าชื่อของเมธอด
 
หากเมธอดใดไม่มีการคืนค่ากลับไปให้ใส่ void ไว้หน้าชื่อเมธอด อย่างไรก็ตามภายในเมธอดก็ยังสามารถใช้ return; แบบไม่มีค่าส่งออกไปจากเมธอด แต่จะเป็นสั่งที่ให้สิ้นสุดการทำงานของเมธอด คือให้ออกจากเมธอดไปเลย
 
ตัวอย่างเมธอดที่มีการคืนค่า
        static void Main(string[] args)
        {
            string message = Hello();

            Console.WriteLine(message);
        }

        static string Hello()
        {
            return "Hello";
        }

คำอธิบาย
เมธอดชื่อว่า Hello คืนค่าเป็นข้อความ (string) เพราะได้ระบุประเภทข้อมูลของค่าที่จะคืนจากเมธอดเป็น string ไว้หน้าชื่อเมธอด
ภายในเมธอดมีการใช้คำสั่ง return ตามด้วยคำว่า "Hello" ซึ่งข้อมูลประเภท string ตรงกับประเภทข้อมูลที่ระบุไว้หน้าเมธอด
หากค่าที่ return ออกไปไม่ตรงกับประเภทข้อมูลที่ได้ระบุไว้หน้าเมธอด โปรแกรมจะ complie ไม่ผ่านและไม่สามารถทำงานได้

ผลลัพธ์
 
Hello
 
พารามิเตอร์ (parameter) และอาร์กิวเมนต์ (argument)
พารามิเตอร์คือตัวแปรที่รับค่าที่ส่งเข้ามาในเมธอด เพื่อใช้งานภายในเมธอด
อาร์กิวเมนต์คือค่าหรือตัวแปรที่ส่งให้กับเมธอดตอนที่เรียกใช้เมธอด

อาร์กิวเมนต์ที่จะส่งให้กับเมธอดต้องมีประเภทข้อมูลตรงกับประเภทข้อมูลของพารามิเตอร์ที่จะรับค่า หากประเภทของข้อมูลไม่ตรงกันโปรแกรมก็จะ compile ไม่ผ่าน
 
ตัวอย่างเมธอดที่มีการรับค่าเข้ามา แต่ไม่มีการคืนค่ากลับไป
      static void Main(string[] args)
        {
            double myWidth = 50;
            double myHeight = 20;

            GetRectangleArea(myWidth, myHeight);//myWidth และ myHeight เป็น argument
        }

        static void GetRectangleArea(double width, double height)//width และ height เป็น parameter
        {
            double area = width * height;

            Console.WriteLine("Area of this ractangle is {0} square unit.", area);
        }  

คำอธิบาย

ภายใน Main เมธอดมีการเรียกใช้เมธอด GetRectangleArea เนื่องจากเมธอดนี้ต้องการรับค่าความกว้างและความยาว เพื่อคำนวณหาพื้นที่รูปสี่เหลี่ยม
การเรียกใช้งานจึงต้องมีการระบุค่าความกว้างยาวให้กับเมธอดด้วย โดยการส่งค่าความกว้างและยาวผ่านตัวแปร myWidth และ myHeigh

ผลลัพธ์

Area of this ractangle is 1000 square unit.

ตัวอย่างเมธอดที่มีการรับค่าเข้ามา และมีการส่งคืนค่ากลับไป

static void Main(string[] args)
        {

            double myRadius = 14;
            
            double myArea = GetCircleArea(myRadius);//สร้างตัวแปร myArea รับค่าที่ส่งคืนมาจาก GetCircleArea
 เมธอด

            Console.WriteLine("Area of this circle is {0} square unit.", myArea);

        }

        static double GetCircleArea(double radius)
        {
            double area = (22/7) * radius * radius;

            return area;
        }

คำอธิบาย
ในตัวอย่างนี้จะแตกต่างกับตัวอย่างที่ผ่านมาคือ เมธอดนี้มีการส่งค่าคืนหลังจากที่ทำงานเสร็จแล้ว เราจึงสามารถสร้างตัวแปรในตัวอย่างนี้คือ myArea
รับค่าพื้นที่ที่คำนวณได้จากการเรียกใช้เมธอด GetCircleArea แล้วนำค่าที่เก็บไว้ในตัวแปร myArea ไปแสดงผลที่หน้าจอ

ผลลัพธ์

Area of this circle is 588 square unit.


Passing by Value vs Passing by Reference
 
เมื่อมีการส่งค่าอาร์กิวเมนต์ให้กับเมธอด โดยปกติหากพารามิเตอร์ของเมธอดเป็นตัวแปรประเภท value type
ค่าอาร์กิวเมนต์ที่ตัวแปรภายนอกเก็บไว้จะถูก copy ไปเก็บไว้ในตัวแปรพารามิเตอร์ที่ถูกสร้างขึ้นมาใหม่เพื่อใช้ภายในเมธอด
ตัวแปรอาร์กิวเมนต์และตัวแปรพารามิเตอร์จึงเป็นคนละตัวมีความเป็นอิสระต่อกัน การเปลี่ยนแปลงค่าใดๆ ของตัวแปรพารามิเตอร์ไม่มีผลต่อตัวแปรอาร์กิวเมนต์
เรียกการส่งค่าไปให้เมธอดแบบนี้ว่า passing by value เป็นการส่งค่าให้กับเมธอด
 
ตัวอย่าง pass by value
        static void Main(string[] args)
        {
            int myNumber = 5;
            Console.WriteLine("before calling method, myNumber = {0}", myNumber);
            myNumber = DoubleNum(myNumber);
            Console.WriteLine("after calling method, myNumber = {0}", myNumber);
        }

        static int DoubleNum(int val)
        {
            val = val * 2;
            return val;
        }
ผลลัพธ์
 
before calling method, myNumber = 5
after calling method, myNumber = 10

แต่ถ้าตัวแปรพารามิเตอร์เป็นตัวแปรแบบ reference type การส่งค่าให้กับเมธอด จะทำใหัตัวแปรพารามิเตอร์อ้างอิงถึง object ที่เก็บค่าอาร์กิวเมนต์ หรือพูดได้อีกอย่างหนึ่งว่าตัวแปรอาร์กิวเมนต์และตัวแปรพารามิเตอร์ต่างชี้ไปยังตำแหน่งที่เก็บค่าจริงๆ ของข้อมูล การเปลี่ยนแปลงค่าของตัวแปรพารามิเตอร์ทำให้าค่าของตัวแปรอาร์กิวเมนต์เปลี่ยนไปด้วย เพราะตัวแปรทั้งคู่ต่างอ้างอิงถึงค่าเดียวกัน เรียกการส่งค่าให้กับเมธอดแบบนี้ว่า pass by reference การส่งข้อมูลให้กับพารามิเตอร์ที่มีประเภทข้อมูลเป็น reference type (class ต่างๆ ) จะเป็นการส่งแบบ pass by reference โดยอัตโนมัติ หรืออาจกล่าวได้ว่า passing by reference เป็นการส่งตัวแปรให้กับเมธอด
 
อย่างไรก็ตามเราก็สามารถส่งค่าให้กับเมธอดแบบ pass by refence ให้กับตัวแปรพารามิเตอร์ที่มีประเภทข้อมูลแบบ value type ได้ ด้วยการใช้ ref keyword ไว้หน้าประเภทข้อมูลของพารามิเตอร์ การใช้ ref keyword ต้องมีการกำหนดค่าเริ่มต้นให้กับตัวแปรอาร์กิวเมนต์ และตอนเรียกใช้เมธอดต้องระบุคำว่า ref ไว้หน้าตัวแปรอาร์กิวเมนต์ภายในวงเล็บ
 
ตัวอย่าง pass by reference โดยใช้ ref keyword
       static void Main(string[] args)
        {
            int myNumber = 5;//ต้องมีการำหนดค่าเริ่มต้นให้กับตัวแปร myNumber
            Console.WriteLine("before calling method, myNumber = {0}", myNumber);
            myNumber = DoubleNum(ref myNumber);/;ระบุคำว่า ref ไว้หน้าตัวแปรอาร์กิวเมนต์
            Console.WriteLine("after calling method, myNumber = {0}", myNumber);
        }

        static int DoubleNum(ref int val)
        {
            val = val * 2;
            return val;
        }
ผลลัพธ์
 
before calling method, myNumber = 5
after calling method, myNumber = 10
 
Swap เมธอด ด้วย ref
Swap เมธอดเป็นเมธอดสำหรับสลับค่าของตัวแปรสองตัว สามารถสร้างขึ้นมาได้ด้วยการใช้ keyword ref เข้ามาช่วย
 
ตัวอย่าง Swap เมธอด
        static void Main(string[] args)
        {
            int foo = 2;
            int bar = 5;

            Console.WriteLine("before calling Swap, foo = {0} bar = {1}", foo, bar);

            //call Swap method
            Swap(ref foo, ref bar);

            Console.WriteLine("after calling Swap, foo = {0} bar = {1}", foo, bar);
        }

        static void Swap(ref int foo, ref int bar)
        {
            int tmp = foo;
            foo = bar;
            bar = tmp;
        }
ผลลัพธ์
 
before calling Swap, foo = 2 bar = 5
after calling Swap, foo = 5 bar = 2
Press any key to continue . . .
 
out parameter
มีการทำงานเช่นเดียวกับการใช้ ref keyword แต่ไม่ต้องมีการกำหนดค่าเริ่มต้นให้กับตัวแปร argument เหมือนกับ ref parameter
และก่อนที่เมธอดจะสิ้นสุดการทำงานต้องมีการกำหนดค่าให้กับตัวแปรพารามิเตอร์แบบ out ด้วย
 
ตัวอย่างการใช้ out parameter
        static void Main(string[] args)
        {
            int myNumber = 7;
            int myDivisor = 3;
            int myRemaider;// ไม่ต้องกำหนดค่าเริ่มต้น

           int result = Divide(myNumber, myDivisor, out myRemaider);//ระบุคำว่า out ไว้าหน้าตัวแปรอาร์กิวเมนต์

            Console.WriteLine("result = {0} remainder = {1}", result, myRemaider);
        }

        static int Divide(int number, int divisor, out int remainder)
        {
            int result = number / divisor;
            remainder = number % divisor;
            return result;
        }
ผลลัพธ์
 
result = 2 remainder = 1
Press any key to continue . . .
 
download source code ตัวอย่าง  click เพื่อ download

ความเห็น

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Friends
jirawat.in.th clipdonjai.com janawat.wordpress.com csharp89.blogspot.com 108blog.net

HTML5 Powered with Multimedia