森理 麟(moririring)のプログラマブログ

ゲームプログラマ森理 麟がのプログラムの話題を中心に書くブログです。

C#のint

と言うわけで、このブログはC# Advent Calendar 2014の22日目の記事です。昨日はkekyoさんでした(実はつい最近お知り合いになりましたー)。今日はintについてゆるめに書こうと思いますー。

intの言語仕様

C#のintは、言語仕様*1に「–2147483648 から 2147483647 までの値を持つ、32 ビットの符号付き整数を表します」と書いてあります。また「System 名前空間で定義済みの構造体型に対する単なるエイリアス」とも書いてあります。

intの定義

それではこの内容を自分の目で見るために、Visual Studio上のintを定義しているところで、右クリックして「定義へ移動」を押しましょう。

https://lh5.googleusercontent.com/-yWuAv_YbqTY/VJRYxScxPOI/AAAAAAAADPk/gztY-SX3kTw/w705-h531-no/%E7%84%A1%E9%A1%8C%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97_121814_110510_PM.jpg

 

ハイ。intの定義に移動しました。

https://lh6.googleusercontent.com/-F1AHGHZOTFo/VJRYxFkKQbI/AAAAAAAADPc/jWgcIYrRXto/w798-h429-no/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_121814_110627_PM.jpg


intの名前

https://lh6.googleusercontent.com/-E-WgIeaSPMk/VJZaXoHVOiI/AAAAAAAADQM/m_NFvBxtS_Y/w264-h143-no/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_121814_110627_PM_122114_022125_PM.jpg

まず見るのは名前です。intの定義へ移動したはずなのにInt32になっています。これが言語仕様に書いてある単なるエイリアスという意味です。つまりintは渾名で、本名はInt32と言います。「僕の名前はInt32です!intと呼んでくださいね」という感じでしょうか。

https://lh6.googleusercontent.com/-G_f-C3qtImU/VJZaXic_O8I/AAAAAAAADQ4/_tWwR62k60k/w297-h156-no/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_121814_110627_PM_122114_022232_PM.jpg

次に名前空間を見てみましょう。namespace Systemです。さらにInt32の型を見るとstruct、つまり構造体です。これが言語仕様に書いてある「System 名前空間で定義済みの構造体型」という意味です。因みにC#の値型(int,float,charなど)は基本構造体型です。

 

intの値

次にメンバを見てみましょう。定数が2つ宣言されています。MaxValueとMinValueです。そして言わずもがなですが名前が「Int32」つまり32ビットの整数です。これが言語仕様に書いてある「–2147483648 から 2147483647 までの値を持つ、32 ビットの符号付き整数」という意味です。こんな感じで見ていると、言語仕様に書かれたことがより分かってくるかなと思います。折角なのでもう少しみてみましょう。

 

intの静的メンバ

staticがついた静的メンバはクラス名を使ってアクセス出来ます。constも静的と同じ扱いなので例えば最大値を使いたい場合はint.MaxValueと書くことが出来ます。他にもstaticキーワードを使っているParseやTryParseはint.Parse()やint.TryParse()と書くことが出来ます。もちろんInt32.MaxValueやInt32.Parse()と書くことも可能です。

 

intのインターフェース

またintは様々なインターフェースが宣言されています。IComparableはソートなどでどのように並べ替えられるかを、IFormattable・IConvertibleは文字列への変換を、IEquatableは等しいかどうかを明示的に実装しています。 

インターフェースメソッド
IComparable int CompareTo(object obj);
IFormattable string ToString(string format, IFormatProvider formatProvider)
IConvertible string ToString(string format);
IComparable<int> int CompareTo(T other);
IEquatable<int> bool Equals(T other);

 

intのオーバーライド

Equals(object obj)、GetHashCode()、ToString()はoverrideしています。この辺は全ての元になっている基本クラスObjectでvirtual宣言されているメソッドのオーバーライドになります。

intの実装

さて、intの定義を見てみました。しかしこの方法では実装がどうなっているかまでは見ることが出来ません。インターフェースやオーバーライドはやはり実装がどうなっているか見たくなります。実は実装も意外と簡単に見ることが出来ます。

 

方法はReference Sourceで検索することです。ここでInt32と打てばint32.csが見れます。さらにおススメなVisual Studio拡張機能があってRef12をインストールすればVisual Studio上でF12を押すだけでReference Sourceの名前で検索した画面にジャンプしてくれるようになります。

 

最後に

と言うわけでintの定義や実装を見てみました。C#.NET Frameworkの内容を知りたい場合は言語仕様ソースリファレンスMSDNが3種の神器だと思います。 他の基本的な型や.NET Frameworkで良く使うクラスの中身も同様に見てみるとなかなか面白いかと思います。と言うわけで、C# Advent Calendar 2014明日は、uzzuさんです。よろしくお願いします!

*1:VS2013をインストールしていれば"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1041\CSharp Language Specification.docx"にあります