Mengompilasi dan Menjalankan Ekspresi
Ubah pohon ekspresi menjadi delegate yang dapat dijalankan.
Mengompilasi dan Menjalankan Ekspresi adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Dari Pohon ke Delegat
Pohon ekspresi hanyalah data sampai Anda mengompilasinya. Expression<TDelegate>.Compile() mengubah pohon tersebut menjadi delegat nyata yang dapat Anda panggil.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + 1;
Func<int, int> fn = tree.Compile();
Console.WriteLine(fn(5)); // 6Mengompilasi Pohon yang Dibangun Manual
Pohon yang Anda bangun secara manual dikompilasi dengan cara yang sama, sehingga menghasilkan delegat yang berfungsi.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(x, Expression.Constant(3));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
var fn = lambda.Compile();
Console.WriteLine(fn(4)); // 12Memanggil Hasil
Delegat yang dikompilasi berperilaku seperti delegat lainnya: panggil, simpan, dan teruskan.
using System;
using System.Linq.Expressions;
Expression<Func<int, int, int>> addExpr = (a, b) => a + b;
var add = addExpr.Compile();
Console.WriteLine(add(2, 3)); // 5
Console.WriteLine(add(10, 20)); // 30Kompilasi Tidak Gratis
Kompilasi memerlukan biaya saat dijalankan, jadi simpan delegat yang dihasilkan dalam cache dan gunakan kembali, bukan mengompilasinya setiap kali dipanggil.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x * x;
var square = tree.Compile(); // compile once
for (int i = 1; i <= 3; i++)
Console.Write(square(i) + " "); // 1 4 9
Console.WriteLine();Membangun Predikat secara Dinamis
Penggunaan umum adalah membangun predikat penyaring saat runtime dari masukan pengguna, lalu mengompilasinya menjadi Func.
using System;
using System.Linq.Expressions;
var n = Expression.Parameter(typeof(int), "n");
var isPositive = Expression.GreaterThan(n, Expression.Constant(0));
var pred = Expression.Lambda<Func<int, bool>>(isPositive, n).Compile();
Console.WriteLine(pred(5)); // True
Console.WriteLine(pred(-2)); // FalseMenggabungkan Kondisi
Gunakan Expression.AndAlso / OrElse untuk menggabungkan predikat sebelum mengompilasinya.
using System;
using System.Linq.Expressions;
var n = Expression.Parameter(typeof(int), "n");
var inRange = Expression.AndAlso(
Expression.GreaterThanOrEqual(n, Expression.Constant(1)),
Expression.LessThanOrEqual(n, Expression.Constant(10)));
var fn = Expression.Lambda<Func<int, bool>>(inRange, n).Compile();
Console.WriteLine(fn(5) + " " + fn(11)); // True FalseMengompilasi Perhitungan
Anda dapat merangkai rumus aritmetika saat runtime, yang berguna untuk mesin aturan dan kalkulator.
using System;
using System.Linq.Expressions;
var p = Expression.Parameter(typeof(double), "p");
// price * 1.2 (add 20% tax)
var withTax = Expression.Multiply(p, Expression.Constant(1.2));
var calc = Expression.Lambda<Func<double, double>>(withTax, p).Compile();
Console.WriteLine(calc(100)); // 120DynamicInvoke untuk Lambda Tanpa Tipe
Jika Anda menggunakan Expression.Lambda non-generik, kompilasikan menjadi Delegate dan panggil DynamicInvoke.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Add(x, Expression.Constant(10));
Delegate d = Expression.Lambda(body, x).Compile();
Console.WriteLine(d.DynamicInvoke(5)); // 15Catatan Kinerja
Ekspresi yang dikompilasi berjalan dengan kecepatan kira-kira setara delegat setelah kompilasi satu kali. Untuk jalur yang sering dijalankan, kompilasikan sekali saat aplikasi dimulai dan simpan delegatnya.
using System;
using System.Linq.Expressions;
Expression<Func<int, int>> tree = x => x + x;
var doubler = tree.Compile();
int total = 0;
for (int i = 0; i < 5; i++) total += doubler(i);
Console.WriteLine(total); // 0+2+4+6+8 = 20Kesalahan Muncul saat Kompilasi
Jika pohon tidak valid (misalnya, parameternya tidak ada), Compile() menimbulkan pengecualian, jadi validasi pohon sebelum mengandalkannya.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var y = Expression.Parameter(typeof(int), "y");
try {
// body references y but lambda only declares x
var lambda = Expression.Lambda<Func<int, int>>(Expression.Add(x, y), x);
lambda.Compile();
} catch (InvalidOperationException) {
Console.WriteLine("unbound parameter");
}Menyatukan Semuanya
Bangun, kompilasi, dan jalankan rumus kecil dalam satu alur.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var formula = Expression.Add(
Expression.Multiply(x, Expression.Constant(2)),
Expression.Constant(3)); // 2x + 3
var fn = Expression.Lambda<Func<int, int>>(formula, x).Compile();
Console.WriteLine(fn(4)); // 11Pemeriksaan Singkat
Pastikan Anda memahami cara menjalankan pohon ekspresi.
Rangkuman
Anda telah mempelajari cara mengompilasi dan menjalankan pohon ekspresi.
Compile()mengubah pohon menjadi delegat yang dapat dipanggil.- Simpan delegat dalam cache; kompilasi memerlukan biaya satu kali.
- Bangun predikat dan rumus secara dinamis, lalu kompilasikan.
- Pohon yang tidak valid menimbulkan pengecualian saat
Compile().
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengompilasi dan Menjalankan Ekspresi” gratis?
Ya — teks lengkap “Mengompilasi dan Menjalankan Ekspresi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengompilasi dan Menjalankan Ekspresi”?
Ubah pohon ekspresi menjadi delegate yang dapat dijalankan. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mengompilasi dan Menjalankan Ekspresi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Apa Itu Pohon Ekspresi
- Membangun Ekspresi Secara Manual
- Mengompilasi dan Menjalankan Ekspresi
- Pohon Ekspresi pada Penyedia LINQ