it-swarm-tr.com

İnt veya Int32 kullanmalı mıyım

C # 'da, int ve Int32 aynı şeydir, ancak hiçbir sebep belirtilmeksizin Int32 üzerinde int'nin tercih edildiğini defalarca okudum. Bir nedeni var mı ve umursamalı mıyım?

340
Graham

ECMA-334 : 2006 C # Dil Belirtimi (p18):

Önceden tanımlanmış türlerin her biri, sistem tarafından sağlanan bir tür için kısa yoldur. Örneğin, int anahtar kelimesi System.Int32 yapısını ifade eder. Tarz olarak, anahtar kelimenin kullanımı, tüm sistem türü adının kullanılmasıyla tercih edilir.

127
SpaceghostAli

Bu ikisi gerçekten eş anlamlıdır; int biraz daha tanıdık gelecektir, Int32, 32-bitliği kodunuzu okuyanlara daha açık hale getirir. Ben sadece 'bir tamsayıya ihtiyacım olan int kullanmaya meyilli olacaktım, Int32 büyüklüğün önemli olduğu yerlerde (kriptografik kod, yapılar), böylece gelecek bakımcılar uygunsa int büyütmenin güvenli olduğunu bilecekler, ancak dikkatli olmalılar Int32s aynı şekilde değiştiriliyor.

Sonuçta ortaya çıkan kod aynı olacaktır: fark tamamen okunabilirlik veya kod görünümünden biridir.

266
James Sutherland

Her ikisi de 32 bitlik tamsayılar bildirir ve diğer posterlerde belirtildiği gibi, hangisini kullandığınızı çoğunlukla sözdizimsel bir meseledir. Ancak, her zaman aynı şekilde davranmazlar. Örneğin, C # derleyicisi buna izin vermez:

public enum MyEnum : Int32
{
    member1 = 0
}

ama buna izin verecek:

public enum MyEnum : int
{
    member1 = 0
}

Git figürü.

85
raven

Her zaman sistem türlerini kullanırım - örneğin, int yerine Int32. Okuduktan sonra bu uygulamayı benimsedim ygulamalı .NET Framework Programlama - yazar Jeffrey Richter, tam tür adlarını kullanmak için iyi bir örnek olur. . İşte bana sıkışmış iki nokta:

  1. Tür adları, .NET dilleri arasında değişebilir. Örneğin, C # 'da, long, yönetilen uzantıları olan C++' da System.Int64 'e eşlenir, long, Int32' e eşlenir. .NET kullanırken dillerin birbirine karıştırılması ve eşleştirilmesi nedeniyle, okuyucunun tercih ettiği dil ne olursa olsun, açık sınıf adının kullanılmasının her zaman daha net olacağından emin olabilirsiniz.

  2. Birçok çerçeve yöntemi, yöntem adlarının bir parçası olarak tür adlarına sahiptir:

    BinaryReader br = new BinaryReader( /* ... */ );

    float val = br.ReadSingle(); // OK, but it looks a little odd...

    Single val = br.ReadSingle(); // OK, and is easier to read

48

int bir C # anahtar sözcüğüdür ve açıktır.

Çoğu zaman önemli değil, Int32'ye karşı çıkan iki şey var:

  • Bir "kullanma sistemi" olması gerekir; Beyan. "int" kullanmak, herhangi bir deyim gerektirmez.
  • Int32 adında bir sınıf tanımlamak mümkündür (saçma ve kafa karıştırıcı olurdu). int her zaman int anlamına gelir.
20
Brownie

Daha önce de belirtildiği gibi int = Int32. Güvenli olmak için, veri türü sınırları ile ilgilenen bir şey uygularken her zaman int.MinValue/int.MaxValue kullandığınızdan emin olun. .NET'in int'in şimdi Int64 ”olduğuna karar verdiğini varsayalım; kodunuz sınırlara daha az bağımlı olacaktır.

12
spoulson

Türler için bayt boyutu, yalnızca tek bir dille ilgilenmeniz gerektiğinde (ve matematiksel taşmalar hakkında kendinize hatırlatmanız gerekmeyen kod için) çok ilginç değildir. İlgi çekici olan kısım, bir dilden diğerine, C # ila COM nesnesine vb. Köprü oluşturduğunuzda veya biraz kaydırma veya maskeleme yaptığınızda ve kendinize (ve kod inceleme ortak çalışanlarınız) hatırlatmanız gerekeceğidir. Verilerin büyüklüğü.

Uygulamada, genellikle ne kadar büyük olduklarını hatırlatmak için Int32 kullanıyorum çünkü yönetilen/yerel C++ yazarken yönetilen C++ (örneğin C # 'a köprü yapmak) yazıyorum.

Muhtemelen bildiğiniz sürece, C # 'da 64-bit, ancak doğal C++' da 32-bit olarak bitir veya char unicode/16-bit iken C++ 'da 8-bit olur. Ama bunu nasıl biliyoruz? Cevap, çünkü kılavuzda araştırdık ve öyle dedi.

Zaman ve deneyimlerle, C # ile diğer diller arasında köprü kurmak için kod yazarken daha bilinçli olmaya başlayacaksınız (burada bazı okuyucular "neden yapardın?" Diye düşünüyor), ancak IMHO daha iyi bir uygulama olduğuna inanıyorum çünkü Geçen hafta ne kodladığımı hatırlamıyorum (veya API belgemde "bu parametrenin 32 bit tam sayı olduğunu" belirtmek zorunda değilim).

F # (daha önce hiç kullanmadığım halde), int , int32 ve nativeint . Aynı soru, "Hangisini kullanmalıyım?" Diye de çıkmalı. Diğerlerinin de belirttiği gibi, çoğu durumda, önemi olmamalıdır (şeffaf olmalıdır). Ama ben bir tane belirsizliği gidermek için int32 ve uint32'yi seçecektim.

Int32'nin ne zaman kullanılacağını doğrulamak için sadece hangi uygulamaları kodladığınıza, onu kullananlara, sizi ve ekibinize hangi kodlama uygulamalarını uyguladığına vb. Bağlı olacağını düşünüyorum.

9
HidekiAI

int ve Int32 arasında bir fark yoktur, ancak int, birçok insanın stilistik olarak tercih ettiği bir dil anahtar kelimesi olduğu gibi (string vs String] ile olduğu gibi.

8
Simon Steele

Tecrübelerime göre bu bir kongre olayıydı. Int32 üzerinden int kullanmak için herhangi bir teknik neden farkında değilim, ama:

  1. Yazmak için daha hızlı.
  2. Tipik C # geliştiricisine daha tanıdık.
  3. Varsayılan görsel stüdyo sözdizimi vurgulamada farklı bir renk.

Özellikle sonuncusuna düşkünüm. :)

7
Greg D

Bir değişkeni tanımlarken her zaman aliased türleri (int, string vb.) Kullanırım ve statik bir yönteme erişirken gerçek adı kullanırım:

int x, y;
...
String.Format ("{0}x{1}", x, y);

İnt.TryParse () gibi bir şey görmek çok çirkin görünüyor. Bunu stille yapmaktan başka bir nedenim yok.

6
Mark A. Nicolosi

Her ne kadar (çoğunlukla) aynı olsalar da (bir [böcek] farkı için aşağıya bakınız), kesinlikle umursamalısınız ve Int32 kullanmalısınız.

  • 16 bit tamsayının adı Int16'dır. 64 bit tam sayı için Int64 ve 32 bit tam sayı için sezgisel seçenek şudur: int veya Int32?

  • Int16, Int32 veya Int64 değişkeninin büyüklüğü sorusu kendinden referanslıdır, ancak int tür değişkeninin büyüklüğü sorusu ne kadar önemsiz olursa olsun, dikkat çekici ne olursa olsun, tamamen geçerli bir soru ve sorulardır. karışıklık, zaman kaybı, tartışmayı engelleme vb. (bu sorunun var olduğu gerçeği kanıtıdır).

  • Int32 kullanımı, geliştiricinin kendi seçtikleri türün bilincinde olduğunu teşvik eder. Yine bir int ne kadar büyük? Oh evet, 32. Türün büyüklüğünün gerçekten dikkate alınma olasılığı, büyüklük adına dahil edildiğinde daha büyük olur. Int32 kullanımı, diğer seçeneklerin bilgisini de teşvik eder. İnsanlar en azından tanımaya zorlanmadıklarında, alternatifler olduğu için int'nin "THE integer type" olması çok kolay hale geldi.

  • 32 bit tamsayılarla etkileşime girmesi amaçlanan çerçeve içindeki sınıf Int32 olarak adlandırılır. Bir kez daha, hangisi: daha sezgisel, daha az kafa karıştırıcı, (gereksiz) bir çeviri (sistemdeki bir çeviri değil, geliştiricinin aklındaki), vb. Yok. int lMax = Int32.MaxValue veya Int32 lMax = Int32.MaxValue?

  • int, tüm .NET dillerinde bir anahtar kelime değildir.

  • Neden sürekli değişme ihtimalinin olmadığı argümanları olsa da, int her zaman bir Int32 olmayabilir.

Dezavantajları yazmak için iki ekstra karakter ve [bug].

Bu derlenmeyecek

public enum MyEnum : Int32
{
    AEnum = 0
}

Ama bu olacak:

public enum MyEnum : int
{
    AEnum = 0
}
5
unknown (yahoo)

En iyi uygulamanın int kullandığını ve tüm MSDN kodlarının int kullandığını biliyorum. Ancak, bildiğim kadarıyla standardizasyon ve tutarlılığın ötesinde bir sebep yok.

5
Raithlin

Umurunda olmamalısın. Çoğu zaman int kullanmalısınız. Gelecekte programınızın daha geniş bir mimariye taşınmasına yardımcı olacaktır (şu anda int, System.Int32 için bir takma addır, ancak bu değişebilir). Yalnızca değişkenin bit genişliği önemli olduğunda (örneğin: struct belleğindeki düzeni denetlemek için) int32 ve diğerlerini ("using System;" ile ilişkili) kullanmalısınız.

4
yhdezalvarez

Microsoft'un StyleCop kullanmasını tavsiye ederim.

Bu FxCop gibidir, ancak stil ile ilgili sorunlar içindir. Varsayılan yapılandırma Microsoft'un dahili stil kılavuzlarıyla eşleşir, ancak projeniz için özelleştirilebilir.

Alışması biraz zaman alabilir, ancak kodunuzu kesinlikle daha iyi hale getirir.

İhlalleri otomatik olarak kontrol etmek için oluşturma işleminize dahil edebilirsiniz.

3
devstuff

int, System.Int32 ile aynıdır ve derlendiğinde CIL içinde aynı şeye dönüşecektir.

İnt # 'yi C # kuralına göre kullanırız, çünkü C # C ve C++ (ve Java) gibi görünmek ister ve orada ne kullanıyoruz ...

BTW, çeşitli Windows API işlevlerinin ithalatını bildirirken System.Int32'yi kullanıyorum. Tanımlanmış bir kongre olup olmadığından emin değilim, ama bana harici bir DLL kullanacağımı hatırlatıyor ...

3
Jack Bolding

Bir zamanlar, int veri türü derleyici tarafından hedeflenen makinenin kayıt büyüklüğüne sabitlendi. Bu nedenle, örneğin, 16 bit bir sistem için bir derleyici 16 bit bir tamsayı kullanır.

Bununla birlikte, neyse ki artık 16 bit görmüyoruz ve 64 bit popülerlik kazanmaya başladığında insanlar daha eski yazılımlarla uyumlu hale gelmekle daha fazla ilgileniyorlardı ve 32 bit, çoğu derleyici için int sadece 32 bit olarak kabul edilir.

3
Joel Coehoorn

int, C # dilinin System.Int32 kısayolu

Bu, Microsoft'un bu haritayı değiştirebileceği anlamına gelse de, FogCreek'in tartışmaları ile ilgili bir yayında belirtilen [kaynak]

"64 bitlik konuda - Microsoft gerçekten .NET Framework'ün 64 bitlik bir sürümü üzerinde çalışıyor ancak int'nin bu sistemde 64 bit ile eşleşmeyeceğinden eminim.

nedenleri:

1. C # ECMA standardı özellikle int'nin 32 bit ve uzunluğunun 64 bit olduğunu söylüyor.

2. Microsoft, Framework sürüm 1.1'de, Array.GetLength öğesinin yanı sıra Array.GetLongLength gibi int değerleri yerine uzun değerler döndüren ek özellikler ve yöntemler sunar.

Bu nedenle, tüm yerleşik C # türlerinin geçerli eşlemelerini koruyacağını söylemenin güvenli olduğunu düşünüyorum. "

3
Ray Hayes

Umurunda olmamalısın. Boyut bir endişe ise, bayt, kısa, int, sonra uzun kullanırdım. İnt32'den büyük bir int kullanmanızın tek nedeni, 2147483647'den yüksek veya -2147483648'den daha düşük bir sayıya ihtiyaç duymanızdır.

Benim umursamadığım dışında, ilgilenmem gereken birçok şey var.

2
David Basarab

int ve Int32 aynıdır. int, Int32 için takma addır.

2
Jesper Kihlberg

Uygulamada hiçbir fark yaratmaz ve zamanla kendi konvansiyonunuzu kabul edeceksiniz. Bir tür atarken anahtar kelimeyi ve statik yöntemleri kullanırken sınıf sürümünü kullanma eğilimindeyim:

int toplam = Int32.Parse ("1009");

2
chrisb

int, bu tabloda tanımlandığı şekilde System.Int32 için bir takma addır: Dahili Türler Tablosu (C # Referans)

1
Jim T

Int veya Int32 kullanımı aynıdır Int sadece okuyucu kodunu basitleştirmek için şekerdir.

Null değişken türünü kullanın Int? veya Int32? null içeren alanlarda veritabanlarıyla çalışırken. Bu sizi birçok çalışma zamanı sorunundan kurtaracaktır.

0
bovium

Bir süre önce Microsoft .NET CLR ürün ekibinden birisini ziyaret ettiğimizde Microsoft ile bir proje üzerinde çalışıyordum. Bu kişi örnekleri kodladı ve değişkenlerini tanımlarken “Int32” ve “int” ve “String” ve “string” i kullandı.

Bu stili Microsoft'tan başka bir örnek kodda gördüğümü hatırlamıştım. Bu yüzden, biraz araştırma yaptım ve herkesin sözdizimi renklendirme dışında “Int32” ve “int” arasında bir fark olmadığını söylediğini gördüm. Aslında, kodunuzu daha okunaklı hale getirmek için “Int32” kullanmanızı öneren birçok malzeme buldum. Bu yüzden tarzı benimsedim.

Geçen gün bir fark buldum! Derleyici, “Int32” kullanarak enum yazmanıza izin vermiyor, ancak “int” kullandığınızda yazıyor. Bana nedenini sorma çünkü henüz bilmiyorum.

Örnek:

public  enum MyEnum : Int32
{
    AEnum = 0
}

Bu çalışıyor.

public enum MyEnum : int
{
    AEnum = 0
}

Alınan: Int32 notasyonu vs. int

0
Schmuli

Bazı derleyiciler farklı platformlarda int için farklı boyutlara sahiptir (C # özel değil)

Bazı kodlama standartları (MISRA C), kullanılan tüm tiplerin boyut belirtilmesini gerektirir (örneğin, Int32 ve int değil).

Farklı tür değişkenleri için önek belirtmek de iyidir (örneğin, 8 bit bayt için b, 16 bit Word için w ve 32 bit uzunluk için l Word => Int32 lMyVariable)

Dikkat etmelisiniz çünkü kodunuzu daha taşınabilir ve daha bakımlı hale getirir.

Her zaman C # kullanacaksanız ve C # özelliği bu konuda hiçbir zaman değişmeyecekse, taşınabilir C # için geçerli olmayabilir.

Korunabilir ihmo her zaman geçerli olacaktır, çünkü kodunuzu koruyan kişi bu özel C # şartnamesinin farkında olmayabilir ve bir hatayı özlüyor olsanız int, arada 2147483647'den fazla olur.

Örneğin yılın aylarını sayan basit bir for-döngüde umursamayacaksınız, ancak değişkeni akıp geçebileceği bir bağlamda kullandığınızda, umursamalısınız.

Bunun üzerinde biraz akıllıca işlemler yapıp yapmayacağınıza da dikkat etmelisiniz.

0
user11211

Çok özel matematiksel fonksiyonlar yazmanız veya belirli bir mimari için optimize edilmiş kodlar yazmanız gerekmiyorsa, çoğu programlama dilinde umursamamanız gerekir ... Yalnızca türün boyutunun sizin için yeterli olduğundan emin olun ( biliyorum örneğin 32 bitten fazlasına ihtiyacınız olacak)

0
Stacker

Int32 türünün kullanılması, System veya tam olarak nitelenen (System.Int32) bir ad alanı başvurusu gerektirir. int yönüne yöneliyorum, çünkü bir ad alanı içe aktarması gerektirmiyor, bu nedenle bazı durumlarda ad alanı çakışması olasılığını azaltıyor. IL'ye derlendiğinde, ikisi arasında bir fark yoktur.

0
Michael Meadows

Önemli değil. int, language anahtar sözcüğü ve Int32'nin gerçek sistem türüdür.

Ayrıca bakınız burada cevap ilgili bir soruya.

0
Keith

Visual Studio 2012'deki Anlık Pencereye göre Int32 int, Int64 uzun. İşte çıktı:

sizeof(int)
4
sizeof(Int32)
4
sizeof(Int64)
8
Int32
int
    base {System.ValueType}: System.ValueType
    MaxValue: 2147483647
    MinValue: -2147483648
Int64
long
    base {System.ValueType}: System.ValueType
    MaxValue: 9223372036854775807
    MinValue: -9223372036854775808
int
int
    base {System.ValueType}: System.ValueType
    MaxValue: 2147483647
    MinValue: -2147483648
0
Selim

Ayrıca Int16'yı da düşünün. Bir Tamsayıcıyı uygulamanızda bellekte saklamanız gerekiyorsa ve kullanılan bellek miktarından endişe ediyorsanız, daha az memeory kullandığından ve Int32'den daha küçük bir min/maks aralığına sahip olduğundan Int16 ile gidebilirsiniz (yani int. .)

0