Jawaban atas pertanyaan Anda adalah ya dan tidak, tergantung apa yang Anda maksud dengan "fungsi sebaris". Jika Anda menggunakan istilah seperti yang digunakan dalam pengembangan C ++ maka jawabannya tidak, Anda tidak dapat melakukannya - bahkan ekspresi lambda adalah panggilan fungsi. Meskipun benar bahwa Anda dapat mendefinisikan ekspresi lambda sebaris untuk menggantikan deklarasi fungsi di C #, kompilator masih akan membuat fungsi anonim.
Berikut beberapa kode yang sangat sederhana yang saya gunakan untuk menguji ini (VS2015):
static void Main(string[] args)
{
Func<int, int> incr = a => a + 1;
Console.WriteLine($"P1 = {incr(5)}");
}
Apa yang dihasilkan kompilator? Saya menggunakan alat bagus yang disebut ILSpy yang menunjukkan perakitan IL sebenarnya yang dihasilkan. Coba lihat (Saya telah menghilangkan banyak hal pengaturan kelas)
Ini adalah fungsi utama:
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
Lihat baris tersebut IL_0026 dan IL_0027? Kedua instruksi tersebut memuat angka 5 dan memanggil suatu fungsi. Kemudian format IL_0031 dan IL_0036 dan print hasilnya.
Dan inilah fungsi yang disebut:
.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
}
Ini adalah fungsi yang sangat singkat, tetapi ini adalah fungsi.
Apakah upaya untuk mengoptimalkan ini sepadan? Nah. Mungkin jika Anda memanggilnya ribuan kali per detik, tetapi jika kinerjanya begitu penting maka Anda harus mempertimbangkan untuk memanggil kode asli yang ditulis dalam C / C ++ untuk melakukan pekerjaan itu.
Dalam pengalaman saya, keterbacaan dan pemeliharaan hampir selalu lebih penting daripada mengoptimalkan untuk mendapatkan kecepatan beberapa mikrodetik. Gunakan fungsi untuk membuat kode Anda dapat dibaca dan untuk mengontrol pelingkupan variabel dan tidak mengkhawatirkan kinerja.
"Pengoptimalan prematur adalah akar dari semua kejahatan (atau setidaknya sebagian besar) dalam pemrograman." - Donald Knuth
"Program yang tidak berjalan dengan benar tidak perlu berjalan cepat" - Saya