web-dev-qa-db-ja.com

intかInt32を使うべきか

C#では、intInt32は同じものですが、何の理由もなくintInt32より優先されることを何度も読みました。理由はありますか、私は気にする必要がありますか?

339
Graham

ECMA-334 :2006C#言語仕様(p18):

事前定義タイプはそれぞれ、システム提供タイプの省略形です。たとえば、キーワードintは構造体System.Int32を参照します。スタイルの問題として、キーワードの使用は完全なシステムタイプ名の使用よりも優先されます。

125
SpaceghostAli

2つは確かに同義です。 intname__はもう少し見慣れたものになります。Int32を使用すると、コードを読んでいる人にとって32ビットがより明確になります。 「整数」が必要な場合はintname__、サイズが重要な場合はInt32(暗号化コード、構造体)を使用する傾向があるため、将来の保守担当者は、必要に応じてintname__を拡大しても安全であることがわかりますが、注意が必要ですInt32sを同じ方法で変更します。

結果のコードは同一になります。違いは純粋に読みやすさまたはコードの外観です。

266

どちらも32ビット整数を宣言しています。他のポスターが述べているように、どちらを使用するかは主に構文スタイルの問題です。しかし、彼らはいつも同じように動作するわけではありません。たとえば、C#コンパイラはこれを許可しません。

public enum MyEnum : Int32
{
    member1 = 0
}

しかしそれはこれを可能にします:

public enum MyEnum : int
{
    member1 = 0
}

図に行きます。

84
raven

私は常にシステムタイプを使用します - 例えばintではなくInt32です。 Applied .NET Framework Programmingを読んだ後、私はこのプラクティスを採用しました。 。ここで私が立ち往生している2つのポイントがあります:

  1. 型名は.NET言語によって異なります。たとえば、C#では、longはSystem.Int64にマッピングされますが、マネージ拡張機能付きのC++では、longはInt32にマッピングされます。 .NETを使用している間は言語を混在させることができるので、読者の好みの言語に関係なく、明示的なクラス名を使用すると常に明確になります。

  2. 多くのフレームワークメソッドは、それらのメソッド名の一部として型名を持ちます。

    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はC#のキーワードであり、明確です。

ほとんどの場合重要ではありませんが、Int32には2つの問題があります。

  • 「使用システム」が必要です。ステートメント。 using "int"はusingステートメントを必要としません。
  • Int32と呼ばれるあなた自身のクラスを定義することは可能です(それは愚かで混乱を招くでしょう)。 intは常にintを意味します。
20
Brownie

すでに述べたように、int = Int32。安全のために、データ型の境界を気にするものを実装するときは、必ずint.MinValue/int.MaxValueを使用してください。 .NETがintInt64に変更すると決定したとします。コードの境界への依存度は低くなります。

13
spoulson

1つの言語だけを扱う必要がある場合(および数学のオーバーフローについて気にする必要がないコードの場合)、型のバイトサイズはそれほど面白くありません。興味深いのは、ある言語から別の言語へのブリッジ、C#からCOMオブジェクトへのブリッジなどを行っているとき、またはビットシフトやマスキングを行っていて、自分自身(およびコードレビューの共同執筆者)を思い出させる必要がある場合です。データのサイズ.

実際には、管理されていない/ネイティブのC++と同様にマネージドC++(たとえばC#へのブリッジ)を作成するため、Int32を使用してサイズを判断します。

ご存じのとおり、C#では64ビットですが、ネイティブC++では32ビットになります。つまり、charはUnicode/16ビットですが、C++では8ビットです。しかし、これをどうやって知るのでしょうか。答えは、私たちがマニュアルの中でそれを調べてきたからです。

C#と他の言語の間を橋渡しするコードを書くとき、時間と経験によって、あなたはより型に敏感になり始めるでしょう(ここの何人かの読者は "あなたはなぜだろうか?"と考えています)。先週コーディングした内容を思い出すことができません(または私のAPIドキュメントで「このパラメータは32ビット整数」と指定する必要はありません)。

F# (これまで使ったことはありませんが)では、intを定義します。 int32、およびnativeint。同じ質問が発生するはずです、「私はどれを使用しますか」。他の人が述べたように、ほとんどの場合、それは重要ではないはずです(透明であるべきです)。しかし、私は、あいまいさを取り除くためにint32とuint32を選択します。

Int32をいつ使用するかを正当化するのは、どのアプリケーションをコーディングしているのか、誰がそれを使用しているのか、あなたとあなたのチームが従うコーディングプラクティスなどにのみ依存すると思います。

9
HidekiAI

intInt32の間に違いはありませんが、intは言語キーワードであるため、多くの人が文体的にそれを好みます(string vs Stringと同じ)。

8
Simon Steele

私の経験では、それは慣習的なことでした。 Int32よりもintを使用する技術的な理由はわかりませんが、

  1. 入力が早くなります。
  2. 典型的なC#開発者にはなじみがあります。
  3. デフォルトのビジュアルスタジオシンタックスハイライトにおける異なる色。

私はその最後のものが特に好きです。 :)

7
Greg D

変数を定義するときは常にエイリアスタイプ(int、stringなど)を使い、静的メソッドにアクセスするときは実際の名前を使います。

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

Int.TryParse()のようなものを見るのは醜いようです。スタイル以外にこれをする理由は他にありません。

6

それらは(ほとんど)同一ですが(違いは1つ[バグ]については下記を参照)、間違いなく気にする必要があり、Int32を使用する必要があります。

  • 16ビット整数の名前はInt16です。 64ビット整数の場合はInt64です。32ビット整数の場合は直感的な選択肢は次のとおりです。intまたはInt32?

  • Int16型、Int32型、またはInt64型の変数のサイズに関する質問は自己参照型ですが、int型の変数のサイズに関する質問は完全に有効な質問です。混乱、時間の浪費、討論の妨げなどに。

  • Int32を使用すると、開発者はタイプの選択を意識するようになります。 intの大きさは?サイズが名前に含まれていると、その型のサイズが実際に考慮される可能性が高くなります。 Int32を使用すると、他の選択肢についての知識も深まります。人々が少なくとも別の方法があることを認識することを余儀なくされない場合、intが "整数型"になるのははるかに簡単になります。

  • 32ビット整数と対話することを目的としたフレームワーク内のクラスはInt32という名前です。これもまた、より直観的で分かりにくく、(不必要な)翻訳(システム内の翻訳ではなく、開発者の頭の中での翻訳)を欠いている、などです。int lMax = Int32.MaxValueまたはInt32 lMax = Int32.MaxValue

  • intは、すべての.NET言語のキーワードではありません。

  • 変更される可能性が低い理由はいくつかありますが、intは必ずしもInt32であるとは限りません。

欠点は、入力する文字が2つ増えて[バグ]になることです。

これはコンパイルされません

public enum MyEnum : Int32
{
    AEnum = 0
}

しかし、これはなります:

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

私はベストプラクティスはintを使用することであることを知っています、そしてすべてのMSDNコードはintを使用します。しかし、私の知る限りでは、標準化と一貫性以外に理由はありません。

5
Raithlin

気にしないでください。ほとんどの場合はintを使用してください。それは将来あなたのプログラムをより広いアーキテクチャに移植するのを助けるでしょう(現在intSystem.Int32へのエイリアスですが、それは変わるかもしれません)。変数のビット幅が重要な場合(たとえば:structのメモリ内のレイアウトを制御する場合)に限り、int32およびその他(関連する "using System;"と共に)を使用する必要があります。

4
yhdezalvarez

Microsoftの StyleCop を使うことをお勧めします。

これは FxCop に似ていますが、スタイル関連の問題のためです。デフォルト設定はMicrosoftの内部スタイルガイドと一致しますが、プロジェクトに合わせてカスタマイズできます。

慣れるまで少し時間がかかることがありますが、それは間違いなくあなたのコードをより良いものにします。

自動的に違反をチェックするためにあなたのビルドプロセスにそれを含めることができます。

3
devstuff

intはSystem.Int32と同じで、コンパイル時に CIL と同じものになります。

C#はCおよびC++(およびJava)のようになりたいので、C#では慣例的にintを使用しています。

ところで、私はさまざまなWindows API関数のインポートを宣言するときにSystem.Int32を使用することになります。これが定義されている規約かどうかはわかりませんが、外部DLLを使用することになります。

3
Jack Bolding

かつて、intデータ型は、コンパイラが対象としているマシンのレジスタサイズに固定されていました。したがって、たとえば、16ビットシステム用のコンパイラは16ビット整数を使用します。

しかし、ありがたいことに16ビットはそれほど見られなくなりました。64ビットが普及し始めたとき、古いソフトウェアとの互換性を重視するようになり、32ビットが登場してからほとんどのコンパイラにとって intは32ビットと仮定されています。

3
Joel Coehoorn

intはSystem.Int32に対するC#言語のショートカットです。

これはMicrosoftがこのマッピングを変更できることを意味するが、FogCreekの議論に関する投稿は [source] を述べた

"64ビットの問題について - マイクロソフトは64ビットバージョンの.NET Frameworkに取り組んでいますが、そのシステムではintが64ビットに対応していないと確信しています。

理由:

1。 C#ECMA規格では、intは32ビット、longは64ビットであると明確に述べられています

2。 Microsoftは、Array.GetLengthに加えてArray.GetLongLengthのようなint値の代わりにlong値を返す、Frameworkバージョン1.1の追加のプロパティとメソッドを導入しました。

それで、すべての組み込みC#型は現在のマッピングを維持すると言っても安全だと思います。」

3
Ray Hayes

気にしないでください。サイズが問題になる場合は、byte、short、int、そしてlongを使用します。 int32より大きいintを使用する唯一の理由は、2147483647より大きい数値または-2147483648より小さい数値が必要な場合です。

私が気にしないということ以外に、他にも気になることがたくさんあります。

2
David Basarab

intInt32は同じです。 intInt32のエイリアスです。

2
Jesper Kihlberg

実際には違いはなく、やがてあなたはあなた自身の規約を採用するでしょう。型を割り当てるときはキーワードを使い、静的メソッドなどを使うときはクラスのバージョンを使います。

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

2
chrisb

この表で定義されているように、intSystem.Int32のエイリアスです。 組み込み型テーブル(C#リファレンス)

1
Jim T

IntまたはInt32の使用は同じですIntは読者のためのコードを単純化するための単なる砂糖です。

NULL可能バリアントIntを使用しますか。またはInt32? nullを含むフィールドでデータベースを操作するとき。それはあなたに多くのランタイム問題からあなたを救うでしょう。

0
bovium

しばらく前に、Microsoft .NET CLR製品チームの誰かからの訪問を受けたとき、私はMicrosoftとのプロジェクトに取り組んでいました。この人は例をコーディングし、彼が彼の変数を定義するとき彼は“ Int32” vs.“ int”と“ String” vs“ string”を使いました。

私はマイクロソフトの他のサンプルコードでこのスタイルを見たことを思い出しました。それで、私はいくつかの研究をしました、そして、誰もが「Int32」と「int」の間に構文着色を除いて違いがないと言うことを発見しました。実際、私はあなたがあなたのコードをもっと読みやすくするためにあなたが“ Int32”を使うことを提案する多くの資料を見つけました。そこで、私はそのスタイルを採用しました。

先日、私は違いを見つけました! 「Int32」を使用してenumを入力することはコンパイラで許可されていませんが、「int」を使用した場合は許可されています。私はまだ知らないのでなぜ私に尋ねないでください。

例:

public  enum MyEnum : Int32
{
    AEnum = 0
}

これはうまくいきます。

public enum MyEnum : int
{
    AEnum = 0
}

撮影元: Int32表記vs int

0
Schmuli

プラットフォームによってはintのサイズが異なるコンパイラもあります(C#固有ではありません)。

いくつかのコーディング規格(MISRA C)は、使用されるすべてのタイプがサイズ指定(すなわち、Int32ではなくintである)であることを要求する。

異なる型変数に接頭辞を指定するのも良いでしょう(例えば、8ビットバイトの場合はb、16ビットWordの場合はw、32ビット長の場合はl)=> Int32 lMyVariable

コードの移植性と保守性が向上するため、注意が必要です。

あなたがいつもC#を使用しようとしていて、C#の仕様がこの点で変わることがないのであれば、PortableはC#には適用できないかもしれません。

あなたのコードを保守している人はこの特定のC#の仕様に気付いていないかもしれないし、バグがあるのを見逃すかもしれないので、保守可能なihmoは常に適用可能です。

たとえば年の月を数える単純なforループでは、気にしなくても構いませんが、フローを迂回する可能性があるコンテキストで変数を使用する場合は気にする必要があります。

あなたがそれについて少し賢明な操作をするつもりであるならば、あなたはまた気にするべきです。

0
user11211

非常に特殊な数学関数や特定のアーキテクチャ向けに最適化されたコードを記述する必要がない限り、ほとんどのプログラミング言語を気にするべきではありません。 知っている例えば32ビット以上必要でしょう)

0
Stacker

Int32型を使用するには、Systemへの名前空間参照、または完全修飾(System.Int32)が必要です。名前空間のインポートを必要としないため、名前空間が衝突する可能性が少なくなるため、intを使用する傾向があります。 ILにコンパイルした場合、両者に違いはありません。

0
Michael Meadows

関係ありません。 intは言語キーワード、Int32は実際のシステムタイプです。

関連する質問への私の ここで答え も参照してください。

0
Keith

Visual Studio 2012のイミディエイトウィンドウによると、Int32はint、Int64はlongです。これが出力です。

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

Int16も検討してください。整数をアプリケーションのメモリに格納する必要があり、メモリの使用量が心配な場合は、Int32よりもメモリの使用量が少なく、最小/最大範囲が小さいため、Int16を使用できます(これはintです)。 。)

0