Önceden işaretleme bayrağı ne yapar? Sınıfımın IL'sine baktığımda bu bayrağı görüyorum ama bu bayrağın aslında ne yaptığını bilmiyorum.Önceden işaretleme bayrağı ne yapar?
cevap
Bu konuyla ilgili olarak my article adresine bakın.
Temel olarak, beforefieldinit
"tür, herhangi bir statik alan referans alınmadan önce herhangi bir noktada başlatılabilir." teorisinde çok tembel başlatılmış olabilir - herhangi bir alana dokunmayan statik bir yöntem çağırırsanız, JIT türünü başlatmaya gerek duymaz. Uygulamada yılında
buna başka türlü olurdu sınıf öncekivar demektir - bu kullanabilecek ilk yöntemin başlangıcında başlatılması için önemli değil. Bunu, 'un'un beforefieldinit
'a uygulanmadığı türlerle karşılaştırın; burada tür başlatımı, ilk gerçek kullanımdan hemen önce gerçekleşmelidir.
Yani, biz varsayalım:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
her iki tür (tip statik yapıcı olmadıkça C#, varsayılan olarak yapmak) uygulanmış beforefieldinit
varsa o zaman hem başlatıldı olacak Yöntemin başında (genellikle - garanti edilmez). Eğer beforefieldinit
yoksa, bunlardan sadece bir bayrağına göre başlatılacaktır.
Bu nedenle, implementing the singleton pattern olduğunda statik bir kurucu (boş bir kişi!) Kullanmak yaygındır.
Awesome, bu kadar bekleyeceğiniz anlamına geliyor alanı sonlandırmak için son anı (eğer 'önceden planlanmış olup olmadığına bakılmaksızın)? –
İlk kullanımdan önce tüm girişler başlangıç kontrolü ile öneklenecektir. Bundan sonra, diğer yöntemler jatch edildiğinde, oluşturulan kod doğrudan alana erişecektir. Eğer ilkel bir tipse, JIT zaman sabiti olarak da kullanılabilir. – OmariO
Jon'un başlatma başlatma türündeki değişikliklerle ilgili ayrıntılı analizi .Net 4.0 [burada] (https: //codeblog.jonskeet.uk/2010/01/26/tip-başlatma-değişimler-in-net-4-0 /). – RBT
- 1. PathGeneratedInternal bayrağı WPF bağlayıcısında ne yapar?
- 2. System.Concurrency.AsyncLock ne yapar?
- 3. ^Ne yapar?
- 4. Kuyruktaki -f bayrağı ne yapıyor?
- 5. -i bayrağı docker'da ne yapıyor?
- 6. Ne Request.Params ["anahtar"] ne yapar?
- 7. PyParsing: Kombine() ne yapar?
- 8. DBContext.Entry ne yapar?
- 9. ConnectionRefused ne yapar?
- 10. @Transactional ne yapar?
- 11. IAppbuilder.UseWebApi ne yapar?
- 12. `#` özniteliği HTML'de ne yapar?
- 13. Cygwin'de rebaseall ne yapar?
- 14. PostInvalidate() ne yapar?
- 15. System.Reflection.Missing.Value ne yapar?
- 16. FormsAuthentication.SetAuthCookie ne yapar
- 17. C++ - [=] ne yapar?
- 18. ImageSwitcher aslında ne yapar?
- 19. -XX: MaxPermSize ne yapar?
- 20. Aşağıdaki kod ne yapar?
- 21. Intent.putExtra ne yapar
- 22. Mod_auth_passthrough ne yapar?
- 23. "Tasarruf (yanlış)" ne yapar?
- 24. rb-fsevent ne yapar?
- 25. "@" simgesi SQL'de ne yapar?
- 26. APIENTRY ne yapar?
- 27. Backtick'ler R'de ne yapar?
- 28. .subscribe() işlevi ne yapar
- 29. Nesne (bu) ne yapar?
- 30. Connect.js methodOverride ne yapar?
içinde değişecek gibi görünüyor "Herhangi alanlar başvurulan önce tip herhangi bir noktada başlatılabilir." _ Statik yöntemler çalıştırmak için doğrudur da nedir? –
@RoyiNamir, CLI özellikleri, BeforeFieldInit uygulandığında, "türün başlatıcı yöntemi, bu tür için tanımlanan herhangi bir statik alana ilk önce veya daha önce yürütülür", diyor. Bu öznitelik atlanırsa (statik .ctor) o zaman "bu türdeki herhangi bir statik veya örnek alanına ilk erişim veya bu türdeki herhangi bir statik, örnek veya sanal yöntemin ilk çağrılması". Bu nedenle, statik yöntem başka bir statik alana başvurmadıkça, BeforeFieldInit için geçerli değildir. –
Statik kurucuların kullanılmasına yönelik bir performans cezası olduğunu fark ettim (yani, önceden konumlandırılmış bayrağı bulunmayan sınıflar). Belirli bir sınıfa ait statik üyeleri sık sık çağırırsanız, çalışma zamanının, türün henüz başlatılmamış olup olmadığını sınamak için her aramadan önce ek bir kontrol yapması gerektiği görülür; Bu kontrollerden kaçınır. Birkaç kıyaslama daha önce% 50 daha hızlıydı: http://www.codeproject.com/Articles/87991/Dynamic-interfaces-in-any-NET-language – Qwertie