SORU
12 Kasım 2010, Cuma


Neden döküm kaçınılmalıdır?

Ben genel olarak kötü uygulama kodlama olduğunu izlenim altında olduğum için mümkün olduğunca türleri döküm önlemek ve başarım sorunlarına neden olabilir.

Ama eğer biri bana bunun nedenini açıklamak istese, muhtemelen araba farı görmüş geyik gibi onlara bakar.

Neden/ne zaman kötü bir döküm?

Java, c için genel#, c ya da her farklı çalışma zamanı ortamı kendi istediği şekilde yapıyor mu?

Herhangi bir dil hoş geldiniz örneği ayrıntıları için neden c kötü mü ?

CEVAP
12 Kasım 2010, Cuma


Üç dil ile bu etiketlediğinizi ve cevapları gerçekten bu üçü arasında oldukça farklıdır. C daha fazla veya daha az tartışma C tartışılması da çevirir ve o (daha fazla veya daha az) dördüncü bir cevap verir anlamına gelir.

Açıkça söz etmedi bir yana, C. C atmalarını ile bir takım sorunlar başlayacağım. Farklı şeyler bir dizi herhangi yapabilirler. Bazı durumlarda, döküm yapacağı hiçbir şey daha söyle derleyici (Özet): "kapa çeneni, ben ne yaptığımı biliyorum" -- yani, bunu sağlayan bile bir dönüşüm neden olabilir sorunları, derleyici olmaz uyarmak senin hakkında o potansiyel sorunlar. Sadece örneğin, char a=(char)123456;. Bu uygulama kesin sonuç (char boyut ve signedness bağlıdır) tanımlanan ve oldukça garip durumlar dışında, muhtemelen yararlı değildir. C atmalarını da değişiklik olsun onlar bir şey olmuyor yalnızca derleme zamanında (yani, sen sadece söylüyorum derleyici nasıl yorumlamak/tedavi bazı verileri) falan olur zamanında (örneğin, gerçek bir dönüşüm çift uzun).

"C" ile başa çıkmak için girişimleri bir sayı ekleyerek en azından bir ölçüde "yeni" her C bir döküm yeteneklerinin yalnızca bir alt kümesi sınırlıdır döküm operatörleri,. Bu daha zor hale getirir (örneğin) yanlışlıkla Eğer gerçekten -- niyetinde değildi bir dönüşüm yapmaksadecebir nesne üzerinde constness atmak niyetinde, o const_cast, kullanmak ve emin olabilirsinizsadeceetkileyebilir şey, bir nesne const, volatile ya da değil olup olmadığını. Tersine, bir static_cast bir nesne olsun. const volatile etkilemek için izin verilmez. Kısacası, çoğu aynı tip yetenekleri, ama onlar kategorize bir döküm genellikle tek bir tür dönüştürme, bir tek C-style cast yapabilirsiniz? iki ya da üç dönüşüm bir operasyon. Birincil durum buolabilirgerçekten static_cast olarak son bulacak* *10, Bir olarak yazılmış olmasına rağmen, en azından bazı durumlarda static_cast bir yerde dynamic_cast kullanın. Örneğin, kullanabilirsiniz dynamic_cast çapraz yukarı veya aşağı bir sınıf hiyerarşisi -- ama dökme "hiyerarşi her zaman güvenli, yapılabilir statik ederken cast "aşağı" hiyerarşisi değil mutlaka güvenli Tamam dinamik.

Java ve C# çok daha fazla birbirine benzer. Özellikle, döküm, hem de (neredeyse?) her zaman çalıştırma işlemi. Açısından C döküm operatörleri, genellikle yakın bir dynamic_cast açısından ne kadar -- yani, yapmak istediğinizde dökme bir nesne için bazı hedef türü, derleyici ekler bir çalışma zamanı kontrol olup olmadığını görmek için dönüştürme izin verilir, ve bir istisna atar. Kesin ayrıntılar (örneğin, adı "kötü oyuncular" hariç) değişir, ama temel ilke kalır çoğunlukla benzer (gerçi, iyi hafıza, Java mı yapmak atmalarını uygulanan birkaç olmayan nesne türleri gibi int çok yakın C atmalarını -- ama bu tür kullanılır, nadiren 1) ben hatırlamıyorum tabii, ve 2) doğru olsa bile, önemli değil zaten).

Daha genel olarak, durum oldukça basit şeyler (en azından IMO) bakarak: dökme (elbette) kadar başka bir türden bir şey dönüştürmek demektir. Eğer bunu yaparsanız/zaman, soru "Neden?" yükseltir Eğer gerçekten belirli bir türü için bir şey istiyorsanız, Neden bu tür başlangıç olarak tanımlayabilir mi? Bu yok demek değilaslabir nedeni, böyle bir dönüşüm yapmak için, ama o şey her zaman doğru yazın boyunca kullanılmış, böylece yeniden tasarım kodu misiniz? " sorusunu sor. Hatta görünüşte zararsız dönüşümler (tamsayı ve kayan nokta arasında, örneğin) ortak olandan çok daha yakından incelenmelidir. Kendi rağmengörünüştekibenzerlik: birbirine gerçekten "" "şey. çeşit ölçülen" şeyler ve kayan nokta türleri sayılması için kullanılmalıdır Ayrım yok sayarak "ortalama Amerikan ailesinin 1.8 çocuğu var." gibi deli ifadelerden bazıları ... devamı Nasıl olduğunu biz bile, aslındahayıraile 1.8 çocuğu var. 1 veya belki 2 ya da daha fazla olabilirler ama asla 1.8 olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CMTelly

    CMTelly

    2 Mayıs 2007
  • Deany Boii

    Deany Boii

    27 Kasım 2007
  • Eric Magidson

    Eric Magidso

    4 Ocak 2009