stackalloc işleci (C# başvuru)stackalloc operator (C# reference)

stackalloc İşleci, yığında bir bellek bloğu ayırır.The stackalloc operator allocates a block of memory on the stack. Yöntem yürütme sırasında oluşturulan bir yığın ayrılmış bellek bloğu, bu yöntem döndüğünde otomatik olarak atılır.A stack allocated memory block created during the method execution is automatically discarded when that method returns. stackalloc İşleçle ayrılan belleği açık olarak serbest bırakılamaz.You cannot explicitly free memory allocated with the stackalloc operator. Yığın tarafından ayrılan bir bellek bloğu çöp toplamaya tabi değildir ve fixed ifadesiylesabitlenmiş olması gerekmez.A stack allocated memory block is not subject to garbage collection and doesn't have to be pinned with the fixed statement.

İfadesinde stackalloc T[E] E int, T yönetilmeyen bir tür olmalıdır ve türünde bir ifade olmalıdır.In expression stackalloc T[E], T must be an unmanaged type and E must be an expression of type int.

stackalloc İşlecin sonucunu aşağıdaki türlerden birinin değişkenine atayabilirsiniz:You can assign the result of the stackalloc operator to a variable of one of the following types:

  • Aşağıdaki örnekte C# gösterildiği gibi System.Span<T> 7,2 System.ReadOnlySpan<T>veya sonraki bir sürümünden itibaren:Starting with C# 7.2, System.Span<T> or System.ReadOnlySpan<T>, as the following example shows:

    int length = 3;
    Span<int> numbers = stackalloc int[length];
    for (var i = 0; i < length; i++)
    {
        numbers[i] = i;
    }
    

    BirSpan<T> veyaReadOnlySpan<T> değişkenine bir yığın ayrılmış bellek bloğu atadığınızda, güvenli olmayan bir bağlam kullanmanız gerekmez.You don't have to use an unsafe context when you assign a stack allocated memory block to a Span<T> or ReadOnlySpan<T> variable.

    Bu türlerle çalıştığınızda, aşağıdaki örnekte gösterildiği gibi koşullu veya atama stackalloc ifadelerinde bir ifade kullanabilirsiniz:When you work with those types, you can use a stackalloc expression in conditional or assignment expressions, as the following example shows:

    int length = 1000;
    Span<byte> buffer = length <= 1024 ? stackalloc byte[length] : new byte[length];
    

    Not

    Mümkün olduğunda yığın Span<T> tarafından ReadOnlySpan<T> ayrılan bellekle çalışmak için veya türlerini kullanmanızı öneririz.We recommend using Span<T> or ReadOnlySpan<T> types to work with stack allocated memory whenever possible.

  • Aşağıdaki örnekte gösterildiği gibi bir işaretçi türü:A pointer type, as the following example shows:

    unsafe
    {
        int length = 3;
        int* numbers = stackalloc int[length];
        for (var i = 0; i < length; i++)
        {
            numbers[i] = i;
        }
    }
    

    Yukarıdaki örnekte gösterildiği gibi, işaretçi türleriyle çalışırken bir unsafe bağlam kullanmanız gerekir.As the preceding example shows, you must use an unsafe context when you work with pointer types.

Yeni ayrılan belleğin içeriği tanımlı değil.The content of the newly allocated memory is undefined. 7,3 ile C# başlayarak, yeni ayrılan belleğin içeriğini tanımlamak için dizi başlatıcısı sözdizimini kullanabilirsiniz.Starting with C# 7.3, you can use array initializer syntax to define the content of the newly allocated memory. Aşağıdaki örnek bunu yapmak için çeşitli yollar göstermektedir:The following example demonstrates various ways to do that:

Span<int> first = stackalloc int[3] { 1, 2, 3 };
Span<int> second = stackalloc int[] { 1, 2, 3 };
ReadOnlySpan<int> third = stackalloc[] { 1, 2, 3 };

GüvenlikSecurity

Kullanımı, ortak stackalloc dil çalışma zamanında (CLR) arabellek taşması algılama özelliklerini otomatik olarak etkinleştirmektedir.The use of stackalloc automatically enables buffer overrun detection features in the common language runtime (CLR). Bir arabellek taşması algılanırsa, kötü amaçlı kodun yürütülmesi olasılığını en aza indirmek için işlem mümkün olduğunca hızlı bir şekilde sonlandırılır.If a buffer overrun is detected, the process is terminated as quickly as possible to minimize the chance that malicious code is executed.

C# dili belirtimiC# language specification

Daha fazla bilgi için, C# dil belirtiminin yığın ayırma bölümüne bakın.For more information, see the Stack allocation section of the C# language specification.

Ayrıca bkz.See also