Aracılığıyla paylaş


Boxing ve kutulamayý kaldýrmayý (c Programlama Kılavuzu #)

Kutulama dönüştürme işlemi olan bir değer türü türü object veya herhangi bir arabirim türüne uygulanan bu değer türüne göre.Bir değer türü clr kutularını bir System.Object içindeki sarar ve yönetilen öbek üzerinde saklar.Kutulama değer türü nesneden çıkarır.Kutulama örtülü; kutulama açık olur.Kutulama ve kutulamayý kaldýrmayý kavramını c birleşik # görünüm türü sisteminin herhangi bir türde bir değer bir nesne olarak değerlendirilebilen underlies.

Aşağıdaki örnekte, tamsayı değişkeni i olan Kutulu ve nesneye atanan o.

int i = 123;
// The following line boxes i.
object o = i;  

Nesne o sonra unboxed ve tamsayı değişkenine atanan i:

o = 123;
i = (int)o;  // unboxing

Aşağıdaki örnekler, kutulama C# [NULL]'ta kullanılışını göstermektedir.

// String.Concat example.
// String.Concat has many versions. Rest the mouse pointer on 
// Concat in the following statement to verify that the version
// that is used here takes three object arguments. Both 42 and
// true must be boxed.
Console.WriteLine(String.Concat("Answer", 42, true));


// List example.
// Create a list of objects to hold a heterogeneous collection 
// of elements.
List<object> mixedList = new List<object>();

// Add a string element to the list. 
mixedList.Add("First Group:");

// Add some integers to the list. 
for (int j = 1; j < 5; j++)
{
    // Rest the mouse pointer over j to verify that you are adding
    // an int to a list of objects. Each element j is boxed when 
    // you add j to mixedList.
    mixedList.Add(j);
}

// Add another string and more integers.
mixedList.Add("Second Group:");
for (int j = 5; j < 10; j++)
{
    mixedList.Add(j);
}

// Display the elements in the list. Declare the loop variable by 
// using var, so that the compiler assigns its type.
foreach (var item in mixedList)
{
    // Rest the mouse pointer over item to verify that the elements
    // of mixedList are objects.
    Console.WriteLine(item);
}

// The following loop sums the squares of the first group of boxed
// integers in mixedList. The list elements are objects, and cannot
// be multiplied or added to the sum until they are unboxed. The
// unboxing must be done explicitly.
var sum = 0;
for (var j = 1; j < 5; j++)
{
    // The following statement causes a compiler error: Operator 
    // '*' cannot be applied to operands of type 'object' and
    // 'object'. 
    //sum += mixedList[j] * mixedList[j]);

    // After the list elements are unboxed, the computation does 
    // not cause a compiler error.
    sum += (int)mixedList[j] * (int)mixedList[j];
}

// The sum displayed is 30, the sum of 1 + 4 + 9 + 16.
Console.WriteLine("Sum: " + sum);

// Output:
// Answer42True
// First Group:
// 1
// 2
// 3
// 4
// Second Group:
// 5
// 6
// 7
// 8
// 9
// Sum: 30

Başarım

Basit atamaları ile ilgili olarak, kutulama ve kutulamayý kaldýrmayý hesaplama pahalı işlemlerdir.Bir değer türü kutulu, yeni bir nesne ayrılan ve oluşturulması gerekir.Daha az bir dereceye kadar gerekli kutulama için cast da hesaplama pahalıdır.Daha fazla bilgi için bkz: Performans.

Kutulama

Kutulama atık olarak toplanmış öbeğe değer türlerini depolamak için kullanılır.Kutulama olduğu bir örtük dönüştürme bir değer türü türü object veya herhangi bir arabirim türüne uygulanan bu değer türüne göre.Bir değer türü boxing öbek üzerindeki bir nesne örneği ayırır ve yeni bir nesne değeri kopyalar.

Bir değer türü değişkeni aşağıdaki bildiriyi göz önünde bulundurun:

int i = 123;

Aşağıdaki ifadeyi örtülü olarak değişken kutulama işlemi uygular i:

// Boxing copies the value of i into object o.
object o = i;  

Bu deyimin sonucu bir nesne başvurusu oluşturma o, türünde bir deðer başvuran yýðýn üzerinde int, öbek üzerindeki.Bu değer değişkenine atanan değer türü değeri bir kopyası i.İki değişken arasındaki fark i ve o, aşağıdaki şekilde gösterilmiştir.

Kutulama dönüştürme

BoxingConversion grafiği

Kutulama açıkça olarak aşağıdaki örnekte, ancak açık kutulama de gerçekleştirilebilir kesinlikle gereklidir:

int i = 123;
object o = (object)i;  // explicit boxing

Description

Bu örnek, bir tamsayı değişken dönüştürür i bir nesneyi o kutulama kullanarak.Daha sonra deðiþkeninde saklanan değeri i değiştirilirse 123 için 456.Bu örnek, özgün değer türü ve kutulanmış nesneyi ayrı bellek konumlarını ve bu nedenle farklı değerler saklayabilirsiniz olduğunu gösterir.

Örnek

class TestBoxing
{
    static void Main()
    {
        int i = 123;

        // Boxing copies the value of i into object o.
        object o = i;  

        // Change the value of i.
        i = 456;  

        // The change in i does not effect the value stored in o.
        System.Console.WriteLine("The value-type value = {0}", i);
        System.Console.WriteLine("The object-type value = {0}", o);
    }
}
/* Output:
    The value-type value = 456
    The object-type value = 123
*/

Geçersiz bir kutulama, servis talebi ve sonuç aşağıdaki örnekte gösterilmiştir InvalidCastException.Kullanarak try ve catch, hata oluştuğunda bir hata iletisi görüntülenir.

class TestUnboxing
{
    static void Main()
    {
        int i = 123;
        object o = i;  // implicit boxing

        try
        {
            int j = (short)o;  // attempt to unbox

            System.Console.WriteLine("Unboxing OK.");
        }
        catch (System.InvalidCastException e)
        {
            System.Console.WriteLine("{0} Error: Incorrect unboxing.", e.Message);
        }
    }
}

Bu program verir:

Specified cast is not valid. Error: Incorrect unboxing.

Deyimi değiştiriyorsanız:

int j = (short) o;

için:

int j = (int) o;

dönüştürme gerçekleştirilir ve çıkış elde edersiniz:

Unboxing OK.

Kutulama kaldırma

Kutulama olduğu türünden açýk bir dönüþtürme object için bir değer türü veya arabirimini uygulayan bir değer türü için bir arabirim türü.Bir kutulama kaldırma işlemi aşağıdakilerden oluşur:

  • Nesne örneği verilen değer türünün paketlenmiş bir değer olduğundan emin olmak için denetleniyor.

  • Değer türü değişkeni örneğine değer kopyalama.

Aþaðýdaki ifadeleri boxing ve kutulama işlemleri gösterilmektedir:

int i = 123;      // a value type
object o = i;     // boxing
int j = (int)o;   // unboxing

Aşağıdaki şekil, önceki ifadelerini sonucunu gösterir.

Kutulama kaldırma dönüştürme

Kutudan Çıkarma Dönüşüm grafiği

Çalışma zamanında başarılı olması için değer türlerinin kutulama için bu değer türü örneği boxing tarafından önceden oluşturulmuş bir nesneye bir başvuru unboxed öğe olması gerekir.Kutulamasını girişiminde null neden olan bir NullReferenceException.Uyumsuz bir değere başvuru kutulamasını çalışılıyor yazın neden bir InvalidCastException.

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.

İlgili Bölümler

Daha fazla bilgi için:

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.

Kavramlar

C# Programlama Kılavuzu