C#.NET 4.0 Overload method โดยใช้ Optional Parameters

เกริ่นนำพร้อมกับแนะนำของดี

บทความนี้เสนอการทางเลือกของการทำ overload method ด้วย feature ใหม่ของ C#.NET 4.0 ครับ ผมจะอธิบายในแบบวิวัฒนาการไปเรื่อยๆ code แรกเริ่มเดิมที

public int SumOfArithmeticSequences(int end)
{
    int result = 0;
    for (int i = 1; i <= end; i++)
    {
        result += i;
    }
    return result;
}

Console.WriteLine(SumOfArithmeticSequences(100));// 5050

ต่อมา มีความต้องการโดย กำหนด จุดเริ่มต้นก่อนที่จะหาผลบวก เรา overload method เพิ่มได้เป็น
public int SumOfArithmeticSequences(int end, int begin)
{
    int result = 0;
    for (int i = begin; i <= end; i++)
    {
        result += i;
    }
    return result;
}

Console.WriteLine(SumOfArithmeticSequences(100, 1));// 5050 มีค่าเท่าเดิม แสดงว่าใช้ได้
แต่ก็ยังไม่ดี เราเลยกลับไป แก้ไข method ก่อนหน้าใหม่ เพื่อจะได้ reuse method overload
public int SumOfArithmeticSequences(int end)
{
    int result = SumOfArithmeticSequences(end, 1);
    return result;
}
OK ดูดีแล้ว ต่อมามีความต้องการเพิ่มอีก คือให้ สร้าง Arithmetic Sequences โดยมี step ที่ต้องการด้วย กลับไปเพิ่ม overload method ได้เป็น
public int SumOfArithmeticSequences(int end, int begin, int step)
{
    int result = 0;
    for (int i = begin; i <= end; i += step)
    {
        result += i;
    }
    return result;
}
Console.WriteLine(SumOfArithmeticSequences(100, 1, 1));// 5050 มีค่าเท่าเดิม แสดงว่าใช้ได้

ทำอีกเหมือนเดิมครับ กลับไปแก้ method SumOfArithmeticSequences(int end, int start) ให้ใช้ SumOfArithmeticSequences(int end, int start, int step) เพื่อ reuse code
public int SumOfArithmeticSequences(int end, int begin)
{
    int result = SumOfArithmeticSequences(end, begin, 1);
    return result;
}

สรุปว่า เราจะมี 1 method ที่ทำ overload ไว้ 3 แบบ เราก็ทำอย่างนี้มาจนกระทั้ง  C#.NET 4.0 ออกมาพร้อมกับ feature ใหม่ คือ optional parameters จาก method ที่ overload ทั้งหมดเราสามารถเขียนได้ใน 1 method โดยใช้ optional parameters ได้แบบนี้ครับ
public int SumOfArithmeticSequences(int end, int begin = 1, int step = 1)
{
    int result = 0;
    for (int i = begin; i <= end; i += step)
    {
        result += i;
    }
    return result;
}

เสร้จแล้วครับ method ที่ overload ไว้ 3 แบบครบใน method เดียว โดย parameter แรกจำเป็นต้องกำหนด ส่วน parameter begin และ step เป็น optional parameters ที่มีค่า default เท่ากับ 1 ครับ ทดสอบ
Console.WriteLine(SumOfArithmeticSequences(100));//5050
Console.WriteLine(SumOfArithmeticSequences(100, 1));//5050
Console.WriteLine(SumOfArithmeticSequences(100, 1, 1));//5050

OK เรามาดูข้อห้ามของ optional parameters กันหน่อยดีกว่า ตามนี้ครับ
Foo(int x = 0, int y)//ไม่อนุญาติให้มี non-params ต่อท้าย optional parameters
Foo(DateTime dt = DateTime.Now)//default value ต้องเป็นค่าคงที่
Foo(object name = “default”)//ไม่อนุญาติให้แปลงค่าจาก string ไปเป็น object, dynamic หรือ object ใดๆที่เรากำหนด
Foo(params string[] names = null)//Parameter arrays ไม่สามารถเป็น optional ได้
Foo(ref string name = “default”)//ref/out parameters ไม่สามารถเป็น  optional ได้

เรียบร้อยครับ อ่านง่าย และเขียน code น้อยลงอีกเยอะเลย …

แถม Named Arguments ให้อีกเล็กน้อยเพราะเป็น feature ใหม่ของ C#.NET 4.0 เหมือนกัน เราสามารถอ้าง Arguments ใน method โดยใช้ชื่อ argruments ขั้นด้วย : แล้วตามด้วย value ได้ครับ ตัวอย่างเช่น

Console.WriteLine(SumOfArithmeticSequences(100, step: 2));//2500
Console.WriteLine(SumOfArithmeticSequences(begin:1, step: 2, end: 100));//2500

เมื่อใช้ Named Arguments ในกรณีเจอ method ที่มี arguments  เยอะมากๆ ก็จะทำให้ code เราอ่านง่ายขึ้นครับ

ขอบคุณครับ

Advertisements

#net, #c