C#では、int
とInt32
同じものですが、私は何度も読んだことint
よりも好ましいInt32
与えられていない理由とは。理由はありますか、私は気にする必要がありますか?
System.Int32
)
When something can be read without effort, great effort has gone into its writing.
Easy writing is hard reading
C#では、int
とInt32
同じものですが、私は何度も読んだことint
よりも好ましいInt32
与えられていない理由とは。理由はありますか、私は気にする必要がありますか?
System.Int32
)
When something can be read without effort, great effort has gone into its writing.
Easy writing is hard reading
回答:
ECMA-334:2006 C#言語仕様(p18):
事前定義された各タイプは、システム提供のタイプの省略形です。たとえば、キーワード
int
はstructを参照しSystem.Int32
ます。スタイルの問題として、完全なシステムタイプ名を使用するよりも、キーワードを使用することをお勧めします。
2つは確かに同義です。int
少し見慣れInt32
たものになり、コードを読む人にとって32ビット性がより明確になります。私はint
「整数」だけが必要Int32
な場合、サイズが重要な場合(暗号コード、構造)を使用する傾向があるので、将来のメンテナはint
、適切な場合にを拡大しても安全であることを知っていますがInt32
、同じようにを変更するように注意する必要があります。
結果のコードは同じになります。違いは、単に可読性またはコードの外観の1つです。
それらは両方とも32ビット整数を宣言し、他のポスターが述べているように、どちらを使用するかは主に構文スタイルの問題です。ただし、常に同じように動作するとは限りません。たとえば、C#コンパイラはこれを許可しません。
public enum MyEnum : Int32
{
member1 = 0
}
しかし、それはこれを可能にします:
public enum MyEnum : int
{
member1 = 0
}
図を行きます。
enum
使用することはint
できませんderive
が、指定しますunderlying type
。参照msdn.microsoft.com/en-us/library/sbbt4032.aspx#code-snippet-2
例えば、 -私は常に、システムのタイプを使用するInt32
代わりにint
。Applied .NET Frameworkプログラミングを読んだ後、私はこの方法を採用しました-作者のJeffrey Richterが完全な型名を使用するための良い例を作成します。ここに、私に付き合った2つのポイントがあります。
タイプ名は.NET言語によって異なります。たとえば、C#ではlong
System.Int64 にマップされますが、マネージ拡張機能付きのC ++では、long
Int32 にマップされます。.NETを使用している間、言語を混在させることができるため、読者の優先言語に関係なく、明示的なクラス名を使用する方が常により明確になります。
多くのフレームワークメソッドには、メソッド名の一部として型名があります。
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
List<Tuple<Int32, Boolean>> test = new
、Visual Studioが挿入しList<Tuple<int, bool>>()
ます。これらのオートコンプリートを変更する方法を知っていますか?
var
、コードの冗長性を減らすためにできるだけ使用する傾向があるため、私にとってもう問題ではありません。オートコンプリートが入ってきて床に吐き出されるときどきの場所で、私は手動で調整します。これは文字通り私の時間の1〜2秒です。
intはC#キーワードであり、明確です。
ほとんどの場合それは重要ではありませんが、Int32に反する2つの点があります。
すでに述べたように、int
= Int32
。安全のため、データ型の境界を気にするものを実装するときは、必ずint.MinValue
/ を使用してint.MaxValue
ください。.NETがにint
なると決定したとするとInt64
、コードは境界にあまり依存しなくなります。
int
64ビットに変更することを決定した場合、それはそのような重大な変更であり、そのような事態に対して防御的にコード化することは可能(または確かに賢明)ではないと思います。
単一の言語のみを処理する必要がある場合(および数学のオーバーフローについて思い出す必要がないコードの場合)、型のバイトサイズはそれほど興味深いものではありません。興味深い部分は、ある言語から別の言語へ、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をいつ使用するかを正当化するのは、コーディングしているアプリケーション、それを使用しているユーザー、あなたとあなたのチームが従うコーディングプラクティスなどに依存するだけだと思います。
そこの間に違いはありませんint
とはInt32
、しかしようint
である言語は、多くの人が(ちょうどのように文体それを好むキーワードstring
対String
)。
変数を定義するときは常にエイリアスされた型(int、stringなど)を使用し、静的メソッドにアクセスするときは実際の名前を使用します。
int x, y;
...
String.Format ("{0}x{1}", x, y);
int.TryParse()のようなものを見るのは醜いようです。私がこれをする理由はスタイル以外にありません。
それらは(ほとんど)同一ですが(1つの[バグ]の違いについては以下を参照)、間違いなく注意し、Int32を使用する必要があります。
16ビット整数の名前はInt16です。64ビット整数の場合はInt64で、32ビット整数の場合は直感的な選択はintまたはInt32?です。
タイプInt16、Int32、またはInt64の変数のサイズの質問は自己参照ですが、タイプintの変数のサイズの質問は完全に有効な質問であり、どんなに些細なことでも気が散る、リードしています混乱、時間の浪費、議論の妨げなど。
Int32を使用すると、開発者がタイプの選択を意識するようになります。intは再びどのくらいの大きさですか?名前にサイズが含まれていると、タイプのサイズが実際に考慮される可能性が高くなります。Int32を使用すると、他の選択肢の知識も促進されます。人々が少なくとも代替案があることを認識せざるを得ない場合、intが「THE整数型」になるのは非常に簡単になります。
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
}
気にしないでください。int
ほとんどの時間を使うべきです。将来的には、より幅広いアーキテクチャへのプログラムの移植に役立ちます(現在int
はエイリアスSystem.Int32
ですが、変更される可能性があります)。変数のビット幅が重要な場合のみ(たとえば:aのメモリ内のレイアウトを制御するためstruct
)int32
、その他(関連する " using System;
" を使用)を使用する必要があります。
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#型はすべて、現在のマッピングを維持すると言っても安全だと思います。」
intはSystem.Int32と同じで、コンパイルするとCILで同じものになります。
C#はCおよびC ++(およびJava)のように見える必要があるため、C#では慣例としてintを使用します。
ところで、私はさまざまなWindows API関数のインポートを宣言するときにSystem.Int32を使用することになります。これが定義された規則であるかどうかはわかりませんが、外部DLLに行くことを思い出させます...
むかしむかし、intデータ型は、コンパイラのターゲットとなるマシンのレジスタサイズに固定されていました。したがって、たとえば、16ビットシステム用のコンパイラは16ビット整数を使用します。
しかし、ありがたいことに16ビットはそれほど多くは見られなくなり、64ビットが人気を博し始めたとき、人々はそれを古いソフトウェアと互換性を持たせることにもっと関心を持っており、32ビットは非常に長い間、ほとんどのコンパイラにとってintでした32ビットと見なされます。
MicrosoftのStyleCopの使用をお勧めします。
これはFxCopに似ていますが、スタイル関連の問題が対象です。デフォルトの構成はMicrosoftの内部スタイルガイドと一致しますが、プロジェクトに合わせてカスタマイズできます。
慣れるまで少し時間がかかるかもしれませんが、コードが間違いなくより良いものになります。
これをビルドプロセスに含めて、違反を自動的にチェックできます。
int
とInt32
同じです。int
のエイリアスですInt32
。
using int = System.Int32;
すべてのソースコードファイルに対するディレクティブがあるということ です。
int
System.Int32
次の表で定義されているように、のエイリアスです:
組み込み型テーブル(C#リファレンス)
コンパイラによっては、プラットフォームごとにintのサイズが異なります(C#固有ではありません)。
一部のコーディング標準(MISRA C)では、使用されるすべてのタイプのサイズを指定する必要があります(つまり、intではなくInt32)。
さまざまなタイプの変数にプレフィックスを指定することもお勧めです(たとえば、8ビットバイトの場合はb、16ビットワードの場合はw、32ビットロングワードの場合はl => Int32 lMyVariable)。
コードの移植性と保守性が向上するため、注意が必要です。
常にC#を使用し、C#仕様がこの点で変更されない場合、PortableはC#に適用できない場合があります。
コードの保守担当者はこの特定のC#仕様を認識していない場合があり、バグが見逃される可能性があるため、保守可能なihmoは常に適用可能です。
たとえば年の月を数える単純なforループでは気になりませんが、流量が低下する可能性があるコンテキストで変数を使用する場合は注意する必要があります。
また、ビット単位の操作を行うかどうかにも注意する必要があります。
It is also good to specify prefixes for different type variables
ハンガリー語の表記法は今日ではほとんど使用されておらず、ほとんどのコーディングスタイルでは、その使用は推奨されていません。ソフトウェア会社の社内
Int32
タイプを使用するには、への名前空間参照System
、または完全修飾(System.Int32
)が必要です。int
名前空間をインポートする必要がないため、場合によっては名前空間の衝突の可能性が低くなるため、私はに向かう傾向があります。ILにコンパイルすると、2つの間に違いはありません。
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
Int16も検討してください。アプリケーションのメモリに整数を格納する必要があり、使用されるメモリの量が心配な場合は、メモリの使用量が少なく、最小/最大範囲がInt32よりも小さいため、Int16を使用できます(これはintが何であるか) 。)
しばらく前に、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