Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Yardımcı mantığa açıklayıcı bir ad vermek istediğinizde ve bu yardımcıya yalnızca bir üyenin ihtiyacı varsa yerel bir işlev seçin. İçeren türdeki bir yöntemle karşılaştırıldığında, yerel bir işlev okuyuculara yardımcının bu işleme ait olduğunu söyler. Adı, okuyucuların ayrıntıları incelemeden önce ana akışı izlemesini sağlar.
Tip
Bu makale, yöntemleri yazmayı bilen geliştiriciler için yerel işlevlerin pratik kullanımını öğretir. Bildirim ayrıntıları ve tanılama kuralları için bkz. Yerel işlev bildirimleri.
Yerel işlev, yöntem veya oluşturucu gibi başka bir üye içinde bildirilen adlandırılmış bir işlevdir. Adı yalnızca bu üye öğenin kapsamındadır.
Aşağıdaki şekil bir yerel işlevi bildirir ve çağırır:
string CreateMessage(string name)
{
return AddGreeting(name);
string AddGreeting(string value) => $"Hello, {value}!";
}
AddGreeting, CreateMessage içinde kalır. Türün diğer üyeleri bunu çağıramaz.
Yardımcı mantığı çağıranın yakınında tut
Yerel işlevler, yardımcı işlevler tek tek adımları açıklarken ana akışın ne olacağını belirtmesini sağlar. Aşağıdaki örnek bir okuma planı oluşturur. Her seferinde bir haftalık atama eklemek için yerel bir işlev kullanır.
IReadOnlyList<ReadingWeek> plan =
CreateReadingPlan("The Long Way Home", chapterCount: 10, chaptersPerWeek: 3);
foreach (ReadingWeek week in plan)
{
Console.WriteLine(
$"Week {week.Number}: {week.BookTitle}, chapters {week.FirstChapter}-{week.LastChapter}");
}
static IReadOnlyList<ReadingWeek> CreateReadingPlan(
string bookTitle,
int chapterCount,
int chaptersPerWeek)
{
var plan = new List<ReadingWeek>();
AddWeek(firstChapter: 1);
return plan;
void AddWeek(int firstChapter)
{
if (firstChapter > chapterCount)
{
return;
}
int lastChapter = Math.Min(
firstChapter + chaptersPerWeek - 1,
chapterCount);
plan.Add(new ReadingWeek(
plan.Count + 1,
bookTitle,
firstChapter,
lastChapter));
AddWeek(lastChapter + 1);
}
}
Bir ReadingWeek hafta numarasını ve o hafta için atanan bölüm aralığını kaydeder.
AddWeek yalnızca CreateReadingPlan öğesine ait olduğundan, yerel kapsamı bu ilişkiyi iletir.
Yerel işlevi, onu çağıran deyimlerden önce veya sonra bildirebilirsiniz. Okuyucuların bağlamı kaybetmeden ana akışı izleyebileceği bir yere yerleştirin.
Parametreleri kullanın veya yerel durumu yakalayın
Statik olmayan bir yerel işlev, kendisini içeren üyeden parametreleri ve yerel değişkenleri kullanabilir. Bu kullanım yakalama olarak adlandırılır. Okuma planı örneğinde şunları AddWeek yakalar:
-
CreateReadingPlanparametrelerindenbookTitle,chapterCountvechaptersPerWeek. -
planbir yerel değişkenden alır.
Yakalama, yardımcı doğal olarak çevresindeki işleme ait olduğunda kullanışlıdır. Yakalanan değerleri az ve belirgin tutun. Yardımcı tüm verilerini parametreler aracılığıyla alabilirse yerel bir static işlevi göz önünde bulundurun:
static int LastChapter(int firstChapter, int chaptersPerWeek, int chapterCount) =>
Math.Min(firstChapter + chaptersPerWeek - 1, chapterCount);
Statik bir yerel işlev, bulunduğu üyedeki yerel değişkenleri, parametreleri veya örnek durumunu yakalayamaz. Parametreleri sağlanan verileri açık hale getirirken yakalama, bir yardımcının içinde bulunduğu işlemin bağlamını kullanmasına izin verir.
Sorun kendini yinelediğinde özyineleme kullan
Özyineleme , bir işlev kendisini sorunun daha küçük bir bölümüyle çağırdığında oluşur.
AddWeek örnekte bir hafta eklenir, ardından sonraki hafta için ilk bölümle kendisini çağırır.
Özyinelemeli her işlevin çağrıları durduran bir koşula ihtiyacı vardır.
firstChapter
chapterCount değerini aştığında AddWeek durur:
if (firstChapter > chapterCount)
{
return;
}
Yerel işlevler özyineleme için iyi çalışır, çünkü adları, kapsayıcı üyenin tamamında kapsam içindedir. Yinelenen çalışmayı daha doğrudan ifade eden bir döngü tercih edin. Özyinelemeli yapı algoritmanın anlaşılmasını kolaylaştırdığında özyineleme'yi seçin.
Yerel işlev veya lambda ifadesi seçin
Yerel işlevler ve lambda ifadeleri çevresindeki değişkenleri kullanabilir, ancak farklı bir amacı ifade eder:
| Seç | When |
|---|---|
| Yerel işlev | Yardımcı bir addan yararlanır, çeşitli ifadeleri vardır, özyineleme gerekir veya içeren üyede birden fazla yerden çağrılır. |
| Lambda ifadesi | Kısa bir davranışı doğrudan başka bir yönteme geçirir veya bir temsilci değişkeninde depolarsınız. |
Aşağıdaki kod her iki formu da kullanır:
static IEnumerable<string> DescribeShortWeeks(
IEnumerable<ReadingWeek> plan,
int maximumChapters)
{
return plan
.Where(IsShortWeek)
.Select(week => $"Week {week.Number}: {week.FirstChapter}-{week.LastChapter}");
bool IsShortWeek(ReadingWeek week) =>
week.LastChapter - week.FirstChapter + 1 <= maximumChapters;
}
Console.WriteLine("Short weeks:");
foreach (string description in DescribeShortWeeks(plan, maximumChapters: 2))
{
Console.WriteLine(description);
}
IsShortWeek, Where öğesine iletilen kurala açıklayıcı bir ad verir.
Select’a geçirilen lambda, kullanım noktasında kısa bir dönüşüm gerçekleştirir. Her iki form da burada başka bir yönteme davranış sağlar. Yerel işlev, okuma planı örneğinde AddWeek’ın olduğu gibi, doğrudan çağırdığınız bir yardımcı da olabilir.
Yardımcı birkaç üye tarafından kullanılacaksa yerel işlev yerine normal bir yöntem kullanın. Davranış kısa olduğunda ve amacı çağıran yöntemden açık olduğunda bunun yerine bir lambda kullanın.
Yerel işlevler, yield return içeren yineleyici işlevler de olabilir. Bu kullanım için bkz. Yineleyiciler.