Part1 -> Section2 -> Classes -> 006. Static Members
จากบทความก่อนๆ ในการที่เราจะเรียกใช้งาน class นั้น ปกติเราจะต้องเรียกผ่านใช้งานผ่าน object ของ class นั้นๆ แต่จะมีการเรียกใช้งาน class โดยไม่ต้องผ่าน object นั่นก็คือจะต้องใช้งานผ่าน static member การเรียกใช้งานถือว่าสะดวกมากๆ
แต่จะมีคำถามสำคัญตามมาคือ แล้วเคสไหนจะใช้ static method เคสไหนจะใช้แบบ regular method (object) คำตอบของผมเองนะคับ มันอยู่ที่เราคับ แต่ก็จะมีหลักการไว้พิจารณาอยู่บ้าง ดังนี้ครัช (ผมลองค้นดูคร่าวๆ ก็ไม่มีที่ไหนตอบเหมือนกันเลยคับ สุดท้ายก็คงอยู่ที่เราจะพิจารณานะคับ)
- เป็นการแชร์ข้อมูลที่ตายตัว เช่น การหาพื้นที่สี่เหลี่ยม, การแปลงหน่วยอุณหภูมิ, การหาพื้นที่วงกลม อารมณ์คือ ใช้เป็นครั้งๆ แล้วจบไปเลยอ่าครัช
- ไม่ได้ใช้ในการเก็บค่า อธิบายคือ โปรแกรมจะมอง static เป็นตัวเดียวกันไม่ว่าจะเรียกใช้กี่ครั้งคือตัวเดิม แต่ถ้าเราใช้ new objcet นั้นการ new แต่ละครั้ง object นั้นๆคือคนละตัวกันะเลย ถ้ามีการ set ค่าใส่ตัวแปรของ class ล่ะก็ พอเรียกใช้มันก็จะเก็บค่าต่างกันไป เพราะ object มันคนละตัวกันเลย
มีข้อกำหนดนิดหน่อยคือ class ปกติสามารถมี static members ได้แต่จะไม่สามารถเรียกใช้งานผ่าน object ได้(ต้องเรียกผ่าน class เท่านั้น) และ static class จะสามารถมีได้แค่ static members เท่านั้น
ลองดูตัวอย่างของ static members (ตัวอย่างนี้คือ static class ด้วย)
สำหรับการเรียกใช้ static members นั้น จะเรียกใช้งานผ่าน class ดังตัวอย่าง
ผลการรันโปรแกรมคือ
จากตัวอย่างจะเห็นได้ว่าการใช้งาน ง่ายมากๆ อ่านโค้ดง่าย เขียนโค้ดได้สั้นอีกด้วย ซึ่งหากเขียนเป็นแบบ regular members นั้นจะยาวกว่ามาก สุดท้ายแล้วก็อยู่ที่เราว่า method นั้นใช้ทำงานอะไร ควรเป็น method แบบไหน regular หรือ static แถมตอนท้าย เป็นตัวอย่างของ class Circle ที่มี 2 method ที่ทำงานเหมือนกันแต่จะเป็น regular method และ static method ให้คุณได้เห็นข้อแตกต่างชัดๆไปเลย
class circle หลัง modify ใหม่
การเรียกใช้งานทั้งสองแบบ
ผลของการรันโปรแกรม
สอบถามหรือติดตามได้ที่ https://www.facebook.com/learnaspnetmvcjquery
แต่จะมีคำถามสำคัญตามมาคือ แล้วเคสไหนจะใช้ static method เคสไหนจะใช้แบบ regular method (object) คำตอบของผมเองนะคับ มันอยู่ที่เราคับ แต่ก็จะมีหลักการไว้พิจารณาอยู่บ้าง ดังนี้ครัช (ผมลองค้นดูคร่าวๆ ก็ไม่มีที่ไหนตอบเหมือนกันเลยคับ สุดท้ายก็คงอยู่ที่เราจะพิจารณานะคับ)
- เป็นการแชร์ข้อมูลที่ตายตัว เช่น การหาพื้นที่สี่เหลี่ยม, การแปลงหน่วยอุณหภูมิ, การหาพื้นที่วงกลม อารมณ์คือ ใช้เป็นครั้งๆ แล้วจบไปเลยอ่าครัช
- ไม่ได้ใช้ในการเก็บค่า อธิบายคือ โปรแกรมจะมอง static เป็นตัวเดียวกันไม่ว่าจะเรียกใช้กี่ครั้งคือตัวเดิม แต่ถ้าเราใช้ new objcet นั้นการ new แต่ละครั้ง object นั้นๆคือคนละตัวกันะเลย ถ้ามีการ set ค่าใส่ตัวแปรของ class ล่ะก็ พอเรียกใช้มันก็จะเก็บค่าต่างกันไป เพราะ object มันคนละตัวกันเลย
มีข้อกำหนดนิดหน่อยคือ class ปกติสามารถมี static members ได้แต่จะไม่สามารถเรียกใช้งานผ่าน object ได้(ต้องเรียกผ่าน class เท่านั้น) และ static class จะสามารถมีได้แค่ static members เท่านั้น
ลองดูตัวอย่างของ static members (ตัวอย่างนี้คือ static class ด้วย)
public static class Circle { public static double CalCircleArea(double radius) { return Math.PI * Math.Pow(radius, 2); } }
สำหรับการเรียกใช้ static members นั้น จะเรียกใช้งานผ่าน class ดังตัวอย่าง
double radius = 5; Console.WriteLine("Radius " + radius); Console.WriteLine(string.Format("Circle Area = {0}", Circle.CalCircleArea(radius)));
ผลการรันโปรแกรมคือ
จากตัวอย่างจะเห็นได้ว่าการใช้งาน ง่ายมากๆ อ่านโค้ดง่าย เขียนโค้ดได้สั้นอีกด้วย ซึ่งหากเขียนเป็นแบบ regular members นั้นจะยาวกว่ามาก สุดท้ายแล้วก็อยู่ที่เราว่า method นั้นใช้ทำงานอะไร ควรเป็น method แบบไหน regular หรือ static แถมตอนท้าย เป็นตัวอย่างของ class Circle ที่มี 2 method ที่ทำงานเหมือนกันแต่จะเป็น regular method และ static method ให้คุณได้เห็นข้อแตกต่างชัดๆไปเลย
class circle หลัง modify ใหม่
public class Circle { public double radius { get; set; } public double RegularCalCircleArea() { return Math.PI * Math.Pow(this.radius, 2); } public static double StaticCalCircleArea(double radius) { return Math.PI * Math.Pow(radius, 2); } }
การเรียกใช้งานทั้งสองแบบ
double radius = 5; Console.WriteLine("Radius " + radius); // Call by regular method Circle circle = new Circle(); circle.radius = radius; Console.WriteLine(string.Format("Call calculate circle area by Regualr Method = {0}", circle.RegularCalCircleArea())); // Call by static method Console.WriteLine(string.Format("Call calculate circle area by Static Method = {0}", Circle.StaticCalCircleArea(radius)));
ผลของการรันโปรแกรม
สอบถามหรือติดตามได้ที่ https://www.facebook.com/learnaspnetmvcjquery
ความคิดเห็น
แสดงความคิดเห็น