SORU
21 Ocak 2010, PERŞEMBE


Neden ve C boks kutulama ihtiyacımız var#mı?

Neden ve C boks kutulama ihtiyacımız var# mı?

Boks ve kutulama ne olduğunu biliyorum, ama gerçek kullanımı idrak edemiyorum. Neden ve nerede kullanmalıyım?

short s=25;

object objshort=s;  //Boxing

short anothershort=(short)objshort; //Unboxing

CEVAP
21 Ocak 2010, PERŞEMBE


Neden

Bir birleşik tip sistem ve izin değer türleri için tamamen farklı bir temsilini kendi temel veri yolu başvuru türleri temsil eder ve onların temel veri (örneğin, bir int sadece bir kova otuz iki kuruş olan tamamen farklı bir referans türü).

Bu gibi düşünün. Tür o değişken object. Ve şimdi int ve o içine koymak istiyorum. o bir yerde herhangi bir şey için bir referanstır ve int ısrarla bir şey için bir başvuru bir yerde (tüm sonra, sadece bir numara). Yani, ne bu: int depolayabilirsiniz object yeni ve o nesne başvurusu atamak. Bu işlem, "boks." diyoruz

Yani, eğer senin umurunda olan bir birleşik tip sistemi (yani, referans türleri ve değer türleri çok farklı gösterimleri ve istemediğin bir ortak yol "temsil" iki) o zaman ihtiyacın yok boks. Eğer seni önemsemiyor olması int temsil onların temel değer (yani, onun yerine int referans türleri ve mağaza başvuru için temel kendi değer) o zaman ihtiyacın yok boks.

nerede kullanmalıyım.

Örneğin, eski koleksiyon türü ArrayList objects yiyor. Yani, sadece bir yerde yaşayan şeyler için başvurular depolar. Boks olmadan böyle bir koleksiyon int koyamazsınız. Ama boks ile yapabilirsiniz.

Şimdi, jenerik günlerde gerçekten bu gerekmez ve genellikle neşeyle birlikte konu hakkında düşünmeden gidebilir. Ama dikkat edilmesi gereken bazı uyarılar vardır:

Bu doğru

double e = 2.718281828459045;
int ee = (int)e;

Bu değildir:

double e = 2.718281828459045;
object o = e; // box
int ee = (int)o; // runtime exception

Bunun yerine, bunu yapmak gerekir:

double e = 2.718281828459045;
object o = e; // box
int ee = (int)(double)o;

İlk açıkça double ((double)o) paketinden çıkarın ve sonra int bunu atmak zorundayız.

Aşağıdaki sonucu ne oldu:

double e = 2.718281828459045;
double d = e;
object o1 = d;
object o2 = e;
Console.WriteLine(d == e);
Console.WriteLine(o1 == o2);

Bir sonraki cümleye geçmeden önce bir an için düşün.

True False harika söyledin! Bekle, ne? Referans tipleri == eğer temel değerleri eşitse değilse başvuruları eşit olup olmadığını kontrol eden referans-eşitlik, kullanır çünkü. Bunu yapmak için tehlikeli kolay bir hatadır. Belki de daha ince

double e = 2.718281828459045;
object o1 = e;
object o2 = e;
Console.WriteLine(o1 == o2);

ayrıca False baskı!

Daha iyi söylemek için:

Console.WriteLine(o1.Equals(o2));

sonra, neyse ki, yazdırma 37* *olacak.

Son bir incelik:

[struct|class] Point {
    public int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

Point p = new Point(1, 1);
object o = p;
p.x = 2;
Console.WriteLine(((Point)o).x);

Çıkışı nedir? Duruma göre değişir! Point struct bir ise çıkış 1 ama Point class bir ise çıkış 2! Boks bir dönüşüm değeri bir kopyasını kutulu davranış farkı açıklayan bir varlık yapar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Developers

    Android Deve

    9 Kasım 2007
  • RyanXLT

    RyanXLT

    22 Ocak 2011
  • Tina Chen

    Tina Chen

    26 Mayıs 2012