PostSharp 2027.0'da advice parameter binding ile aspect'ler boxing olmadan çalışır
PostSharp 2027.0 ile advice parameter binding herkese açık hale geldi: aspect advice'ları artık MethodExecutionArgs yerine tipli parametreler alıyor. Bu sayede sıcak yollarda çağrı başına heap tahsisi, boxing ve cast maliyetleri ortadan kalkıyor. Bağlamalar derleme zamanında denetlendiği için hatalar üretime değil build'e düşüyor.
Kilit noktalar
- MethodLevelAspect'ten türeyin ve override'ları [OnMethodEntryAdvice] gibi attribute'larla işaretli advice metotlarına çevirin.
- [State( StateScope.MethodInvocation )] MethodExecutionTag'in yerini alır; tipli değişken olduğu için cast gerekmez.
- Generic T parametresindeki [ReturnValue] boxing yapmaz; PostSharp T'yi her hedef metot için ayrı çıkarır.
- [DeclarationName] değeri build sırasında hesaplanır, çalışma zamanında reflection çağrısı yapılmaz.
- Bağlama uyumsuzlukları LA0220 ve LA0225 gibi build hatası olarak tüm aspect için bir seferde raporlanır.
- Olay, alan, parametre, OnInvokeAsync ve yield değeri aspect'leri hâlâ AdviceArgs imzasını kullanmalı.
PostSharp 2027.0 ile advice parameter binding herkese açık, belgelenmiş ve derleme zamanında denetlenen bir özellik oldu. Şimdiye kadar OnMethodBoundaryAspect tabanlı bir aspect her çağrıda bir MethodExecutionArgs nesnesi alıyordu; bu da heap tahsisi, argümanlar ve dönüş değeri için boxing, tag için ise cast anlamına geliyordu. Yeni modelde aspect MethodLevelAspect'ten türer ve her advice yalnızca ihtiyaç duyduğu tipli değerleri parametre olarak alır: metot adı, çağrıya özel State değişkeni, dönüş değeri ya da istisna gibi.
Bu, sıcak yollardaki aspect'lerin çalışma zamanı maliyetini mantıklarını yeniden yazmadan büyük ölçüde düşürebileceği anlamına geliyor. Olay, alan ve parametre doğrulama aspect'leri, iterator yield değerleri ve OnInvokeAsync henüz bu modeli desteklemiyor; bunlar eski imzayı kullanmaya devam edebilir. Uyumsuz bağlamalar ise üretimde değil, build sırasında LA kodlu hatalarla fark ediliyor.
Gerçek dünyada kullanımı
- Yüksek trafikli bir istek işleyicisinde çağrı başına tahsis yapmayan bir logging aspect'i.
- Bir servis metodunu süreleyen ve Stopwatch'ı [State] ile advice'lar arasında paylaşan profiling aspect'i.
- Her hedef metodun tam dönüş tipine ihtiyaç duyan generic bir retry ya da cache aspect'i.
Neden önemli
Sıcak yoldaki aspect'ler çağrı başına tahsis ve boxing maliyetinden kurtulabilir; yanlış bağlamalar da üretime çıkmadan build hatasına dönüşür. Olay ve OnInvokeAsync aspect'leri şimdilik eski modelde kalmalı.
Benzer haberler
- C# interface'lerinde collection dönüş tipleri: interface, view ve snapshot farkıNick Cosentino (Dev Leader)2 gün önce
- C#'ta List döngüsü: foreach, for, Index ve Span karşılaştırmasıKhalid Abuhakmeh6 gün önce
- NAudio 3.3.0 ile Windows'a özgü hedef çatıları (TFM) sadeleşiyorMark Heath (Sound Code)18 Eki