Câu trả lời cho câu hỏi của bạn là có và không, tùy thuộc vào ý bạn muốn nói đến "hàm nội tuyến". Nếu bạn đang sử dụng thuật ngữ giống như nó được sử dụng trong phát triển C ++ thì câu trả lời là không, bạn không thể làm điều đó - ngay cả một biểu thức lambda cũng là một lời gọi hàm. Mặc dù đúng là bạn có thể xác định các biểu thức lambda nội tuyến để thay thế các khai báo hàm trong C #, nhưng cuối cùng trình biên dịch vẫn tạo ra một hàm ẩn danh.
Đây là một số mã thực sự đơn giản mà tôi đã sử dụng để kiểm tra điều này (VS2015):
static void Main(string[] args)
{
Func<int, int> incr = a => a + 1;
Console.WriteLine($"P1 = {incr(5)}");
}
Trình biên dịch tạo ra gì? Tôi đã sử dụng một công cụ tiện lợi có tên ILSpy hiển thị lắp ráp IL thực tế được tạo. Hãy xem (Tôi đã bỏ qua rất nhiều công cụ thiết lập lớp)
Đây là chức năng chính:
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
Xem những dòng IL_0026 và IL_0027? Hai lệnh đó tải số 5 và gọi một hàm. Sau đó định dạng IL_0031 và IL_0036 và in kết quả.
Và đây là hàm được gọi là:
.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
}
Đó là một hàm thực sự ngắn, nhưng nó là một hàm.
Điều này có đáng để nỗ lực tối ưu hóa không? Không. Có thể nếu bạn đang gọi nó hàng nghìn lần một giây, nhưng nếu hiệu suất là quan trọng thì bạn nên cân nhắc gọi mã gốc được viết bằng C / C ++ để thực hiện công việc.
Theo kinh nghiệm của tôi, khả năng đọc và khả năng bảo trì hầu như luôn quan trọng hơn việc tối ưu hóa để đạt được tốc độ vài micro giây. Sử dụng các hàm để làm cho mã của bạn có thể đọc được và kiểm soát phạm vi thay đổi và không lo lắng về hiệu suất.
"Tối ưu hóa sớm là gốc rễ của mọi điều xấu (hoặc ít nhất là hầu hết) trong lập trình." - Donald Knuth
"Một chương trình không chạy chính xác thì không cần chạy nhanh" - Tôi