ไม่ แต่คุณสามารถใช้ผู้รับมอบสิทธิ์ (เช่นAction
) เป็นทางเลือก
ได้แรงบันดาลใจส่วนหนึ่งจากคำตอบของ Robin R เมื่อต้องเผชิญกับสถานการณ์ที่ฉันคิดว่าฉันต้องการพารามิเตอร์ตัวเลือกเพิ่มเติมฉันจึงใช้Action
ตัวแทน ฉันยืมรหัสตัวอย่างของเขาเพื่อแก้ไขเพื่อใช้Action<int>
ในการแสดงความแตกต่างและความคล้ายคลึงกัน:
public string foo(string value, Action<int> outResult = null)
{
// .. do something
outResult?.Invoke(100);
return value;
}
public void bar ()
{
string str = "bar";
string result;
int optional = 0;
// example: call without the optional out parameter
result = foo (str);
Console.WriteLine ("Output was {0} with no optional value used", result);
// example: call it with optional parameter
result = foo (str, x => optional = x);
Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
// example: call it with named optional parameter
foo (str, outResult: x => optional = x);
Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
}
สิ่งนี้มีความได้เปรียบที่ตัวแปรทางเลือกจะปรากฏในแหล่งที่มาเป็น int ปกติ (คอมไพเลอร์ล้อมรอบในคลาสที่ปิดมากกว่าที่เราจะห่อมันอย่างชัดเจนในคลาสที่ผู้ใช้กำหนดเอง)
ตัวแปรต้องการการกำหนดค่าเริ่มต้นอย่างชัดเจนเนื่องจากคอมไพเลอร์ไม่สามารถสันนิษฐานได้ว่าAction
จะมีการเรียกก่อนที่การเรียกใช้ฟังก์ชันจะออก
มันไม่เหมาะสำหรับทุกกรณีการใช้งาน แต่ทำงานได้ดีสำหรับกรณีการใช้งานจริงของฉัน (ฟังก์ชั่นที่ให้ข้อมูลสำหรับการทดสอบหน่วยและที่การทดสอบหน่วยใหม่จำเป็นต้องเข้าถึงสถานะภายในบางอย่างที่ไม่อยู่ในค่าส่งคืน)