290 likes | 469 Views
6. Method. เมธอดคือหน้าที่การงานของวัตถุให้เรียกใช้. เป้าหมายการเรียนรู้. การนิยามเมทธอด ทั้งสเตติก และอินสแตทซ์เมทธอด เมทธอดโอเวอร์โหลด การใช้ตัวแปรเข้าแบบไดนามิกด้วยอะเรย์ ตัวแปรท้องถิ่น ในเมธอด การคืนค่าในเมธอด ตัวแปรทางเลือกของเมทธอด การเรียกเมทธอดด้วยการระบุชื่อตัวแปร
E N D
6. Method เมธอดคือหน้าที่การงานของวัตถุให้เรียกใช้ C# Programming with Visual C# 2010 Express
เป้าหมายการเรียนรู้ • การนิยามเมทธอด ทั้งสเตติก และอินสแตทซ์เมทธอด • เมทธอดโอเวอร์โหลด • การใช้ตัวแปรเข้าแบบไดนามิกด้วยอะเรย์ • ตัวแปรท้องถิ่น ในเมธอด • การคืนค่าในเมธอด • ตัวแปรทางเลือกของเมทธอด • การเรียกเมทธอดด้วยการระบุชื่อตัวแปร • การสร้างเมทธอดอัตโนมัติ • กลไกการส่งตัวแปร และ แนวทางการใช้ตัวแปร • การให้เมทธอดเรียกใช้ตัวเอง C# Programming with Visual C# 2010 Express
อะไรคือเมธอด เมทธอดคือกลุ่มของคำสั่ง ภาษาสมัยใหม่ทุกตัวใช้แนวคิดเดียวกันนี้ เราอาจคิดเปรียบเทียบได้ว่า เมทธอดก็คือ • Function, • Subroutine, • Procedure, • Subprogram เราจะสังเกตได้ง่ายๆ ว่าอะไรเป็นเมทธอด เมทธอดจะมีเครื่องหมาย วงเล็บ “( )” ต่อท้ายชื่อเมทธอด C# Programming with Visual C# 2010 Express
เมธอด Main( ) • class Program • { • static void Main(string[] args) • { • Console.WriteLine( “OK”); • CheckEmpty( ); • } • private static void CheckEmpty() • { } • } สังเกตไหม เมธอด ทำไมต้องเป็น static ด้วย ศึกษาต่อไป ก็จะตอบคำถามนี้ได้ C# Programming with Visual C# 2010 Express
การนิยามเมทธอด • การตั้งชื่อ ชื่อไม่ควรเริ่มต้นด้วย ขีดล่าง ควรใช้อักษรพิมพ์ใหญ่นำหน้า และควรเป็นคำกริยา • การใช้ตัวแปรเข้า จำนวนตัวแปรมีเท่าไหร่ก็ได้ ตัวแปรเข้าแต่ละตัวจะกำหนดชนิดข้อมูลของตัวแปรเข้าด้วย และจะไม่มีตัวแปรเข้าเลยก็ได้ • ทุกคำสั่งภายในเมธอด จะต้องอยู่ภายในเครื่องหมายปีกกา ถึงแม้จะคำสั่งเดียวก็ตาม • เมธอดที่มีการคืนค่า ระบุชนิดข้อมูลการคืนค่าก่อนชื่อเมทธอด และการคืนค่าเป็นชนิดข้อมูลอะไรจะต้องมีคำสั่ง return ภายในส่วนเมธอด • เมธอดใดไม่คืนค่าชนิดข้อมูลอะไร ให้ใช้การคืนค่าเป็น void C# Programming with Visual C# 2010 Express
การเรียกใช้เมธอด • การเรียกเมธอด ทำได้โดยการเรียกชื่อเมธอดแล้วตามด้วยตัวแปรเข้าให้ตรงกับที่ได้นิยามไว้ หรือไม่ต้องมีตัวแปรเข้าในกรณีที่ไม่ได้นิยามตัวแปรเข้าไว้ แต่ยังคงต้องมีวงเล็บว่างไว้ ดังนั้นแล้วจะต้องมีวงเล็บเสมอ • การเรียกเมธอดจากคลาสอื่น • กรณี เป็น static method ทำได้โดยการเรียกชื่อคลาสแล้วตามด้วยชื่อเมธอดที่ต้องการของคลาสนั้น • กรณี ไม่เป็น static method ทำได้โดยการเรียกชื่อ instance แล้วตามด้วยชื่อเม่ธอด C# Programming with Visual C# 2010 Express
การเรียกเมธอดจากต่างคลาสการเรียกเมธอดจากต่างคลาส • class Program { • public static void main( String[ ] args) • { • Example ex = new Example( ); • // ต้องสร้างเป็น Instance ก่อน จึงเรียกเมธอด ผ่านชื่อ instance • ex.C( ); • Example. D( ); // เรียกผ่านชื่อคลาสได้เลย • } • } • Class Example • { • public int C( ) { } • public static int D ( ) { } • } C# Programming with Visual C# 2010 Express
การคืนค่าของเมทธอด • การประกาศเมทธอดเป็นชนิดไม่มี void • เมทธอดชนิดไม่มี void จะต้องมีการคืนค่าเสมอ • การเพิ่มคำสั่งคืนค่าด้วย return static int TwoPlusTwo( ) { int a,b; a = 2; b = 2; return a + b; } C# Programming with Visual C# 2010 Express
การใช้คำสั่ง Return • Return ทันที • Return แบบมีเงื่อนไข static void ExampleMethod( ){ Console.WriteLine("Hello"); return; Console.WriteLine("World"); } static void ExampleMethod( ){ int numBeans; //... Console.WriteLine("Hello"); if (numBeans < 10) return; Console.WriteLine("World"); C# Programming with Visual C# 2010 Express
การใช้ตัวแปรท้องถิ่น (Local Variable) • ตัวแปรท้องถิ่น • สร้างภายในเมทธอด • เป็นของเมทธอดใช้ • หายไปเมื่อเมทธอดจบการทำงาน • ตัวแปรที่ใช้ร่วมกันในเมทธอด • ต้องเป็นตัวแปรระดับสมาชิกของคลาส • ขอบเขตตัวแปรขัดกัน • ตัวแปรท้องถิ่นกับตัวแปรระดับสมาชิกของคลาสที่ใช้ชื่อเหมือนกัน C# Programming with Visual C# 2010 Express
การประกาศและเรียกใช้ตัวพารามิเตอร์การประกาศและเรียกใช้ตัวพารามิเตอร์ • การประกาศตัวพารามิเตอร์ • วางในวงเล็บหลังชื่อเมทธอด • กำหนดชนิดข้อมูลและชื่อตัวพารามิเตอร์ • การเรียกเมทธอดกับตัวพารามิเตอร์ • เรียกชื่อและตามด้วยชนิดตัวพารามิเตอร์ให้ครบจำนวน ตัวอย่างการใช้ static void MethodWithParameters(int n, string y){ ... } ตัวอย่างการเรียก MethodWithParameters(2, "Hello, world“); C# Programming with Visual C# 2010 Express
เมทธอดโอเวอร์โหลด (overload) • คือเมทธอดที่มีชื่อเหมือนกับภายในคลาส • มีเป้าหมายเพื่อให้ตอบสนองต่างกัน ในชื่อเมธอดเดียวกัน ตามความเหมาะสมที่จะสนับสนันการเรียกใช้งาน เช่น มีข้อมูลตัวแปรที่ส่งเข้าเมธอด ไม่เหมือนกัน • ความแตกต่างอยู่ที่รายการตัวพารามิเตอร์ของเมทธอด • การเรียกใช้เมทธอด ต้องระบุรายการพารามิเตอร์ให้ตรงกับที่นิยามไว้ static int Add(int a, int b){ return a + b; } static int Add(int a, int b, int c){ return a + b + c; } C# Programming with Visual C# 2010 Express
ลักษณะโอเวอร์โหลดที่ทำได้ลักษณะโอเวอร์โหลดที่ทำได้ • Signature เป็นรายการพารามิเตอร์ของเมทธอดที่ต้องไม่มีซ้ำกันของการทำโอเวอร์โหลดเมทธอด ดังมีความต่างคือ • ชนิดตัวแปรไม่เหมือนกัน • จำนวนตัวแปรไม่เท่ากัน • ลำดับตัวแปรไม่เหมือนกัน(ดูที่ชนิดตัวแปร) • Signature ไม่รวมชื่อตัวพารามิเตอร์ การคืนค่าของเมทธอด • แต่การคืนค่าต้องเหมือนกัน class Customer{ private int id; public void SetId(int value) { id = value; } public void SetId(string value) { if (! int.TryParse(value, out id)) Console.WriteLine("failed:Must be integer value."); } public int GetId() { return id; } } C# Programming with Visual C# 2010 Express
ตัวแปรทางเลือกของเมธอดตัวแปรทางเลือกของเมธอด • การทำโอเวอร์โหลดไม่เพียงพอที่สนับสนุนการทำงานแบบนี้void OptionalPara(int x1, float x2){ ทำงานอย่างแบบ1}void OptionalPara(int x1, int x2, float x3) { ทำงานอย่างแบบ2} void OptionalPara(int x1, float x3) // ทำไม่ได้ { ทำงานอย่างแบบ3} • ซีชาร์ปสนับสนุนการใช้เป็นแปรที่ให้เลือกให้ใส่ได้ ไม่ใส่ก็ได้ (ที่เรียกชื่อว่าทางเลือกมาจากคำว่า Option) แต่ยังคงทำงานได้ C# Programming with Visual C# 2010 Express
การสร้างตัวแปรทางเลือกการสร้างตัวแปรทางเลือก • เราสร้างตัวแปรทางเลือกที่มีการทำโอเวอร์โหลดไปด้วย เราจะใส่ตัวแปร 2 ตัว หรือ 3 ตัวก็ได้ และสังเกตด้วยว่า เมธอดสุดท้ายมีตัวแปรเข้า 3 ตัว มีการกำหนดค่าให้ตัวแปรสุดท้าย = 0.0F แต่ในการทำงานจริงสามารถเปลี่ยนค่าเป็น 10.0F ได้ • สำหรับการไม่ใส่ตัวแปรที่ 3 เมธอดนี้จะกำหนดค่าปริยายให้ โดยสามารถใส่เงื่อนไขได้ • ต้องให้ตัวแปรทางเลือกอยู่ในลำดับสุดท้ายเท่านั้น void OptionalPara(int x1, float x2) { ทำงานอย่างแบบ1} void OptionalPara(int x1, int x2, float x3) { ทำงานอย่างแบบ2} void OptionalPara(int x1, float x2, float x3 = 0.0F) { ทำงานอย่างแบบ3} C# Programming with Visual C# 2010 Express
การเรียกเมธอดด้วยการระบุชื่อตัวแปรการเรียกเมธอดด้วยการระบุชื่อตัวแปร • นอกจากการใส่ตัวแปร และชนิดตัวแปรตามลำดับของการกำหนดเมธอดแล้ว ซีชาร์ป ยังยืดหยุ่นได้อีก ด้วยการใส่ตัวแปร และชนิดตัวแปร ไม่ต้องตามลำดับได้ ด้วยการกำหนดชื่อตัวแปรเข้าในการเรียกใช้งาน ดังตัวอย่างต่อไปนี้ static void Main(string[] args) { OptionalPara(x1: 1, x3: 10.0F, x2:2.0F); Console.ReadKey(); } static void OptionalPara(int x1, float x2, float x3 = 0.0F) { Console.WriteLine("Optional3Para"); Console.WriteLine("x1:{0}", x1); Console.WriteLine("x2:{0}", x2); if (x3!=0.0) Console.WriteLine("x3:{0}", x3); } C# Programming with Visual C# 2010 Express
การสร้างเมธอดอัตโนมัติ (Refactoring Code) การใช้ Refactor เพื่อสร้างเมธอดอัตโนมัติ ทำให้การเขียนโปรแกรมสะดวก และทำให้การดูแลรักษา ปรับแต่งโปรแกรมง่ายขึ้น C# Programming with Visual C# 2010 Express
กลไกการส่งตัวแปร • รูปแบบการส่งผ่านตัวแปรมีอยู่สามแบบคือ • การส่งตัวแปรเข้า (By Value) การส่งแบบนี้บางทีก็เรียก in ซึ่งเป็นค่าปริยาย (ไม่ใส่คำว่า in) ตัวแปรนี้จะทำสำเนาตัวแปรเข้ามา จะมีผลเฉพาะตัวแปรภายในเมธอดเท่านั้น ส่วนใหญ่การในการเขียนโปรแกรมจะใช้การส่งตัวแปรเข้าแบบนี้ ซึ่งที่ผ่านมาเราก็ใช้แบบนี้ทั้งหมด • การส่งตัวแปรโดยการอ้างอิง (By Reference) การส่งแบบนี้ไม่มีการทำสำเนาตัวแปรตันทางแต่จะใช้การอ้างอิงแทน ดังนี้การเปลี่ยนแปลงตัวแปรนี้จึงมีผลต่อตัวแปรต้นทาง หรือเรียกว่า มี in และ out • การส่งตัวแปรออก หรือเรียกว่า out เพราะตัวแปรนี้ มีผลต่อตัวแปรภายนอก แต่ไม่มีผลต่อตัวแปร ภายในเมธอด C# Programming with Visual C# 2010 Express
ตัวอย่างการใช้ตัวแปร By Value • static void AddOne(int x) • { • x++; // Increment x • } • static void Main( ) • { • int k = 6; • AddOne(k); • Console.WriteLine(k); // Display the value 6, not 7 • } C# Programming with Visual C# 2010 Express
ตัวอย่างการใช้ตัวแปรเข้าแบบอ้างอิงตัวอย่างการใช้ตัวแปรเข้าแบบอ้างอิง • static void Main(string[] args){ • inti = 6; int j = 6; • AddRefOneValueOne(ref i, j); • Console.WriteLine("{0}, {1}", i,j); • // Display the value 7, 6 • Console.ReadKey(); • } • static void AddRefOneValueOne(ref int x, int y){ • x++; • y++; • } C# Programming with Visual C# 2010 Express
ตัวอย่างการใช้ตัวแปร out • static void OutMethod(out int p){ • p = 1; • } • static void Main(string[] args){ • int p= 2; • OutMethod(out p); • Console.WriteLine(p);// Display 1 • Console.Read(); • } C# Programming with Visual C# 2010 Express
การใช้ตัวแปรเข้าแบบไดนามิกด้วยอะเรย์การใช้ตัวแปรเข้าแบบไดนามิกด้วยอะเรย์ • ในบางครั้งเมื่อต้องการให้ตัวแปรเข้า หลายตัว การใช้เมธอดโอเวอร์โหลด จำนวนที่มีตัวเข้าต่างๆ จะทำให้มีเมธอดโอเวอร์โหลดจำนวนมาก เกินไป • การแก้ปัญหานี้แก้ได้ด้วยการทำ ให้มีตัวแปรเข้าแบบไดนามิกใช้คีย์เวิร์ด params • ประกาศเป็นอาร์เรย์ ส่งผ่านบบ การส่งตัวพารามิเตอร์เข้า static long AddList(params long[ ] v){ long total, i; for (i = 0, total = 0; i < v.Length; i++) total += v[i]; return total; } static void Main( ){ long x = AddList(63,21,84); } C# Programming with Visual C# 2010 Express
เงื่อนไขการใช้ตัวแปรเข้าแบบไดนามิกเงื่อนไขการใช้ตัวแปรเข้าแบบไดนามิก • มีเพียงหนึ่ง params ต่อหนึ่งเมธอด • วางได้ที่ตำแหน่งท้ายสุดของตัวแปร • มีเพียงอะเรย์หนึ่งมิติเท่านั้น static void Main(string[] args) { Console.WriteLine(Accumulate("total:", 1, 2, 3, 4)); //print total:10 Console.ReadKey(); } public static string Accumulate(string print, params int[] value ) { int sum = 0; foreach (var item in value) { sum += item; } return print + Convert.ToString(sum); } C# Programming with Visual C# 2010 Express
แนวทางการใช้ตัวพารามิเตอร์ของเมทธอดแนวทางการใช้ตัวพารามิเตอร์ของเมทธอด กลไกการทำงาน • Pass by value เป็นวิธีที่นิยมใช้กันมากที่สุด • เมทธอดที่คืนค่า จะมีประโยชน์กับการส่งออกเพียงตัวเดียว • การใช้ ref และ out นิยมใช้กับการคืนค่าหลายค่า • ใช้เพียง ref ถ้าข้อมูลมีการส่งค่าทั้งสองทาง ประสิทธิภาพ • โดยทั่วไปประสิทธิภาพของ pass by value มีมากที่สุด C# Programming with Visual C# 2010 Express
การใช้เมทธอดเรียกตัวเอง (Recursive) • เมทธอดที่เรียกตัวเอง • โดยตรง • โดยอ้อม • มีประโยชน์กับโครงสร้างปัญหาที่ซับซ้อน static ulong Fibonacci(ulong n){ if (n <= 2) return 1; else return Fibonacci(n-1) + Fibonacci(n-2); } C# Programming with Visual C# 2010 Express
สรุปท้ายบท บทนี้เราได้เรียนรู้การสร้างเมธอด การใช้งานเมธอด การทำโอเวอร์โหลด กฎเกณฑ์ การสร้างเมธอดในลักษณะต่างๆ โดยเฉพาะเรื่อง การสร้างตัวแปรเข้า หรือพารามิเตอร์ในลักษณะ ไดนามิกของอะเรย์ ไดนามิกของทางเลือก การระบุชื่อตัวแปร ในกรณีที่ไม่เรียงลำดับตัวแปรเข้า กลไกการทำงานของตัวแปรเข้า แบบทำสำเนาเข้า แบบอ้างอิงตัแปรเข้า และแบบอ้างอิงภายนอกอย่างเดียว รวมทั้งเมธอดเรียกตัวเองสำหรับโครงสร้างปัญหาที่ซับซ้อน C# Programming with Visual C# 2010 Express
คำถามทบทวน • เมธอดอาจเรียกได้หลายชื่อ ชื่อเหล่านั้นคืออะไรได้บ้าง • มีเหตุผลอะไรที่ต้องสร้างสเตติกเมธอด และอินสแตทซ์เมธอด • มีเหตุผลอะไรที่จะต้องทำโอเวอร์โหลดเมธอด • ให้เขียนรายการลักษณะตัวแปรเข้าที่ทำโอเวอร์โหลดได้บ้าง • ใช้คีย์เวิร์ดอะไรในการสร้างตัวแปรเข้าแบบไดนามิกด้วยอะเรย์ • มีเหตุผลอะไรที่ซีชาร์ปต้องสร้างตัวแปรทางเลือก • ในกรณีที่ใช้การะบุชื่อตัวแปรเข้าทุกตัว ยกเว้นตัวแปรทางเลือก ในการเรียกใช้งานเมธอดที่ตัวแปรทางเลือก ค่าตัวแปรทางเลือกจะมีค่าเป็นอะไร • มีขั้นตอนอะไรบ้างในการสร้างเมธอดอัตโนมัติ C# Programming with Visual C# 2010 Express
คำถามทบทวน • จากโค้ดต่อไปนี้ เมื่อเรียกเมธอด OutMethod( ) จะเกิดอะไรขึ้น static void OutMethod(out int p){ p = 1;} static void Main(string[] args){ int p; OutMethod(out 1); Console.WriteLine(p); Console.Read(); } • ชนิดตัวแปรเข้ามีกี่ชนิด จำแนกตามกลไกการส่งตัวแปร • ประสิทธิภาพในการใช้ตัวแปรโดยทั่วไป ใช้ชนิดข้อมูลของตัวแปรเข้าเป็นอะไรจะดีที่สุด • เมธอดเรียกตัวเอง หรือรีเคอร์ซีพ จำเป็นต้องมีการจุดหยุดของการทำงานหรือไม่ และเพราะอะไร C# Programming with Visual C# 2010 Express
Lab การสร้างและใช้งานเมทธอด • การใช้พารามิเตอร์ในเมทธอดที่ส่งค่าคือ • การสร้างเมทธอดกับพารามิเตอร์อ้างอิง • การใช้เมทธอด รีเคอร์ชั่น C# Programming with Visual C# 2010 Express