Aracılığıyla paylaş


C# derleyicisi tarafından yorumlanan çeşitli öznitelikler

Kodunuzdaki öğelere uygulanabilen ve bu öğelere anlamsal anlam katan çeşitli öznitelikler vardır:

  • Conditional: Bir yöntemin yürütülmesini önişlemci tanımlayıcıya bağımlı hale getirin.
  • Obsolete: Bir türü veya üyeyi (olası) gelecekte kaldırılma amacıyla işaretleyin.
  • Deprecated: (Windows Foundation) Gelecekte kaldırılma olasılığı olan bir türü veya üyeyi işaretleyin.
  • Experimental: Bir türü veya üyeyi deneysel olarak işaretleyin.
  • SetsRequiredMembers: Oluşturucunun tüm gerekli özellikleri ayarlandığını gösterir.
  • AttributeUsage: Özniteliğin uygulanabileceği dil öğelerini bildirin.
  • AsyncMethodBuilder: Zaman uyumsuz bir yöntem oluşturucu türü bildirin.
  • InterpolatedStringHandler: Bilinen bir senaryo için ilişkilendirilmiş bir dize oluşturucu tanımlayın.
  • ModuleInitializer: Modülü başlatan bir yöntem bildirin.
  • SkipLocalsInit: Yerel değişken depolamayı 0 olarak başlatan kodu elide edin.
  • UnscopedRef: Normalde ref olarak yorumlanan bir scoped değişkenin kapsamsız kabul edilmesi gerektiğini bildirin.
  • OverloadResolutionPriority: Belirsiz aşırı yüklemeler için aşırı yükleme çözünürlüğünü etkilemek için bir tiebreaker özniteliği ekleyin.
  • EnumeratorCancellation: Zaman uyumsuz bir numaralandırıcıdaki iptal belirtecinin parametresini belirtin.
  • CollectionBuilder: Koleksiyon ifadesi bu koleksiyon türüne dönüştürüldüğünde koleksiyon türü için oluşturucu yöntemini belirtin.
  • InlineArray: struct türünün satır içi diziolduğunu belirtin.
  • IUnknownConstant: Varsayılan parametre için eksik bağımsız değişkenin nasıl sağlanması gerektiğini belirtir.
  • IDispatchConstant: Varsayılan parametre için eksik bağımsız değişkenin nasıl sağlanması gerektiğini belirtir.

Derleyici, çıkışını değiştirmek ve kodunuzu kullanan geliştiriciler tarafından yapılan olası hataları bildirmek için bu anlamsal anlamları kullanır.

Conditional özniteliği

özniteliği, Conditional bir yöntemin yürütülmesini ön işleme tanımlayıcıya bağımlı hale getirir. Conditional özniteliği için ConditionalAttributebir diğer addır ve bir yönteme veya öznitelik sınıfına uygulanabilir.

Aşağıdaki örnekte, Conditional programa özgü tanılama bilgilerinin görüntülenmesini etkinleştirmek veya devre dışı bırakmak için bir yönteme uygulanır:

#define TRACE_ON
using System.Diagnostics;

namespace AttributeExamples;

public class Trace
{
    [Conditional("TRACE_ON")]
    public static void Msg(string msg)
    {
        Console.WriteLine(msg);
    }
}

public class TraceExample
{
    public static void Main()
    {
        Trace.Msg("Now in Main...");
        Console.WriteLine("Done.");
    }
}

TRACE_ON Tanımlayıcı tanımlanmamışsa izleme çıkışı görüntülenmez. Etkileşimli pencerede kendiniz keşfedin.

Conditional özniteliği, aşağıdaki örnekte gösterildiği gibi DEBUG tanımlayıcı ile birlikte, sürüm derlemeleri için değil, hata ayıklama derlemelerinde izleme ve günlüğe kaydetme özelliklerini etkinleştirmek amacıyla sıkça kullanılır:

[Conditional("DEBUG")]
static void DebugMethod()
{
}

Koşullu olarak işaretlenmiş bir yöntem çağrıldığında, belirtilen ön işleme simgesinin varlığı veya yokluğu derleyicinin yöntemine çağrıları içerip içermediğini veya atlayıp atlamayacağını belirler. Simge tanımlanmışsa çağrı eklenir; aksi takdirde çağrı atlanır. Koşullu yöntem, bir sınıf veya yapı bildiriminde bir yöntem olmalı ve dönüş türüne sahip void olmalıdır. Conditional kullanmak, #if…#endif bloklarındaki yöntemleri kullanmaktan daha temiz, daha zarif ve daha az hataya yatkın bir yöntemdir.

Bir yöntemin birden çok Conditional özniteliği varsa, bir veya daha fazla koşullu simge tanımlanmışsa derleyici yöntemine çağrılar içerir (simgeler OR işleci kullanılarak mantıksal olarak birbirine bağlanır). Aşağıdaki örnekte, veya A varlığının B bir yöntem çağrısına neden olması:

[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
    // ...
}

Öznitelik sınıflarıyla kullanma Conditional

Özniteliği bir Conditional öznitelik sınıfı tanımına da uygulanabilir. Aşağıdaki örnekte, özel öznitelik Documentation tanımlanmışsa DEBUG meta veriye bilgi ekler.

[Conditional("DEBUG")]
public class DocumentationAttribute : System.Attribute
{
    string text;

    public DocumentationAttribute(string text)
    {
        this.text = text;
    }
}

class SampleClass
{
    // This attribute will only be included if DEBUG is defined.
    [Documentation("This method displays an integer.")]
    static void DoWork(int i)
    {
        System.Console.WriteLine(i.ToString());
    }
}

Obsolete ve Deprecated özniteliği

Obsolete özniteliği bir kod öğesini artık kullanılması önerilmez olarak işaretler. Kullanım dışı olarak işaretlenen bir varlığın kullanılması bir uyarı veya hata oluşturur. özniteliği Obsolete tek kullanımlık bir özniteliktir ve özniteliklere izin veren herhangi bir varlığa uygulanabilir. Obsolete , için ObsoleteAttributebir diğer addır.

Aşağıdaki örnekte özniteliği sınıfına ObsoleteA ve yöntemine B.OldMethoduygulanır. B.OldMethod üzerine uygulanan öznitelik oluşturucusunun ikinci bağımsız değişkeni true olarak ayarlandığından, bu yöntem derleyici hatasına neden olurken, A sınıfının kullanılması bir uyarı üretir. B.NewMethodAncak çağrısı hiçbir uyarı veya hata üretmez. Örneğin, önceki tanımlarla kullandığınızda, aşağıdaki kod iki uyarı ve bir hata oluşturur:


namespace AttributeExamples
{
    [Obsolete("use class B")]
    public class A
    {
        public void Method() { }
    }

    public class B
    {
        [Obsolete("use NewMethod", true)]
        public void OldMethod() { }

        public void NewMethod() { }
    }

    public static class ObsoleteProgram
    {
        public static void Main()
        {
            // Generates 2 warnings:
            A a = new A();

            // Generate no errors or warnings:
            B b = new B();
            b.NewMethod();

            // Generates an error, compilation fails.
            // b.OldMethod();
        }
    }
}

Öznitelik oluşturucusunun ilk bağımsız değişkeni olarak sağlanan dize, uyarı veya hata mesajının bir parçası olarak görüntülenir. Sınıf A için iki uyarı oluşturulur: biri sınıf başvurusunun bildirimi için, diğeri de sınıf oluşturucu için. Obsolete özniteliği bağımsız değişken olmadan kullanılabilir, ancak bunun yerine ne kullanılacağına ilişkin bir açıklama da önerilir. Adların eşleştiğinden emin olmak için sabit dize ilişkilendirmesini ve nameof işlecini kullanabilirsiniz:

public class B
{
    [Obsolete($"use {nameof(NewMethod)} instead", true)]
    public void OldMethod() { }

    public void NewMethod() { }
}

Windows Foundation Meta Veri kitaplıkları Windows.Foundation.Metadata.DeprecatedAttributeyerine ObsoleteAttribute kullanır.

Experimental öznitelikleri

C# 12'de başlayarak, türler, yöntemler ve derlemeler deneysel bir özelliği göstermek için ile System.Diagnostics.CodeAnalysis.ExperimentalAttribute işaretlenebilir. ExperimentalAttribute ile açıklama eklenmiş bir yönteme veya türe erişirseniz, derleyici bir uyarı oluşturur. Özniteliğiyle işaretlenmiş bir derlemede veya modülde Experimental bildirilen tüm türler deneyseldir. Bunlardan herhangi birine erişirseniz derleyici bir uyarı görüntüler. Deneysel bir özelliğin pilotu olmak için bu uyarıları devre dışı bırakabilirsiniz.

Uyarı

Deneysel özellikler değişikliklere tabidir. API'ler değişebilir veya gelecekteki güncelleştirmelerde kaldırılabilir. Deneysel özellikleri dahil etmek, kitaplık yazarlarının gelecekteki gelişime yönelik fikirler ve kavramlar hakkında geri bildirim almalarının bir yoludur. Deneysel olarak işaretlenmiş herhangi bir özelliği kullanırken çok dikkatli olun. önizleme API'lerimakalemizde API'lerin nasıl deneysel olarak işaretleneceği hakkında daha fazla bilgi edinebilirsiniz.

Özellik belirtiminde Experimentalözniteliği hakkında daha fazla ayrıntı okuyabilirsiniz.

Windows Foundation Meta Veri kitaplıkları, C# 12'nin öncesi olan Windows.Foundation.Metadata.ExperimentalAttributekullanır.

SetsRequiredMembers özniteliği

Özellik, SetsRequiredMembers derleyiciye bir oluşturucunun bu sınıf veya yapıdaki tüm required üyelerini ayarladığını bildirir. Derleyici, özniteliğine sahip herhangi bir oluşturucunun System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute tüm required üyeleri başlatmış olduğunu varsayar. Böyle bir oluşturucuyu çağıran herhangi bir kodun gerekli üyeleri ayarlamak için nesne başlatıcılara ihtiyacı yoktur. özniteliğini SetsRequiredMembers eklemek öncelikli olarak konumsal kayıtlar ve birincil oluşturucular için yararlıdır.

AttributeUsage özniteliği

özniteliği, AttributeUsage özel öznitelik sınıfının nasıl kullanılabileceğini belirler. AttributeUsageAttribute , özel öznitelik tanımlarına uyguladığınız bir özniteliktir. özniteliği şunları AttributeUsage denetlemenizi sağlar:

  • Özniteliğin uygulanabileceği program öğeleri. Kullanımını kısıtlamadığınız sürece, aşağıdaki program öğelerinin herhangi birine bir öznitelik uygulanabilir:
    • Montaj
    • Modül
    • Alan
    • Etkinlik
    • Metot
    • Parametre
    • Özellik
    • İade
    • Tür
  • Bir özniteliğin tek bir program öğesine birden çok kez uygulanıp uygulanamayacağı.
  • Türetilmiş sınıfların öznitelikleri devralıp devralmadığı.

Varsayılan ayarlar açıkça uygulandığında aşağıdaki örneğe benzer:

[AttributeUsage(AttributeTargets.All,
                   AllowMultiple = false,
                   Inherited = true)]
class NewAttribute : Attribute { }

Bu örnekte sınıfı desteklenen NewAttribute herhangi bir program öğesine uygulanabilir. Ancak her varlığa yalnızca bir kez uygulanabilir. Türetilmiş sınıflar bir temel sınıfa uygulanan özniteliği devralır.

AllowMultiple ve Inherited bağımsız değişkenleri isteğe bağlıdır, bu nedenle aşağıdaki kod aynı etkiye sahiptir:

[AttributeUsage(AttributeTargets.All)]
class NewAttribute : Attribute { }

İlk AttributeUsageAttribute bağımsız değişken, enumerasyonun AttributeTargets bir veya daha fazla öğesi olmalıdır. Aşağıdaki örnekte gösterildiği gibi, OR işleciyle birden çok hedef türü birbirine bağlanabilir:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
class NewPropertyOrFieldAttribute : Attribute { }

Öznitelikler, otomatik olarak uygulanan bir özelliğin özelliğine veya yedekleme alanına uygulanabilir. Bu öznitelik, field belirleyici şeklinde belirtilmediği sürece özelliğe uygulanır. Her ikisi de aşağıdaki örnekte gösterilmiştir:

class MyClass
{
    // Attribute attached to property:
    [NewPropertyOrField]
    public string Name { get; set; } = string.Empty;

    // Attribute attached to backing field:
    [field: NewPropertyOrField]
    public string Description { get; set; } = string.Empty;
}

AllowMultiple Bağımsız değişken isetrue, aşağıdaki örnekte gösterildiği gibi sonuçta elde edilen öznitelik tek bir varlığa birden çok kez uygulanabilir:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
class MultiUse : Attribute { }

[MultiUse]
[MultiUse]
class Class1 { }

[MultiUse, MultiUse]
class Class2 { }

Bu durumda, MultiUseAttributeAllowMultiple olarak ayarlandığı için true tekrar tekrar uygulanabilir. Birden çok öznitelik uygulamak için gösterilen her iki biçim de geçerlidir.

Eğer Inheritedfalse ise, türetilmiş sınıflar özniteliği öznitelikli bir temel sınıftan devralmaz. Örneğin:

[AttributeUsage(AttributeTargets.Class, Inherited = false)]
class NonInheritedAttribute : Attribute { }

[NonInherited]
class BClass { }

class DClass : BClass { }

Bu durumda devralma NonInheritedAttribute yoluyla uygulanmaz DClass .

Bir özniteliğin nereye uygulanacağını belirtmek için bu anahtar sözcükleri de kullanabilirsiniz. Örneğin, tanımlayıcıyı field: kullanarak otomatik olarak uygulanan bir özelliğin yedekleme alanına öznitelik ekleyebilirsiniz. Alternatif olarak, bir konumsal kayıttan oluşturulan öğelerden herhangi birine öznitelik uygulamak için , field: veya property: tanımlayıcısını da kullanabilirsinizparam:. Örnek için bkz . Özellik tanımı için konumsal söz dizimi.

AsyncMethodBuilder özniteliği

Özniteliğini System.Runtime.CompilerServices.AsyncMethodBuilderAttribute zaman uyumsuz dönüş türü olabilecek bir türe eklersiniz. Özniteliği, belirtilen tür, zaman uyumsuz bir yöntemden döndürüldüğünde, zaman uyumsuz yöntem uygulamasını oluşturan türü belirtir. Özniteliği aşağıdaki AsyncMethodBuilder türe uygulanabilir:

özniteliğinin AsyncMethodBuilder oluşturucusu, ilişkili oluşturucunun türünü belirtir. Oluşturucu aşağıdaki erişilebilir üyeleri uygulamalıdır:

  • Oluşturucunun türünü döndüren statik Create() bir yöntem.

  • Eşzamansız dönüş türünü döndüren okunabilir bir Task özelliği.

  • Bir void SetException(Exception) görev hataladığında özel durumu ayarlayan bir yöntem.

  • void SetResult() Görevi tamamlandı olarak işaretleyen ve isteğe bağlı olarak görevin sonucunu ayarlayan veya void SetResult(T result) yöntemi

  • Start Aşağıdaki API imzasını içeren bir yöntem:

    public void Start<TStateMachine>(ref TStateMachine stateMachine)
              where TStateMachine : System.Runtime.CompilerServices.IAsyncStateMachine
    
  • SetStateMachine Aşağıdaki API imzasını içeren bir yöntem:

    public void SetStateMachine(System.Runtime.CompilerServices.IAsyncStateMachine stateMachine)
    
  • AwaitOnCompleted Aşağıdaki imzaya sahip bir yöntem:

    public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
        where TAwaiter : System.Runtime.CompilerServices.INotifyCompletion
        where TStateMachine : System.Runtime.CompilerServices.IAsyncStateMachine
    
  • AwaitUnsafeOnCompleted Aşağıdaki imzaya sahip bir yöntem:

          public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
              where TAwaiter : System.Runtime.CompilerServices.ICriticalNotifyCompletion
              where TStateMachine : System.Runtime.CompilerServices.IAsyncStateMachine
    

Zaman uyumsuz yöntem oluşturucuları hakkında daha fazla bilgi edinmek için, .NET tarafından sağlanan şu oluşturuculara göz atabilirsiniz:

AsyncMethodBuilder özniteliği, oluşturucuyu bu tür için aşmak amacıyla eşzamansız bir yönteme uygulanabilir.

InterpolatedStringHandler ve InterpolatedStringHandlerArguments öznitelikleri

Bir türünilişkilendirmeli dize işleyicisi olduğunu belirtmek için bu öznitelikleri kullanırsınız. .NET 6 kitaplığı, interpole edilmiş bir dizeyi System.Runtime.CompilerServices.DefaultInterpolatedStringHandler parametresi için bağımsız değişken olarak kullandığınız senaryolar için zaten string içerir. Interpolasyon dizelerinin nasıl işlendiğini kontrol etmek istediğiniz başka örnekleriniz de olabilir. İşleyicinizi uygulayan türe System.Runtime.CompilerServices.InterpolatedStringHandlerAttribute'i uygularsınız. Siz System.Runtime.CompilerServices.InterpolatedStringHandlerArgumentAttribute'i o türün oluşturucusunun parametrelerine uygularsınız.

ilişkilendirilmiş dize geliştirmeleri özellik belirtiminde ilişkilendirilmiş dize işleyicisi oluşturma hakkında daha fazla bilgi edinebilirsiniz.

ModuleInitializer özniteliği

özniteliği, ModuleInitializer derleme yüklendiğinde çalışma zamanının çağırdığını bir yöntemi işaretler. ModuleInitializer , için ModuleInitializerAttributebir diğer addır.

ModuleInitializer özniteliği yalnızca şu yönteme uygulanabilir:

  • Statiktir.
  • Parametresizdir.
  • void döndürür.
  • veya içeren modülden internalpublicerişilebilir.
  • Genel bir yöntem değildir.
  • genel bir sınıfta yer almıyor.
  • Yerel bir işlev değildir.

ModuleInitializer Özniteliği birden çok yönteme uygulanabilir. Bu durumda, çalışma zamanının onları çağırma sırası belirleyicidir ancak belirtilmez.

Aşağıdaki örnekte birden çok modül başlatıcı yönteminin kullanımı gösterilmektedir. Init1 ve Init2 yöntemleri, Main'den önce çalışır ve her biri Text özelliğine bir dize ekler. Bu nedenle Main çalıştırıldığında, Text özelliğinde zaten her iki başlatıcı yöntemden gelen dizeler vardır.

using System;

internal class ModuleInitializerExampleMain
{
    public static void Main()
    {
        Console.WriteLine(ModuleInitializerExampleModule.Text);
        //output: Hello from Init1! Hello from Init2!
    }
}
using System.Runtime.CompilerServices;

internal class ModuleInitializerExampleModule
{
    public static string? Text { get; set; }

    [ModuleInitializer]
    public static void Init1()
    {
        Text += "Hello from Init1! ";
    }

    [ModuleInitializer]
    public static void Init2()
    {
        Text += "Hello from Init2! ";
    }
}

Kaynak kodu oluşturucularının bazen başlatma kodu oluşturması gerekir. Modül başlatıcılar bu kod için standart bir yer sağlar. Diğer çoğu durumda, modül başlatıcısı yerine statik bir oluşturucu yazmanız gerekir.

SkipLocalsInit özniteliği

SkipLocalsInit özniteliği, meta veriye kopyalanırken derleyicinin .locals init bayrağını ayarlamasını engeller. SkipLocalsInit özniteliği tek kullanımlık bir özniteliktir ve bir yönteme, özelliğe, sınıfa, yapıya, arabirime veya modüle uygulanabilir ancak derlemeye uygulanamayabilir. SkipLocalsInit , için SkipLocalsInitAttributebir diğer addır.

bayrağı, .locals init CLR'nin bir yöntemde bildirilen tüm yerel değişkenleri varsayılan değerlerine başlatmasına neden olur. Derleyici ayrıca bir değer atamadan önce hiçbir zaman bir değişken kullanmadığınızdan emin olduğundan, .locals init genellikle gerekli değildir. Ancak, ek sıfır başlangıcının, stackalloc kullanarak yığında bir dizi ayırdığınız bazı senaryolarda ölçülebilir bir performans etkisi olabilir. Bu gibi durumlarda özniteliğini SkipLocalsInit ekleyebilirsiniz. Bir yönteme doğrudan uygulanırsa, öznitelik bu yöntemi ve lambdalar ve yerel işlevler de dahil olmak üzere iç içe tüm işlevlerini etkiler. Bir türe veya modüle uygulanırsa, iç içe yerleştirilmiş tüm yöntemleri etkiler. Bu öznitelik soyut yöntemleri etkilemez, ancak uygulama için oluşturulan kodu etkiler.

Bu öznitelik AllowUnsafeBlocks derleyici seçeneğini gerektirir. Bu gereksinim bazı durumlarda kodun atanmamış belleği görüntüleyebildiğini (örneğin, başlatılmamış yığına ayrılan bellekten okuma) işaret eder.

Aşağıdaki örnekte özniteliğin SkipLocalsInit kullanan stackallocbir yöntem üzerindeki etkisi gösterilmektedir. yöntemi, tamsayı dizisi ayrıldığında bellekte ne varsa görüntüler.

[SkipLocalsInit]
static void ReadUninitializedMemory()
{
    Span<int> numbers = stackalloc int[120];
    for (int i = 0; i < 120; i++)
    {
        Console.WriteLine(numbers[i]);
    }
}
// output depends on initial contents of memory, for example:
//0
//0
//0
//168
//0
//-1271631451
//32767
//38
//0
//0
//0
//38
// Remaining rows omitted for brevity.

Bu kodu kendiniz denemek için .csprojAllowUnsafeBlocksderleyici seçeneğini ayarlayın:

<PropertyGroup>
  ...
  <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>

UnscopedRef özniteliği

UnscopedRef özniteliği bir değişken bildirimini kapsamsız olarak işaretler, yani başvurunun kapsam dışına çıkmasına izin verilir.

Derleyicinin ref'ı örtük olarak scoped gibi ele aldığı durumlardaki bu özniteliği eklersiniz.

  • this örnek yöntemleri için struct parametresi.
  • ref türlerine atıfta bulunan ref struct parametreler.
  • out Parametreler.

Öğe System.Diagnostics.CodeAnalysis.UnscopedRefAttribute uygulanarak kapsamsız olarak işaretlenir.

OverloadResolutionPriority özniteliği

, OverloadResolutionPriorityAttribute iki aşırı yükleme belirsiz olduğunda kitaplık yazarlarının bir aşırı yüklemeyi diğerine tercih etmelerini sağlar. Birincil kullanım amacı, kitaplık yazarlarının mevcut kodu kesinti olmadan desteklerken daha iyi performans gösteren aşırı yüklemeler yazmasını sağlamaktır.

Örneğin, ReadOnlySpan<T> kullanan ve bellek ayırmalarını azaltmak için yeni bir aşırı yükleme ekleyebilirsiniz.

[OverloadResolutionPriority(1)]
public void M(params ReadOnlySpan<int> s) => Console.WriteLine("Span");
// Default overload resolution priority of 0
public void M(params int[] a) => Console.WriteLine("Array");

Aşırı yükleme çözümlemesi, iki yöntemin bazı bağımsız değişken türleri için eşit derecede iyi olduğunu dikkate alır. Bir int[] bağımsız değişkeni için, ilk aşırı yüklemeyi tercih eder. Derleyicinin ReadOnlySpan sürümünü tercih etmesini sağlamak için bu aşırı yüklemenin önceliğini artırabilirsiniz. Aşağıdaki örnekte özniteliği eklemenin etkisi gösterilmektedir:

var d = new OverloadExample();
int[] arr = [1, 2, 3];
d.M(1, 2, 3, 4); // Prints "Span"
d.M(arr); // Prints "Span" when PriorityAttribute is applied
d.M([1, 2, 3, 4]); // Prints "Span"
d.M(1, 2, 3, 4); // Prints "Span"

En yüksek aşırı yükleme önceliğine göre daha düşük önceliğe sahip tüm aşırı yüklemeler, geçerli yöntemler kümesinden kaldırılır. Bu özniteliği olmayan yöntemlerin aşırı yükleme önceliği varsayılan olarak sıfır olarak ayarlanmıştır. Kütüphane yazarları, yeni ve daha iyi bir yöntem aşırı yükleme eklerken son çare olarak bu özniteliği kullanmalıdır. Kitaplık yazarları, Aşırı yükleme çözümlemesinin daha iyi bir yöntem seçmeyi nasıl etkilediğini ayrıntılı olarak anlamalıdır. Aksi takdirde beklenmeyen hatalar oluşabilir.

EnumeratorCancellation özniteliği

System.Runtime.CompilerServices.EnumeratorCancellationAttribute özniteliği, System.Collections.Generic.IAsyncEnumerable<T>.GetAsyncEnumerator(CancellationToken) API'sinden iptal belirtecini alması gereken parametreyi belirtir. eşzamansız akışlar özelliğinin altyapısının bir parçasıdır.

CollectionBuilder özniteliği

System.Runtime.CompilerServices.CollectionBuilderAttribute özniteliği, birkoleksiyon ifadesinden koleksiyon türünün bir örneğini oluşturan bir yöntemi belirtir. Koleksiyonu oluşturan bir yöntem belirtmek için bu özniteliği kullanırsınız. Derleyici, bir koleksiyon ifadesi bu türe dönüştürüldüğünde bu yöntemi çağırmak için kod oluşturur.

InlineArray özniteliği

System.Runtime.CompilerServices.InlineArrayAttribute özniteliği, bir türü satır içi diziolarak işaretler. Bu özellik hakkında daha fazla bilgiyi structsmakalesinin satır içi dizilerbölümünde edinebilirsiniz.

IUnknownConstant ve IDispatchConstant öznitelikleri

System.Runtime.CompilerServices.IUnknownConstantAttribute ve System.Runtime.CompilerServices.IDispatchConstantAttribute öznitelikleri, new UnknownWrapper(null) veya new DispatchWrapper(null)olarak eksik bir bağımsız değişkenin sağlanması gerektiğini belirtmek için varsayılan parametrelere eklenebilir.

Ayrıca bkz.