Aracılığıyla paylaş


Modül Başlatıcıları

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:

  1. yöntemi staticolmalıdır.
  2. Yöntemin parametresiz olması gerekir.
  3. yöntemi voiddöndürmelidir.
  4. Yöntemin genel olmaması veya genel bir türde yer almaması gerekir.
  5. Yöntem, içinde bulunduğu modülden erişilebilir olmalıdır.
    • Bu, yöntemin etkin erişilebilirliğinin internal veya publicolması gerektiği anlamına gelir.
    • Bu, yöntemin yerel bir işlev olamayacağı anlamına da gelir.

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