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
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
object
s 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.
Tam olarak Maven bir Anlık nedir ve ne...
Neden C Sanal Yöntemler ihtiyacımız va...
Neden monadlar ihtiyacımız var mı?...
#Pragma işaretlerinin önemi nedir? Ned...
Neden varlık nesneleri ihtiyacımız var...