intまたはInt32を使用する必要があります


352

C#では、intInt32同じものですが、私は何度も読んだことintよりも好ましいInt32与えられていない理由とは。理由はありますか、私は気にする必要がありますか?


APIをプログラミングするとき、彼はInt32よりもInt32を好む、これについてスキートでツイートします。
comecme 2011年

@JohnBubriski:そして、それを使用するために使用するステートメントが少なくて済むことを忘れないでください(または入力しますSystem.Int32
sehe

質問があります:CLR型を直接使用していませんが、なぜそれらが必要なのですか?
AminM 2013年

@JohnBubriski Facebookステータスの更新は、コードよりも簡単に入力できます。そこに悪い考え!読みやすく理解することは、タイプすることよりもはるかに重要です。When something can be read without effort, great effort has gone into its writing. Easy writing is hard reading
7hi4g0 14

回答:


134

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

事前定義された各タイプは、システム提供のタイプの省略形です。たとえば、キーワードintはstructを参照しSystem.Int32ます。スタイルの問題として、完全なシステムタイプ名を使用するよりも、キーワードを使用することをお勧めします。


271

2つは確かに同義です。int少し見慣れInt32たものになり、コードを読む人にとって32ビット性がより明確になります。私はint「整数」だけが必要Int32な場合、サイズが重要な場合(暗号コード、構造)を使用する傾向があるので、将来のメンテナはint、適切な場合にを拡大しても安全であることを知っていますがInt32、同じようにを変更するように注意する必要があります。

結果のコードは同じになります。違いは、単に可読性またはコードの外観の1つです。


65
コードを読む人は、intがSystem.Int32のエイリアスであることを知っているはずです。読みやすさに関しては、一貫性がはるかに重要です。
Troels Thomsen

11
古いC ++の考え方をお持ちの方のために、IntPtrは32ビットOSでは32ビット、64ビットOSでは64ビットになるように設計されています。この動作は、そのサマリータグで具体的に説明されています。msdn.microsoft.com/en-us/library/system.intptr(VS.71).aspx
diadem

87

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

public enum MyEnum : Int32
{
    member1 = 0
}

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

public enum MyEnum : int
{
    member1 = 0
}

図を行きます。


9
Reflectorを使用してSystem.Int32型を調べると、それが構造体でクラスではないことがわかります。コードは次のようになります。[Serializable、StructLayout(LayoutKind.Sequential)、ComVisible(true)] public struct Int32:IComparable、IFormattable、IConvertible、IComparable <int>、IEquatable <int> {public const int MaxValue = 0x7fffffff; ...構造体から型を派生させることはできません。少なくとも、そのことを通知するエラーが発生します。ただし、列挙型の動作は少し異なります。これについては、次にコメントします。
raddevus

16
Int32から列挙型を派生できないのは設計された動作であり、.NETコードを見ても確認できます:[Serializable、ComVisible(true)] public abstract class Enum:ValueType、IComparable、IFormattable、Enumが派生していることに注意してくださいValueTypeから?組み込みデータ型(int、byteなど)以外の何かからenumを導出しようとすると、次のようなエラーが表示されます:type byte、sbyte、short、ushort、int、uint、long、またはulongが必要です。
raddevus

2
指定していること@daylightノートenum使用することはintできませんderiveが、指定しますunderlying type。参照msdn.microsoft.com/en-us/library/sbbt4032.aspx#code-snippet-2
イェルーンWiert Pluimers

2
@JeroenWiertPluimersただし、基礎となる型は列挙型の定数の型にすぎないため、コンパイル時に実際には問題にならないため、基礎となる型を文字どおりチェックしてCS1008をスローすることを選択した理由は依然として興味深いです。
IllidanS4はモニカを2014

5
@ IllidanS4、新しいコンパイラRoslyn-これは修正され、両方のバリアントが有効
Grundy

49

例えば、 -私は常に、システムのタイプを使用するInt32代わりにintApplied .NET Frameworkプログラミングを読んだ後、私はこの方法を採用しました-作者のJeffrey Richterが完全な型名を使用するための良い例を作成します。ここに、私に付き合った2つのポイントがあります。

  1. タイプ名は.NET言語によって異なります。たとえば、C#ではlongSystem.Int64 にマップされますが、マネージ拡張機能付きのC ++では、longInt32 にマップされます。.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

これに関する問題は、Visual Studioのオートコンプリートが引き続きintを使用することです。したがって、を作成するとList<Tuple<Int32, Boolean>> test = new、Visual Studioが挿入しList<Tuple<int, bool>>()ます。これらのオートコンプリートを変更する方法を知っていますか?
MrFox、

2
はい、それは問題です。いいえ、私はそれらをオフハンドで変更する方法を知りません。ポイント2はvar、コードの冗長性を減らすためにできるだけ使用する傾向があるため、私にとってもう問題ではありません。オートコンプリートが入ってきて床に吐き出されるときどきの場所で、私は手動で調整します。これは文字通り私の時間の1〜2秒です。
Remi Despres-Smyth

20

intはC#キーワードであり、明確です。

ほとんどの場合それは重要ではありませんが、Int32に反する2つの点があります。

  • 「使用システム」が必要です。ステートメント。「int」を使用する場合、usingステートメントは不要です。
  • Int32と呼ばれる独自のクラスを定義することは可能です(これはばかげて混乱するでしょう)。intは常にintを意味します。

独自の「var」クラスを作成することも可能ですが、それによって人々がそのクラスを使用するのを妨げることはありません。
ニーム

すべてのキーワードはC#キーワードです。intはすでにCおよびC ++で使用されていました。したがって、特にC#については何もありません。
MrFox

12

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


8
@spoulson:1行目のコメントエラー:等しい型の間での割り当ては禁止されています。はい、冗談です。
Johann Gerell、2010年

22
C#仕様(これは.NETではなくC#です)がint64ビットに変更することを決定した場合、それはそのような重大な変更であり、そのような事態に対して防御的にコード化することは可能(または確かに賢明)ではないと思います。
Jon Skeet

9

単一の言語のみを処理する必要がある場合(および数学のオーバーフローについて思い出す必要がないコードの場合)、型のバイトサイズはそれほど興味深いものではありません。興味深い部分は、ある言語から別の言語へ、C#からCOMオブジェクトへなどの橋渡しをするとき、またはビットシフトまたはマスキングを行っているときに、自分自身(およびコードレビューの共同作業者)に思い出させる必要があるときです。データのサイズの。

実際には、マネージドC ++(C#へのブリッジなど)およびアンマネージド/ネイティブC ++を記述しているため、通常はInt32を使用してサイズを思い出させます。

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

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

F# (私はそれを使用したことがありませんが)、彼らが定義int型INT32、およびnativeint型を。同じ質問が出てきます。「どちらを使用するのですか?」です。他の人が述べたように、ほとんどの場合、それは問題ではありません(透明でなければなりません)。しかし、あいまいさを取り除くためだけに、int32とuint32を選択しました。

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


それは.netの目的を無効にしませんか?とにかくF#とは何か、ゲイツが引退したことで消えてしまったアイデア
ニックターナー

8

そこの間に違いはありませんintとはInt32、しかしようintである言語は、多くの人が(ちょうどのように文体それを好むキーワードstringString)。


7

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

  1. 入力が速くなります。
  2. 典型的なC#開発者には、より馴染みがあります。
  3. デフォルトのVisual Studio構文強調表示の別の色。

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


7

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

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

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


5

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


5

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

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

  • タイプInt16、Int32、またはInt64の変数のサイズの質問は自己参照ですが、タイプintの変数のサイズの質問は完全に有効な質問であり、どんなに些細なことでも気が散る、リードしています混乱、時間の浪費、議論の妨げなど。

  • Int32を使用すると、開発者がタイプの選択を意識するようになります。intは再びどのくらいの大きさですか?名前にサイズが含まれていると、タイプのサイズが実際に考慮される可能性が高くなります。Int32を使用すると、他の選択肢の知識も促進されます。人々が少なくとも代替案があることを認識せざるを得ない場合、intが「THE整数型」になるのは非常に簡単になります。

  • 32ビット整数と対話することを目的としたフレームワーク内のクラスは、Int32という名前です。もう一度、である:より直感的に、より少ない混乱、(不要)翻訳(システムではない訳はなく、開発者の心の中で)、などが欠けています int lMax = Int32.MaxValueInt32 lMax = Int32.MaxValue

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

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

欠点は、入力する2つの余分な文字と[バグ]です。

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

public enum MyEnum : Int32
{
    AEnum = 0
}

しかし、これは:

public enum MyEnum : int
{
    AEnum = 0
}

「16ビット整数の名前はInt16、64ビット整数の名前はInt64、32ビット整数の名前はintまたはInt32?」とありますが、これらのC#キーワードもあります。Int16 = short Int64 = longしたがって、あなたの答えの1つは誤った仮定に基づいています。
メル

「型intの変数は完全に有効な質問であり、どんなに些細なことでも、気が散り、混乱、時間の浪費、議論の妨げなどにつながります(この質問が存在するという事実がポイントを証明します)。」私をからかってるの?背後にあるものを完全に理解していない言語で作業している。開発者がプリミティブ型が何に相当するか理解していない場合、彼は料理芸術を取り上げるべきです。VB開発者のように聞こえます。プリミティブの使用はどの言語にも固有であり、推奨されます。プリミティブが気に入らなくても問題ありませんが、現実を作り上げることはできません。
Nick Turner

うーん、気にする必要があるというあなたの意見にはまったく同意しません...しかし、列挙型はキーワードからのみ継承できることを知りませんでした。かなり役に立たない事実ですが、それでも知るのは楽しいです:)
Jowen

4

気にしないでください。intほとんどの時間を使うべきです。将来的には、より幅広いアーキテクチャへのプログラムの移植に役立ちます(現在intはエイリアスSystem.Int32ですが、変更される可能性があります)。変数のビット幅が重要な場合のみ(たとえば:aのメモリ内のレイアウトを制御するためstructint32、その他(関連する " using System;" を使用)を使用する必要があります。


1
あなたは真剣にすることはできません...移植をより簡単にしますか?検索と置換は大したことではないと思います。
ヴィンスパヌッチョ

2
(現在intはSystem.Int32のエイリアスですが、変更される可能性があります)?あら来て…本気?
Oybek

結局ゴミ捨てしたい言語でコードを書くのはなぜですか?経営判断のようです。intまたはInt32を使用します。Int32はVBのように見えます
Nick Turner

私が意味したのは、そのMAYBEです(そして、それは大きなMAYBEです。なぜデザイナーがそのようにしたのかは本当にわかりません)。実行しているアーチと同じ幅のintを宣言する方法が必要です。 Cのint / long / ...のように動作します。これは、これを正確に行うように設計されているように見えるメカニズム(エイリアスint32への整数)です。また、Microsoftは常に "int"と "Int32"を使用することをお勧めします(これが元々の意図であった場合と同じように)。私はそれが大きなIFであることを知っています...この回答を書いたとき、64ビットの.NETフレームワークがなかったので、その場合、彼らが何をするのかわかりませんでした。
YankoHernándezAlvarez

3

intはC.言語のSystem.Int32へのショートカットです

これは、マイクロソフトがこのマッピングを変更できることを意味しますが、FogCreekのディスカッションに関する投稿では、[ソース]

「64ビットの問題について-Microsoftは確かに.NET Frameworkの64ビットバージョンに取り組んでいますが、そのシステムではintが64ビットにマッピングされないと確信しています。

理由:

1. C#ECMA標準では、intは32ビット、longは64ビットであると明確に規定されています。

2.マイクロソフトは、Array.GetLengthに加えてArray.GetLongLengthなど、int値ではなくlong値を返す追加のプロパティとメソッドをFrameworkバージョン1.1で導入しました。

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


64ビットバージョンが導入された場合、おそらくC#に 'nativeint'が追加されます(現在、F#で使用されているため)。これは、 'int'の導入とこれをInt32として定義するのは間違いだったことを強調するだけです!そして、API(つまり、ReadIntではなくReadInt32)、色(濃いvs水色)、大文字と小文字の区別(DateTime vs int)の観点からは一貫性がありません。つまり、値の型 'DateTime'にInt32のようなエイリアスがないのはなぜですか?
Carlo Bos 2017年

3

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

C#はCおよびC ++(およびJava)のように見える必要があるため、C#では慣例としてintを使用します。

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


3

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

しかし、ありがたいことに16ビットはそれほど多くは見られなくなり、64ビットが人気を博し始めたとき、人々はそれを古いソフトウェアと互換性を持たせることにもっと関心を持っており、32ビットは非常に長い間、ほとんどのコンパイラにとってintでした32ビットと見なされます。


3

MicrosoftのStyleCopの使用をお勧めします。

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

慣れるまで少し時間がかかるかもしれませんが、コードが間違いなくより良いものになります。

これをビルドプロセスに含めて、違反を自動的にチェックできます。


これについてはStyleCopに完全に同意しません。はい、それは良いですが、私はInt32を使用したいのですが、なぜですか?2つの反対投票のような答えを避けるため。Int32とCでのintの表現方法を混同する人々
John Demetriou

2

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


intはエイリアスではなく、キーワードです。他の答えを見てください。
Timores

intは間違いなく言語のキーワードですが、System.Int32のエイリアスと呼ぶこともできます。さらに、これについて考えるもう1つの方法は、using int = System.Int32; すべてのソースコードファイルに対するディレクティブがあるということ です。
uygar donduran 2013年

2

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

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


System.Int64の代わりにキーワード "long"を使用できることを追加します
Keith

22
あなたはその質問を誤解しました。OPは、「int i」と「Int32 i」の宣言に違いがあるかどうかを尋ねています。
レイヴン

2

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

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


1

Microsoftが整数のデフォルトの実装をいくつかの新しいバージョン(Int32bと呼びましょう)に変更する場合は、intを使用します。

その後、MicrosoftはintエイリアスをInt32bに変更できます。新しい(そしてうまくいけば改善された)整数実装を利用するためにコードを変更する必要はありません。

同じことが、どのタイプのキーワードにも当てはまります。


0

非常に具体的な数学関数、または1つの特定のアーキテクチャ用に最適化されたコードを書く必要がない限り、ほとんどのプログラミング言語では気にする必要はありません...型のサイズが十分であることを確認してくださいたとえば、32ビット以上が必要になることを確認してください)



0

IntまたはInt32の使用は同じですが、Intは単なるコードであり、リーダーのコードを簡略化します。

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


0

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

一部のコーディング標準(MISRA C)では、使用されるすべてのタイプのサイズを指定する必要があります(つまり、intではなくInt32)。

さまざまなタイプの変数にプレフィックスを指定することもお勧めです(たとえば、8ビットバイトの場合はb、16ビットワードの場合はw、32ビットロングワードの場合はl => Int32 lMyVariable)。

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

常にC#を使用し、C#仕様がこの点で変更されない場合、PortableはC#に適用できない場合があります。

コードの保守担当者はこの特定のC#仕様を認識していない場合があり、バグが見逃される可能性があるため、保守可能なihmoは常に適用可能です。

たとえば年の月を数える単純なforループでは気になりませんが、流量が低下する可能性があるコンテキストで変数を使用する場合は注意する必要があります。

また、ビット単位の操作を行うかどうかにも注意する必要があります。


.Netでは違いはありません-intは常にInt32で、longは常にInt64です
Keith

It is also good to specify prefixes for different type variablesハンガリー語の表記法は今日ではほとんど使用されておらず、ほとんどのコーディングスタイルでは、その使用は推奨されていません。ソフトウェア会社の社内
規定で

0

Int32タイプを使用するには、への名前空間参照System、または完全修飾(System.Int32)が必要です。int名前空間をインポートする必要がないため、場合によっては名前空間の衝突の可能性が低くなるため、私はに向かう傾向があります。ILにコンパイルすると、2つの間に違いはありません。


0

Visual Studio 2012のイミディエイトウィンドウによると、Int32はint、Int64は長いです。出力は次のとおりです。

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

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


0

しばらく前に、Microsoft .NET CLR製品チームの誰かから訪問を受けたとき、私はMicrosoftとのプロジェクトに取り組んでいました。この人は例をコード化し、変数を定義するときに「Int32」対「int」および「String」対「string」を使用しました。

Microsoftの他のサンプルコードでこのスタイルを見たのを覚えていました。したがって、私はいくつかの調査を行ったところ、構文の色分けを除いて、「Int32」と「int」の間に違いはないと誰もが言うことがわかりました。実際、コードを読みやすくするために「Int32」を使用することを提案する多くの資料を見つけました。それで、私はそのスタイルを採用しました。

先日違いを見つけました!コンパイラでは、「Int32」を使用して列挙型を入力することはできませんが、「int」を使用する場合は入力できます。まだ分​​からないので、理由を聞かないでください。

例:

public  enum MyEnum : Int32
{
    AEnum = 0
}

これは機能します。

public enum MyEnum : int
{
    AEnum = 0
}

取得元:Int32表記vs. int

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.