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.
Not
Bu makale bir özellik belirtimidir. Belirtim, özelliğin tasarım belgesi olarak görev alır. Önerilen belirtim değişikliklerini ve özelliğin tasarımı ve geliştirilmesi sırasında gereken bilgileri içerir. Bu makaleler, önerilen belirtim değişiklikleri son haline getirilene ve geçerli ECMA belirtimine dahil edilene kadar yayımlanır.
Özellik belirtimi ile tamamlanan uygulama arasında bazı tutarsızlıklar olabilir. Bu farklılıklar, dil tasarım toplantısı (LDM) notlarındabelirtilir.
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için belirtimleri makalesinde bulabilirsiniz.
Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/2608
Özet
.NET platformunun derleme için başlatma kodu yazmayı doğrudan destekleyen bir özelliği olsa da (teknik olarak modül), C# dilinde kullanıma sunulmaz. Bu oldukça niş bir senaryodur, ancak bununla karşılaştıktan sonra çözümler oldukça acı verici görünüyor. sorunla boğuşan (Microsoft'un içinde ve dışında) bir dizi müşteri olduğuna dair raporlar var ve hiç şüphe yok ki daha fazla belgelenmemiş vaka var.
Motivasyon
- Kütüphanelerin yüklendiğinde, minimum ek yükle ve kullanıcının açıkça herhangi bir şey çağırmasına gerek kalmadan istekli, tek seferlik başlatma gerçekleştirmesini sağlama.
- Geçerli
static
oluşturucu yaklaşımlarının belirli bir sorun noktası, çalışma zamanının statik oluşturucunun çalıştırılması gerekip gerekmediğine karar vermek için statik oluşturucu ile bir türün kullanımı üzerinde ek denetimler yapması gerektiğidir. Bu, ölçülebilir ek yük ekler. - Kaynak oluşturucuların, kullanıcının açıkça herhangi bir şey çağırmasına gerek kalmadan bazı genel başlatma mantığını çalıştırmasını sağlama
Ayrıntılı tasarım
Bir yöntem, [ModuleInitializer]
özniteliğiyle süslenerek modül başlatıcısı olarak belirlenebilir.
using System;
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public sealed class ModuleInitializerAttribute : Attribute { }
}
Özniteliği şu şekilde kullanılabilir:
using System.Runtime.CompilerServices;
class C
{
[ModuleInitializer]
internal static void M1()
{
// ...
}
}
Bu öznitelikle hedeflenen yönteme bazı gereksinimler uygulanır:
- yöntemi
static
olmalıdır. - Yöntemin parametresiz olması gerekir.
- yöntemi
void
döndürmelidir. - Yöntemin genel olmaması veya genel bir türde yer almaması gerekir.
- Yöntem, içinde bulunduğu modülden erişilebilir olmalıdır.
- Bu, yöntemin etkin erişilebilirliğinin
internal
veyapublic
olması gerektiği anlamına gelir. - Bu, yöntemin yerel bir işlev olamayacağı anlamına da gelir.
- Bu, yöntemin etkin erişilebilirliğinin
Derlemede bu öznitelikle bir veya daha fazla geçerli yöntem bulunduğunda, derleyici öznitelikli yöntemlerin her birini çağıran bir modül başlatıcısı yayar. Çağrılar ayrılmış, ancak belirleyici bir sırada gönderilir.
Dezavantaj -ları
Bunu neden yapmamalıyız?
- Modül başlatıcılarını "eklemek" için mevcut üçüncü taraf araçları bu özelliği isteyen kullanıcılar için yeterli olabilir.
Tasarım toplantıları
8 Nisan 2020
C# feature specifications