ในการเขียนโปรแกรมขนาดใหญ่ที่ประกอบด้วยการทำงานหลายส่วน การเขียนโปรแกรมที่ดีต้องแบ่งการทำงานออกเป็นส่วนย่อย หรือโมดูล (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
static void Main(string[] args)
{
string message = Hello();
Console.WriteLine(message);
}
static string Hello()
{
return "Hello";
}
คำอธิบาย
เมธอดชื่อว่า Hello คืนค่าเป็นข้อความ (string) เพราะได้ระบุประเภทข้อมูลของค่าที่จะคืนจากเมธอดเป็น string ไว้หน้าชื่อเมธอด
ภายในเมธอดมีการใช้คำสั่ง return ตามด้วยคำว่า "Hello" ซึ่งข้อมูลประเภท string ตรงกับประเภทข้อมูลที่ระบุไว้หน้าเมธอด
หากค่าที่ return ออกไปไม่ตรงกับประเภทข้อมูลที่ได้ระบุไว้หน้าเมธอด โปรแกรมจะ complie ไม่ผ่านและไม่สามารถทำงานได้
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
ผลลัพธ์
ตัวอย่างเมธอดที่มีการรับค่าเข้ามา และมีการส่งคืนค่ากลับไป
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.
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;
}
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;
}
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;
}
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;
}