2010-09-07 35 views
43

Olası çoğaltmaları: .Count yerine imzalı birinin işaretsiz tamsayı değil neden hep ettik
Why does .NET use int instead of uint in certain classes?
Why is Array.Length an int, and not an uintSayım neden imzasız bir tam sayı değil?

acaba? Örneğin, numaralı telefonu kullanın. Öğelerin sayısı 0'dan az olamaz, bu yüzden neden imzalanmış bir int? Ben seçilmiş unsur vardır olmadığını test çalışırsanız

, ben

if (ListView.SelectedItems.Count == 0) {} 

test etmek istiyorum ama bir imzalı tamsayı olduğu için, ben

if (ListView.SelectedItems.Count <= 0) {} 

test etmek zorunda ya da herhangi bir durumda var .Count ne zaman < 0 olabilir? uint veri türü bir parçası değildir çünkü

http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx

+4

Sanırım kolaylık değil, çünkü bir int için uint yapamazsınız ve çoğu kişi indeksleyiciler için ints kullanamaz ... –

+3

hala test edebilirsiniz, '== 0', yine de? işaret ettiğinden, hiç bir zaman 0'dan daha az olmayacak, çünkü bir noktada, kodunuzun, diğer insanların kodunun üye isimlerinin ima ettiği şekilde davranacağına dair bazı temel varsayımlar yapacağından kaçınılamaz. Söyleyeyim ki, 'say' asla 0'dan az olmayacak ve eşitliği kontrol edecek. –

+0

Ve [Neden Array.Length bir int, ve bir uint değil] nedenidir (http://stackoverflow.com/questions/6301), [Neden imzasız değişkenler daha sık kullanılan değil?] (Http: // stackoverflow .com/questions/490222) –

cevap

51

İmzasız tamsayı CLS uyumlu CLS fazla bilgi uyumlu kod için (Common Language Specification)

, bu bağlantıya bakın değil CLS (ortak dil belirtimi) hepsi değil. Net dilleri destekliyor.

İşte diziler hakkında çok benzer iplik:

Why is Array.Length an int, and not an uint

+10

Bu soru mektuba cevap verse de, açıklamıyor. Belki de soru, “neden * neden CLS uyumlu değil?” Şeklinde olmalıydı. Bu gerçekten garip bir karardı. –

+13

Uint'in CLS uyumlu olmamasının sorusu, burada daha önce sorulmuş olan ayrı bir soru için bir konudur: http://stackoverflow.com/questions/6325/why-are-unsigned-ints-not-cls-compliant –

5

en pratik açıdan bu bakalım.

İyi ya da kötü, int ler .NET kullanımda int s normale tür vardır imzaladı. C ve C++ 'da imzalı int s kullanımı da normaldi. Bu nedenle, çoğu değişken, aksi halde iyi bir neden olmadığı sürece, imzasız int yerine int olarak bildirilir.

İmzasız bir int ve imzalı bir int arasında dönüştürme sorunları vardır ve her zaman güvenli değildir. bir koleksiyon böylece imzalı int her durumda içine alacak büyüklükte, içinde 2 ^^ 32 öğeler, yakın herhangi bir yere sahip olmak için 32 bit sistemde

mümkün değildir. 64 bit sistem üzerinde

, işaretsiz int çoğu durumda bir aksi takdirde 64 bit int kullanmak gerekir, int hala yeterince büyük imzalı, çok teşekkür kazanmak değildir. (Standart koleksiyonun hiçbiri 64 sistemde 2 ^^ 31 öğenin yakınında herhangi bir yerde başa çıkamayacağını umuyorum)!Eğer imzasız int neden kullanacağınızı)

nedenle, işaretsiz int kullanarak net bir avantaja sahiptir göz önüne alındığında?

+0

Açık bir avantaj görüyorum: birisi hata yaptığında '(Names.Count <0)' ('ın yerine (Names.Count> 0)') derleyici uyarır. Kullanıcıların hata yapmak için uyarı yapmasının derleyicinin çok önemli bir görevi olduğunu düşünüyorum ve hataları tespit etmeyi kolaylaştıran herhangi bir dilin rakipler karşısında bir avantajı var. Aslında bu yüzden derlenmiş dilleri tercih ederim. – Johan

2
  1. Bu, büyük ölçüde farklı dillerden geniş bir destek sağlamak için CLS uyumlu değildir.

  2. İmzalı bir int, işaretçi aritmetiğini kullanan C veya C++ kodlarını taşımanın kolaylığını sunar.

  3. Sayım, genel değerin negatif olabileceği bir ifadenin parçası olabilir. Özellikle, sayım, geçerli indekslerin daima [0, Sayı-1] aralığında olduğu, ancak negatif sonuçların kullanıldığı endekslerle doğrudan bir ilişkiye sahiptir. Düzenlemeyi sürdürmek için yeni bir öğenin ekleneceği konumu yansıtmak için bazı ikili arama yöntemleri (BCL tarafından sağlananlar dahil) tarafından. VB.Net'te

0

normal döngü yapısı aşağıdaki değerler (a "/ sonraki döngü için") C farklı olarak, ve belirlenen en yüksek değeri dahil olmak üzere değerlerle döngü çalıştıracaktır kolayca ilmek üst sınır. Bu nedenle, örneğin, ör. "I = 0 Array.Length-1" için; Array.Length işaretsiz ve sıfır ise, bu açık bir soruna neden olabilir. C 'de bile, "(i = Array.Length-1; i GE 0; --i)" için söyleyebilmekten faydalanır. Bazen, hem imzalı hem de imzasız int'ye genişleyen oyuncuları destekleyecek 31 bitlik bir tamsayı türüne sahip olmanın yararlı olacağını düşünüyorum, ancak bunu destekleyen bir dili hiç duymadım.

+0

Kesinlikle! VB farklıdır: VB'de, true terimi 0'dır ve false değeri -1'dir. Bu aksiyom ile -1 bir int'dir ve imzasız bir int ile söylenemez. Bu kesinlikle bir CPU optimizasyon problemi – user1587368

+0

Kesinlikle! VB farklıdır: VB'de, true terimi 0'dır ve false değeri -1'dir. Bu aksiyom ile -1 bir int'dir ve imzasız bir int ile söylenemez. İmzasız bir int yerine bir tamsayı imzalı bir sürümünü kullanmanın nedeninin açıkça bir CPU optimizasyon problemi olduğunu düşünüyorum: sıfır olan bir sayı negatif bir -1 değerine sahiptir. Örneğin, mantıksal bir şemasındaki bir NOT kapısı, bir değerin sıfıra eşit olduğunu veya boş olduğunu söylemek için etkilidir. – user1587368

+0

@ user1587368: İmzalı bir int (two's-complement) iminin bir avantajı, bu tiplerin boyutuna bakılmaksızın "all-bits-set" değeri olarak -1'e sahip olmalarıdır, oysa imzasız her türün farklı bir "all-bits-" "değerini ayarla. – supercat

İlgili konular