Aracılığıyla paylaş


Sabit ifade (C# Reference)

fixed Deyimi taşınabilir bir değişkeni yeniden konumlandırma Çöp toplayıcı engeller.fixed Deyimi izin yalnızca bir güvensiz içerik.Fixedoluşturmak için de kullanılabilir sabit boyutlu arabellekler.

fixed İfade ayarlar bir işaretçi yönetilen bir değişken ve "pin" Bu değişkeni deyimi yürütme sırasında.Olmadan fixed, taşınabilir yönetilen değişkenleri için işaretçiler az miktarda çöp toplama değişkenleri yazıcılarında yükleyebileceğiniz bu yana olurdu.C# derleyicisi yalnızca bir işaretçiyi yönetilen bir değişkene atamak sağlar bir fixed ifadesi.

unsafe static void TestMethod()
{

    // Assume that the following class exists.
    //class Point 
    //{ 
    //    public int x;
    //    public int y; 
    //}

    // Variable pt is a managed variable, subject to garbage collection.
    Point pt = new Point();

    // Using fixed allows the address of pt members to be taken,
    // and "pins" pt so that it is not relocated.

    fixed (int* p = &pt.x)
    {
        *p = 1;
    }        

}

Bir dizi, bir dize, bir sabit boyutlu arabellek veya bir değişken adresini kullanarak bir işaretçi baþlatabilirsiniz.Aşağıdaki örnek, değişken adresleri, diziler ve dizeleri kullanımını göstermektedir.Sabit boyutlu arabellekler hakkında daha fazla bilgi için bkz: Sabit boyutlu arabellekler (C# Programlama Kılavuzu).

static unsafe void Test2()
{
    Point point = new Point();
    double[] arr = { 0, 1.5, 2.3, 3.4, 4.0, 5.9 };
    string str = "Hello World";

    // The following two assignments are equivalent. Each assigns the address
    // of the first element in array arr to pointer p.

    // You can initialize a pointer by using an array.
    fixed (double* p = arr) { /*...*/ }

    // You can initialize a pointer by using the address of a variable. 
    fixed (double* p = &arr[0]) { /*...*/ }

    // The following assignment initializes p by using a string.
    fixed (char* p = str) { /*...*/ }

    // The following assignment is not valid, because str[0] is a char, 
    // which is a value, not a variable.
    //fixed (char* p = &str[0]) { /*...*/ } 


    // You can initialize a pointer by using the address of a variable, such
    // as point.x or arr[5].
    fixed (int* p1 = &point.x)
    {
        fixed (double* p2 = &arr[5])
        {
            // Do something with p1 and p2.
        }
    }
}

Tümü aynı türde olması koşuluyla çoklu işaretçiler baþlatabilirsiniz.

fixed (byte* ps = srcarray, pd = dstarray) {...}

İşaretçiler, farklı türlerde başlatmak için sadece içe fixed aşağıdaki örnekte gösterildiği gibi ifadeler.

fixed (int* p1 = &point.x)
{
    fixed (double* p2 = &arr[5])
    {
        // Do something with p1 and p2.
    }
}

Kod deyiminde yürütüldükten sonra herhangi bir sabitlenmiş unpinned ve tabi çöp toplama değişkenlerdir.Bu nedenle, bu değişkenleri dışında işaret değil fixed ifadesi.

[!NOT]

Sabit deyimler başlatılan işaretçiler değiştirilemez.

Güvenli modda, yere çöp toplama tabi değildir ve bu nedenle sabitlenmiş gerekmez yığın bellek ayırabilirsiniz.Daha fazla bilgi için bkz: stackalloc.

Örnek

    class Point
    { 
        public int x, y; 
    }

    class FixedTest2 
    {
        // Unsafe method: takes a pointer to an int.
        unsafe static void SquarePtrParam (int* p) 
        {
            *p *= *p;
        }

        unsafe static void Main() 
        {
            Point pt = new Point();
            pt.x = 5;
            pt.y = 6;
            // Pin pt in place:
            fixed (int* p = &pt.x) 
            {
                SquarePtrParam (p);
            }
            // pt now unpinned.
            Console.WriteLine ("{0} {1}", pt.x, pt.y);
        }
    }
    /*
    Output:
    25 6
     */

C# dil belirtiminin

Daha fazla bilgi için bkz: C# dil belirtiminin. Dil belirtimi, C# sözdizimi ve kullanımı için nihai kaynaktır.

Ayrıca bkz.

Başvuru

C# anahtar sözcükler

güvenli olmayan (C# Reference)

Sabit boyutlu arabellekler (C# Programlama Kılavuzu)

Kavramlar

C# Programlama Kılavuzu

Diğer Kaynaklar

C# Başvurusu