Saya tahu ini mungkin terdengar aneh tetapi saya bahkan tidak tahu bagaimana mencari sintaks ini di internet dan juga saya tidak yakin apa sebenarnya artinya.
Jadi saya telah mengawasi beberapa kode MoreLINQ dan kemudian saya memperhatikan metode ini
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
return _(); IEnumerable<TSource> _()
{
var knownKeys = new HashSet<TKey>(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
yield return element;
}
}
}
Apa pernyataan ganjil ini? return _();
?
return _(); IEnumerable<TSource> _()
?return _(); IEnumerable<TSource> _()
daripadayield return
?return _(); IEnumerable<TSource> _()
. Dia bisa bingung dengan tampilannya daripada pernyataan pengembalian yang sebenarnya.Jawaban:
Ini adalah C # 7.0 yang mendukung fungsi lokal ....
C # saat ini dengan
Func<T>
Triknya adalah, _ () dideklarasikan setelah digunakan, yang tidak masalah.
Penggunaan praktis fungsi lokal
Contoh di atas hanyalah demonstrasi tentang bagaimana metode inline dapat digunakan, tetapi kemungkinan besar jika Anda akan memanggil metode hanya sekali, maka itu tidak ada gunanya.
Tetapi dalam contoh di atas, seperti yang disebutkan dalam komentar oleh Phoshi dan Luaan , ada keuntungan menggunakan fungsi lokal. Karena fungsi dengan hasil pengembalian tidak akan dijalankan kecuali seseorang mengulanginya, dalam kasus ini metode di luar fungsi lokal akan dijalankan dan validasi parameter akan dilakukan bahkan jika tidak ada yang akan mengulang nilainya.
Berkali-kali kita mengulangi kode dalam metode, mari kita lihat contoh ini ..
Saya bisa mengoptimalkan ini dengan ...
sumber
_AnonymousFunction
atau hanya_
, sementara saya mengharapkan fungsi anonim asli menjadi seperti itu(x,y) => x+y
. Saya akan menyebutnya fungsi lokal, tapi saya tidak terbiasa dengan terminologi C #.yield return
, tidak ada kode yang dieksekusi sampai enumerable benar-benar dihitung. Ini tidak diinginkan, karena Anda ingin misalnya memverifikasi argumen segera. Satu-satunya cara untuk melakukan ini di C # adalah dengan memisahkan metode menjadi dua metode - satu denganyield return
s, dan yang lainnya tanpa. Metode sebaris memungkinkan Anda mendeklarasikanyield
metode penggunaan di dalam , menghindari kekacauan dan potensi penyalahgunaan metode yang sangat internal bagi induknya dan tidak dapat digunakan kembali.Pertimbangkan contoh yang lebih sederhana
_()
adalah fungsi lokal yang dideklarasikan dalam metode yang berisi pernyataan return.sumber