it-swarm-eu.dev

Soll ich int oder Int32 verwenden?

In C # sind int und Int32 Dasselbe, aber ich habe einige Male gelesen, dass intInt32 Ohne Angabe von Gründen vorgezogen wird . Gibt es einen Grund und sollte es mich interessieren?

340
Graham

ECMA-334 : 2006 C # -Sprachenspezifikation (S. 18):

Jeder der vordefinierten Typen ist eine Abkürzung für einen vom System bereitgestellten Typ. Beispielsweise verweist das Schlüsselwort int auf die Struktur System.Int32. Aus Gründen des Stils wird die Verwendung des Schlüsselworts der Verwendung des vollständigen Systemtypnamens vorgezogen.

127
SpaceghostAli

Die beiden sind ja auch; int wird etwas vertrauter aussehen, Int32 macht die 32-Bit-Darstellung für diejenigen, die Ihren Code lesen, eindeutiger. Ich würde gerne int verwenden, wenn ich nur 'eine ganze Zahl' brauche, Int32 wo die Größe wichtig ist (kryptografischer Code, Strukturen), damit zukünftige Betreuer wissen, dass es sicher ist, ein int zu vergrößern, sollte aber darauf achten, Int32s auf die gleiche Weise.

Der resultierende Code ist identisch: Der Unterschied besteht lediglich in der Lesbarkeit oder im Erscheinungsbild des Codes.

266

Beide deklarieren 32-Bit-Ganzzahlen, und wie bei anderen Postern angegeben, ist es hauptsächlich eine Frage des syntaktischen Stils, welche Sie verwenden. Sie verhalten sich jedoch nicht immer gleich. Der C # -Compiler lässt beispielsweise Folgendes nicht zu:

public enum MyEnum : Int32
{
    member1 = 0
}

aber es wird dies erlauben:

public enum MyEnum : int
{
    member1 = 0
}

Stelle dir das vor.

85
raven

Ich verwende immer die Systemtypen - z. B. Int32 anstelle von int. Ich habe diese Praxis übernommen, nachdem ich Angewandte .NET Framework-Programmierung gelesen habe. Der Autor Jeffrey Richter macht einen guten Fall für die Verwendung der vollständigen Typnamen . Hier sind die beiden Punkte, die mir aufgefallen sind:

  1. Typnamen können zwischen den .NET-Sprachen variieren. In C # wird beispielsweise long System.Int64 zugeordnet, während in C++ mit verwalteten Erweiterungen long Int32 zugeordnet wird. Da Sprachen unter .NET gemischt und abgeglichen werden können, können Sie sicher sein, dass die Verwendung des expliziten Klassennamens immer klarer ist, unabhängig von der vom Leser bevorzugten Sprache.

  2. Viele Framework-Methoden haben Typnamen als Teil ihrer Methodennamen:

    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 ist ein C # -Schlüsselwort und eindeutig.

Meistens spielt es keine Rolle, aber zwei Dinge, die gegen Int32 sprechen:

  • Sie benötigen ein "using System". Aussage. Die Verwendung von "int" erfordert keine using-Anweisung.
  • Es ist möglich, eine eigene Klasse mit dem Namen Int32 zu definieren (was albern und verwirrend wäre). int bedeutet immer int.
20
Brownie

Wie schon gesagt, int = Int32. Verwenden Sie aus Sicherheitsgründen immer int.MinValue/int.MaxValue, Wenn Sie Daten implementieren, die die Datentypgrenzen betreffen. Angenommen, .NET hat entschieden, dass int jetzt Int64 Lautet, und dass Ihr Code weniger von den Grenzen abhängig ist.

12
spoulson

Die Bytegröße für Typen ist nicht allzu interessant, wenn Sie sich nur mit einer einzigen Sprache befassen müssen (und für Code, an den Sie sich nicht erinnern müssen, wenn die Mathematik überläuft). Der Teil, der interessant wird, ist, wenn Sie eine Brücke zwischen einer Sprache zu einer anderen, einem C # zu einem COM-Objekt usw. herstellen oder eine Bitverschiebung oder Maskierung vornehmen und sich selbst (und Ihre Co-Woker zur Codeüberprüfung) daran erinnern müssen. der Größe der Daten.

In der Praxis verwende ich Int32 normalerweise nur, um mich daran zu erinnern, welche Größe sie haben, da ich verwaltetes C++ (zum Beispiel zum Überbrücken auf C #) sowie nicht verwaltetes/natives C++ schreibe.

Wie Sie wahrscheinlich wissen, sind in C # 64-Bit-Zeichen vorhanden, in nativem C++ jedoch 32-Bit-Zeichen, oder char ist Unicode/16-Bit-Zeichen, während es in C++ 8-Bit-Zeichen sind. Aber woher wissen wir das? Die Antwort ist, weil wir es im Handbuch nachgeschlagen haben und es so gesagt hat.

Mit der Zeit und den Erfahrungen werden Sie typenbewusster, wenn Sie Codes schreiben, um eine Brücke zwischen C # und anderen Sprachen zu schlagen (einige Leser denken hier, warum würden Sie das tun?), Aber meiner Meinung nach ist dies eine bessere Vorgehensweise, weil Ich kann mich nicht erinnern, was ich letzte Woche codiert habe (oder ich muss in meinem API-Dokument nicht angeben, dass "dieser Parameter eine 32-Bit-Ganzzahl ist").

In F # (obwohl ich es noch nie benutzt habe) definieren sie int , int32 und nativeint . Die gleiche Frage sollte sich stellen: "Welches verwende ich?". Wie bereits erwähnt, sollte dies in den meisten Fällen keine Rolle spielen (sollte transparent sein). Aber ich für meinen Teil würde int32 und uint32 wählen, um die Mehrdeutigkeiten zu beseitigen.

Ich denke, es hängt nur davon ab, welche Anwendungen Sie codieren, wer sie verwendet, welche Codierungspraktiken Sie und Ihr Team befolgen usw., um zu rechtfertigen, wann Sie Int32 verwenden.

9
HidekiAI

Es gibt keinen Unterschied zwischen int und Int32, aber da int ein Sprachschlüsselwort ist, bevorzugen viele Leute es stilistisch (genau wie bei string vs String).

8
Simon Steele

Nach meiner Erfahrung war es eine Konventionssache. Mir ist kein technischer Grund bekannt, int über Int32 zu verwenden, aber es ist:

  1. Schneller zu tippen.
  2. Dem typischen C # -Entwickler vertrauter.
  3. Eine andere Farbe in der standardmäßigen Hervorhebung der Visual Studio-Syntax.

Ich mag diesen letzten besonders gern. :)

7
Greg D

Beim Definieren einer Variablen verwende ich immer die Alias-Typen (int, string usw.) und beim Zugriff auf eine statische Methode den echten Namen:

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

Es scheint nur hässlich, so etwas wie int.TryParse () zu sehen. Es gibt keinen anderen Grund, warum ich das anders mache als Stil.

6

Obwohl sie (meistens) identisch sind (siehe unten für den einen [Bug] Unterschied), sollten Sie sich auf jeden Fall darum kümmern und Int32 verwenden.

  • Der Name für eine 16-Bit-Ganzzahl lautet Int16. Für eine 64-Bit-Ganzzahl ist es Int64, und für eine 32-Bit-Ganzzahl ist die intuitive Wahl: int oder Int32?

  • Die Frage nach der Größe einer Variablen vom Typ Int16, Int32 oder Int64 ist selbstreferenzierend, aber die Frage nach der Größe einer Variablen vom Typ int ist eine völlig gültige Frage, und Fragen, egal wie trivial sie sind, lenken ab, führen zu Verwirrung, Zeitverschwendung, Diskussion behindern usw. (die Tatsache, dass diese Frage existiert, beweist den Punkt).

  • Die Verwendung von Int32 fördert, dass sich der Entwickler der Wahl des Typs bewusst ist. Wie groß ist ein Int wieder? Ach ja, 32. Die Wahrscheinlichkeit, dass die Größe des Typs tatsächlich berücksichtigt wird, ist größer, wenn die Größe im Namen enthalten ist. Die Verwendung von Int32 fördert auch die Kenntnis der anderen Auswahlmöglichkeiten. Wenn die Leute nicht gezwungen sind, zumindest zu erkennen, dass es Alternativen gibt, wird es für int viel zu einfach, "DER Integer-Typ" zu werden.

  • Die Klasse innerhalb des Frameworks, die mit 32-Bit-Ganzzahlen interagieren soll, heißt Int32. Noch einmal, das ist: intuitiver, weniger verwirrend, es fehlt eine (unnötige) Übersetzung (keine Übersetzung im System, sondern im Kopf des Entwicklers) usw. int lMax = Int32.MaxValue oder Int32 lMax = Int32.MaxValue?

  • int ist nicht in allen .NET-Sprachen ein Schlüsselwort.

  • Obwohl es Argumente gibt, warum es sich wahrscheinlich nie ändert, ist int möglicherweise nicht immer ein Int32.

Die Nachteile sind zwei zusätzliche Zeichen und [Fehler].

Dies wird nicht kompiliert

public enum MyEnum : Int32
{
    AEnum = 0
}

Aber das wird:

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

Ich weiß, dass die beste Vorgehensweise darin besteht, int zu verwenden, und der gesamte MSDN-Code verwendet int. Soweit ich weiß, gibt es jedoch keinen Grund, der über Standardisierung und Konsistenz hinausgeht.

5
Raithlin

Das sollte dich nicht interessieren. Sie sollten die meiste Zeit int verwenden. Es wird Ihnen helfen, Ihr Programm in Zukunft auf eine breitere Architektur zu portieren (derzeit ist int ein Alias ​​für System.Int32 aber das könnte sich ändern). Nur wenn die Bitbreite der Variablen von Bedeutung ist (zum Beispiel: um das Layout im Speicher eines struct zu steuern), sollten Sie int32 und andere (mit dem zugehörigen "using System; ").

4
yhdezalvarez

Ich empfehle die Verwendung von Microsoft StyleCop .

Es ist wie FxCop , aber für Stilprobleme. Die Standardkonfiguration entspricht den internen Styleguides von Microsoft, kann jedoch für Ihr Projekt angepasst werden.

Es kann ein bisschen dauern, sich daran zu gewöhnen, aber es macht Ihren Code definitiv schöner.

Sie können es in Ihren Erstellungsprozess einbeziehen, um automatisch nach Verstößen zu suchen.

3
devstuff

int ist dasselbe wie System.Int32 und wenn es kompiliert wird, wird es in CIL dasselbe.

Wir verwenden int in C # gemäß Konvention, da C # wie C und C++ (und Java) aussehen soll, und das ist, was wir dort verwenden ...

Übrigens verwende ich am Ende System.Int32, wenn ich Importe verschiedener Windows-API-Funktionen deklariere. Ich bin nicht sicher, ob dies eine definierte Konvention ist oder nicht, aber es erinnert mich daran, dass ich zu einer externen DLL gehe ...

3
Jack Bolding

Es war einmal, als der Datentyp int an die Registergröße des Computers gebunden wurde, auf den der Compiler abzielte. So würde beispielsweise ein Compiler für ein 16-Bit-System eine 16-Bit-Ganzzahl verwenden.

Wir sehen jedoch glücklicherweise nicht mehr viel 16-Bit und als 64-Bit populär wurde, waren die Leute mehr darum bemüht, es mit älterer Software kompatibel zu machen, und 32-Bit gab es schon so lange, dass es für die meisten Compiler eine - int wird nur mit 32 Bit angenommen.

3
Joel Coehoorn

int ist die Verknüpfung der C # -Sprache für System.Int32

Während dies bedeutet, dass Microsoft diese Zuordnung ändern könnte, lautete ein Beitrag in FogCreek Diskussionen [source]

"Zum 64-Bit-Problem - Microsoft arbeitet in der Tat an einer 64-Bit-Version von .NET Framework, aber ich bin mir ziemlich sicher, dass int auf diesem System NICHT 64-Bit zuordnen wird.

Gründe:

1. Der C # ECMA-Standard besagt ausdrücklich, dass int 32 Bit und long 64 Bit ist.

2. Microsoft hat in Framework Version 1.1 zusätzliche Eigenschaften und Methoden eingeführt, die lange Werte anstelle von int-Werten zurückgeben, z. B. Array.GetLongLength zusätzlich zu Array.GetLength.

Ich kann also mit Sicherheit sagen, dass alle integrierten C # -Typen ihre aktuelle Zuordnung beibehalten. "

3
Ray Hayes

Sie sollten sich nicht interessieren. Wenn es um die Größe geht, würde ich byte, short, int und long verwenden. Der einzige Grund, warum Sie einen int verwenden würden, der größer als int32 ist, ist, wenn Sie eine Zahl benötigen, die höher als 2147483647 oder niedriger als -2147483648 ist.

Abgesehen davon würde es mich nicht interessieren, es gibt viele andere Dinge, mit denen man sich befassen muss.

2
David Basarab

int und Int32 ist dasselbe. int ist ein Alias ​​für Int32.

2
Jesper Kihlberg

In der Praxis macht das keinen Unterschied und Sie werden mit der Zeit Ihre eigene Konvention verabschieden. Ich neige dazu, das Schlüsselwort bei der Zuweisung eines Typs und die Klassenversion bei der Verwendung statischer Methoden und dergleichen zu verwenden:

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

2
chrisb

int ist ein Alias ​​für System.Int32, wie in dieser Tabelle definiert: Tabelle der integrierten Typen (C # -Referenz)

1
Jim T

Verwendung von Int oder Int32 sind gleich Int ist nur Zucker, um den Code für den Leser zu vereinfachen.

Verwenden Sie die Nullable-Variante Int? oder Int32? wenn Sie mit Datenbanken in Feldern arbeiten, die null enthalten. Das erspart Ihnen viele Laufzeitprobleme.

0
bovium

Vor einiger Zeit arbeitete ich an einem Projekt mit Microsoft, als wir jemanden aus dem Microsoft .NET CLR-Produktteam besuchten. Diese Person hat Beispiele codiert und bei der Definition seiner Variablen "Int32" vs. "int" und "String" vs. "string" verwendet.

Ich hatte daran gedacht, diesen Stil in einem anderen Beispielcode von Microsoft zu sehen. Also habe ich ein paar Nachforschungen angestellt und festgestellt, dass jeder sagt, dass es keinen Unterschied zwischen "Int32" und "int" gibt, außer bei der Syntaxfärbung. Tatsächlich habe ich viel Material gefunden, das nahe legt, dass Sie "Int32" verwenden, um Ihren Code besser lesbar zu machen. Also habe ich den Stil übernommen.

Neulich fand ich einen Unterschied! Der Compiler erlaubt es Ihnen nicht, enum mit "Int32" einzugeben, aber wenn Sie "int" verwenden. Frag mich nicht warum, weil ich es noch nicht weiß.

Beispiel:

public  enum MyEnum : Int32
{
    AEnum = 0
}

Das funktioniert.

public enum MyEnum : int
{
    AEnum = 0
}

Entnommen aus: Int32-Notation vs. int

0
Schmuli

Einige Compiler haben unterschiedliche Größen für int auf verschiedenen Plattformen (nicht C # -spezifisch)

Einige Codierungsstandards (MISRA C) erfordern, dass alle verwendeten Typen die angegebene Größe haben (d. H. Int32 und nicht int).

Es ist auch gut, Präfixe für verschiedene Typvariablen anzugeben (z. B. b für 8-Bit-Byte, w für 16-Bit-Wort und l für 32-Bit-langes Wort => Int32 lMyVariable).

Sie sollten sich darum kümmern, dass Ihr Code dadurch portabler und wartbarer wird.

Portable ist möglicherweise nicht auf C # anwendbar, wenn Sie immer C # verwenden und die C # -Spezifikation sich in dieser Hinsicht niemals ändert.

Das verwaltbare ihmo ist immer anwendbar, da die Person, die Ihren Code verwaltet, möglicherweise nicht über diese spezielle C # -Spezifikation informiert ist und einen Fehler übersieht, wenn der int gelegentlich größer als 2147483647 wird.

In einer einfachen for-Schleife, die zum Beispiel die Monate des Jahres zählt, ist es Ihnen egal, aber wenn Sie die Variable in einem Kontext verwenden, in dem es möglicherweise zu einem Überlauf kommen könnte, sollten Sie sich darum kümmern.

Sie sollten sich auch darum kümmern, ob Sie bitweise Operationen daran ausführen.

0
user11211

Sie sollten sich in den meisten Programmiersprachen nicht darum kümmern, es sei denn, Sie müssen ganz bestimmte mathematische Funktionen oder Code schreiben, der für eine bestimmte Architektur optimiert ist wissen du brauchst zum Beispiel mehr als 32-Bit)

0
Stacker

Verwendung der Int32 Typ erfordert einen Namespace-Verweis auf System oder eine vollständige Qualifizierung (System.Int32). Ich tendiere zu int, da kein Namespace-Import erforderlich ist, wodurch die Wahrscheinlichkeit einer Namespace-Kollision in einigen Fällen verringert wird. Bei der Kompilierung nach IL gibt es keinen Unterschied zwischen den beiden.

0
Michael Meadows

Es spielt keine Rolle. int ist das Sprachschlüsselwort und Int32 der tatsächliche Systemtyp.

Siehe auch mein hier beantworten zu einer verwandten Frage.

0
Keith

Laut dem Direktfenster in Visual Studio 2012 ist Int32 int, Int64 ist lang. Hier ist die Ausgabe:

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

Beachten Sie auch Int16. Wenn Sie in Ihrer Anwendung eine Ganzzahl im Speicher ablegen müssen und sich Gedanken über die Größe des verwendeten Speichers machen, können Sie Int16 wählen, da es weniger Speicher benötigt und einen kleineren Min/Max-Bereich als Int32 hat (was int ist) .)

0