キャストを使ってみよう

今回のC#プログラミング学習は、キャストの使い方を学んでいきます。

キャストとは、二つの型が違う変数で代入処理をする際、型の補正を指示するコーディング技術のことです。

これだけだとわかりにくいと思うので、以下でじっくり説明していきます。

プログラム例その1

まずは、こちらのC#プログラムを見てください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample
{
	internal class Program
	{
		static void Main(string[] args)
		{
			double dNumber = 3.14;
			int nNumber;

			nNumber = (int)dNumber;

			Console.Write("dNumber = {0}", dNumber);
			Console.ReadLine();

			Console.Write("nNumber = {0}", nNumber);
			Console.ReadLine();
		}
	}
}

プログラム例その1をダウンロードするにはここをクリックします。

ダウンロードしたZIPファイルを解凍して、「Sample.sln」を開くとVisualStudioが立ち上がってきます。

ビルドメニューから「ソリューションのビルド」を選択し、ビルドします。

VisualStudioでのビルド成功画面

ビルドが成功したら、F5キーを押してプログラムを動かします。

プログラム実行画面

プログラムが起動したら表示内容を確認し、Enterキーを押すと次の画面に進みます。

プログラム終了画面

二つの変数の中身を確認したら、Enterキーを押すとプログラムが終了します。

プログラム例その1の解説

今回はキャストについて学んでいきます。

キャストとは

キャストとは、冒頭でも述べたように、「二つの型が違う変数で代入処理をする際、型の補正を指示するコーディング技術のこと」です。

これだけだとわかりにくいので、具体例を見てみましょう。

今回のプログラム例その1では、double型と、int型の二つの変数を用意しています。

double dNumber = 3.14;
int nNumber;

double型の変数は宣言と同時に小数値を代入し、int型の変数には宣言のみで代入処理は行いません。

次に、double型の変数に入っている小数値を、int型の変数に代入しています。

このとき、double型からint型へデータを移行することになるので、キャストを使います。

プログラム例その1では、以下の部分がそうですね。

nNumber = (int)dNumber;

double型の変数の前に、「(int)」というのがありますよね。

これがキャストです。

「(int)」というのは、今はdouble型だけど、これからint型の変数に移し替えるという意味があります。

よくわからない場合は、イコールの左側にある変数の型名をカッコ内に記述するものだと思っておいてください。

仮に「(int)」部分を削除してビルドしてみると…。

CS0266. 型 'double' を 'int' に暗黙的に変換できません。
明示的な変換が存在します (cast が不足していないかどうかを確認してください)

このようなエラーメッセージが表示されます。

キャストの必要性

ではなぜキャストが必要なのでしょうか?

C#プログラム内で変数が宣言されると、コンピュータがメモリを確保します。

このとき、宣言される型によって確保するメモリの大きさが変わるんです。

使用する数値の範囲が小さければ、小さなメモリ領域で済みますが、大きな数値の範囲を扱うときには、大きなメモリ領域が必要になります。

これが「変数の型」が存在する理由です。

扱うデータの大きさによって確保するメモリ領域の大きさを適切なものにすることで、プログラムの実行速度を速くし、コンピュータへの負担を軽くしているのです。

ここまではわかりますよね。

でも、型が違っていたとしても、イコールでそのまま代入できた方が楽ですよね。

どうしてそれができないのでしょうか?

実は、やろうと思えばできるんですが、C#言語の場合は、やろうと思わないのでやっていないという感じになっています。

例えば、このサイトで扱っているPerlというプログラミング言語は、変数はありますが型という概念がないので、当然キャストもありません。

仮に変数の型があったとしても、裏でこっそりキャストすることは可能だと思います。

でもそれをしないということは、単純に、C#プログラマー側に同意を求めているのではないでしょうか。

プログラム例その1を実行すると、double型の変数にはちゃんと小数値が格納されているのに対し、int型に格納された値に関しては、小数点以下が切り捨てられていますよね。

これは、int型では扱えない範囲の数値を無理やり代入したので、扱えない部分のデータが切り捨てられ、値の内容が変わってしまったのです。

型が違う変数同士でデータのやり取りをするということは、このようなリスクがあるんです。

そして、キャストをコーディングすることは、C#プログラマー側も「このようなリスクを把握してますよ」と明示させられているのだと思います。

プログラム例その2

今回はもう一つサンプルプログラムを用意しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sample
{
	internal class Program
	{
		static void Main(string[] args)
		{
			int nNumber1, nNumber2;
			double dAverage;

			nNumber1 = 5;
			nNumber2 = 2;
			dAverage = ( nNumber1 + nNumber2 ) / (double)2;

			Console.Write("{0}と{1}の平均は{2}です", nNumber1, nNumber2, dAverage);
			Console.ReadLine();
		}
	}
}

プログラム例その2をダウンロードするにはここをクリックします。

ダウンロードしたZIPファイルを解凍して、「Sample.sln」を開くとVisualStudioが立ち上がってきます。

ビルドメニューから「ソリューションのビルド」を選択し、ビルドします。

VisualStudioでのビルド成功画面

ビルドが成功したら、F5キーを押してプログラムを動かします。

プログラム実行画面

表示内容を確認したら、Enterキーを押すとプログラムが終了します。

プログラム例その2の解説

これは以前作ったサンプルプログラムを改造したものです。

改造したのは以下の部分です。

dAverage = ( nNumber1 + nNumber2 ) / (double)2;

プログラム例その1では、double型をint型にキャストしましたが、ここではその逆をしています。

整数値つまりint型の数値を、double型にキャストしています。

このプログラム例を使ったときはまだキャストを学習していなかったので、無理やり小数値にしていました。

でも今であれば、キャストを使いプログラムっぽくコーディングすることができます。

まとめ

キャストは必要な技術なので、覚えておきましょう。