Kutulama ve Kutudan Çıkarma (C# Programlama Kılavuzu)
Kutu içine alma, bir değer türününobject türüne ya da bu değer türü tarafından uygulanan herhangi bir arabirim türüne örtük dönüştürülmesi işlemidir.CLR bir değer türünü kutuladığında, değeri bir System.Object nesnesiyle sarar ve yönetilen öbekte depolar.Kutudan çıkarma, değer türünü nesneden çıkarır.Kutulama örtüktür; kutulama kaldırma açıktır.Kutulama ve kutudan çıkarma kavramı, C#'ın herhangi bir değerin bir nesne olarak işlem görebildiği tür sistemine yönelik bütünleştirilmiş bakışının ardında yatan kavramdır.
Aşağıdaki örnekte i tam sayı değişkeni kutu içine alınmış ve o nesnesine atanmıştır.
int i = 123;
// The following line boxes i.
object o = i;
o nesnesi daha sonra kutudan çıkarılabilir ve i tamsayı değişkenine atanır:
o = 123;
i = (int)o; // unboxing
Aşağıdaki örnekler C#'ta kutulamanın nasıl kullanıldığı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
Performans
Basit atamalara ilişkin, kutulama ve açma işlemleri hesaplama aşısından pahalı bir işlemdir.Bir değer türü kutulandığında, yeni bir nesneye bellekte yer ayrılması ve nesnenin yapılması gerekir.Daha düşük bir düzeyde olmak kaydıyla kutudan çıkarmak için gereken dönüştürme, çalışma verimliliği açısından da pahalıdır.Daha fazla bilgi için bkz: Performans.
Kutulama
Kutulama, çöp toplama yığınındaki değer türlerini kaydetmek için kullanılır.Kutu içine alma, bir değer türününobject türüne ya da bu değer türü tarafından uygulanan herhangi bir arabirim türüne örtük dönüşümüdür.Bir değer türünü kutu içine almak, yığındaki bir nesne örneğini tahsis eder ve değeri yeni nesneye kopyalar.
Aşağıdaki değer türündeki değişken bildirimini ele alalım:
int i = 123;
Aşağıdaki deyim, i değişkenine örtülü olarak kutulama işlemini uygulamaktadır:
// Boxing copies the value of i into object o.
object o = i;
Bu deyim, yığında (stack), int türündeki bir öbek (heap) değerine başvuran o adlı bir nesne başvurusu oluşturur.Bu değer, i değişkenine atanan değer türü değerinin bir kopyasıdır.İki değişken: i ve o arasındaki fark, aşağıdaki şekilde gösterilmiştir.
Kutulama Dönüştürmesi
Ayrıca aşağıdaki örnekte olduğu gibi kutulama açık şekilde yapılabilir ancak açık kutulama hiçbir zaman gerekli değildir:
int i = 123;
object o = (object)i; // explicit boxing
Tanımlama
Bu örnek, i tamsayı değişkenini kutulama kullanarak o nesnesine dönüştürür.Sonra, i değişkeninde depolanan değer 123'ten 456'ya döner.Örnek, baştaki değer türünün ve kutulanmış nesnenin ayrı bellek konumları kullandığını ve bu nedenle farklı değerler depoluyor olabileceğini göstermektedir.
Ö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
*/
Aşağıdaki örnek, geçersiz bir kutulama örneğini ve ortaya çıkan InvalidCastException özel durumunu göstermektedir.try ve catch kullanıldığında, bir hata oluştuğunda bir hata iletisi gösterilir.
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ın çıktısı şudur:
Specified cast is not valid. Error: Incorrect unboxing.
Deyimi değiştirirseniz:
int j = (short) o;
bitiş:
int j = (int) o;
dönüştürme yapılır ve şu çıktıyı alırsınız:
Unboxing OK.
Kutudan Çıkarma
Kutudan çıkarma object türünden bir değer türüne veya bir arabirim türünden arabirimi uygulayan bir değer türüne doğrudan bir dönüştürmedir.Bir kutudan çıkarma işlemi şunlardan oluşur:
Bunun verilen değer türünün kurulu bir değeri olduğundan emin olmak için nesne örneğini denetleme.
Değerin örnekten değer türü değişkenine kopyalanması.
Aşağıdaki deyimler, hem kutulama, hem kutudan çıkarma işlemlerini göstermektedir:
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing
Aşağıdaki şekil önceki deyimlerin sonucunu göstermektedir.
Kutudan Çıkarma Dönüştürmesi
Değer türlerinin açılması işleminin çalışma zamanında başarılı olması için açılan öğe, değer türünün bir örneği kutulanarak önceden oluşturulan bir nesneye başvuru olmalıdır.null açmaya çalışmak bir NullReferenceException'e neden olur.Bir başvuruyu uyumsuz bir değer türüne açmaya çalışmak bir InvalidCastException'ye neden olur.
C# Dil Belirtimi
Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.
İlgili Bölümler
Daha fazla bilgi için:
C# Dil Belirtimi
Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.