คำตอบสำหรับคำถามของคุณคือใช่และไม่ใช่ขึ้นอยู่กับความหมายของ "ฟังก์ชันอินไลน์" หากคุณกำลังใช้คำที่เหมือนกับที่ใช้ในการพัฒนา C ++ คำตอบคือไม่คุณไม่สามารถทำได้แม้แต่นิพจน์แลมบ์ดาก็เป็นการเรียกใช้ฟังก์ชัน แม้ว่าจะเป็นความจริงที่คุณสามารถกำหนดนิพจน์แลมบ์ดาแบบอินไลน์เพื่อแทนที่การประกาศฟังก์ชันใน C # แต่คอมไพเลอร์ยังคงสร้างฟังก์ชันที่ไม่ระบุตัวตน
นี่คือรหัสง่ายๆที่ฉันใช้ในการทดสอบสิ่งนี้ (VS2015):
static void Main(string[] args)
{
Func<int, int> incr = a => a + 1;
Console.WriteLine($"P1 = {incr(5)}");
}
คอมไพเลอร์สร้างอะไร ฉันใช้เครื่องมือที่ดีที่เรียกว่า ILSpy ซึ่งแสดงการประกอบ IL จริงที่สร้างขึ้น ดูสิ (ฉันได้ละเว้นการตั้งค่าชั้นเรียนจำนวนมาก)
นี่คือฟังก์ชั่นหลัก:
IL_001f: stloc.0
IL_0020: ldstr "P1 = {0}"
IL_0025: ldloc.0
IL_0026: ldc.i4.5
IL_0027: callvirt instance !1 class [mscorlib]System.Func`2<int32, int32>::Invoke(!0)
IL_002c: box [mscorlib]System.Int32
IL_0031: call string [mscorlib]System.String::Format(string, object)
IL_0036: call void [mscorlib]System.Console::WriteLine(string)
IL_003b: ret
ดูบรรทัดเหล่านั้น IL_0026 และ IL_0027 ไหม คำสั่งทั้งสองนั้นโหลดหมายเลข 5 และเรียกใช้ฟังก์ชัน จากนั้นจัดรูปแบบ IL_0031 และ IL_0036 และพิมพ์ผลลัพธ์
และนี่คือฟังก์ชันที่เรียกว่า:
.method assembly hidebysig
instance int32 '<Main>b__0_0' (
int32 a
) cil managed
{
.maxstack 8
IL_0000: ldarg.1
IL_0001: ldc.i4.1
IL_0002: add
IL_0003: ret
}
มันเป็นฟังก์ชันสั้น ๆ แต่มันคือฟังก์ชัน
นี่คุ้มค่ากับความพยายามในการเพิ่มประสิทธิภาพหรือไม่? ไม่. บางทีถ้าคุณเรียกมันหลายพันครั้งต่อวินาที แต่ถ้าประสิทธิภาพนั้นสำคัญคุณควรพิจารณาเรียกโค้ดเนทีฟที่เขียนด้วย C / C ++ เพื่อทำงาน
จากประสบการณ์ของฉันความสามารถในการอ่านและการบำรุงรักษานั้นสำคัญกว่าการปรับให้เหมาะสมเพื่อเพิ่มความเร็วเพียงไม่กี่ไมโครวินาที ใช้ฟังก์ชันเพื่อทำให้โค้ดของคุณอ่านได้และเพื่อควบคุมการกำหนดขอบเขตตัวแปรและไม่ต้องกังวลกับประสิทธิภาพ
"การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากเหง้าของความชั่วร้ายทั้งหมด (หรืออย่างน้อยที่สุดก็ส่วนใหญ่) ในการเขียนโปรแกรม" - Donald Knuth
"โปรแกรมที่ทำงานไม่ถูกต้องไม่จำเป็นต้องทำงานเร็ว" - ฉัน