3.1.5型転換;箱詰めと解体

4504 ワード

http://book.2cto.com/201210/6832.html
タイプ変換とは、あるタイプを別のタイプに変換することです.変換は暗黙的または明示的に行うことができます.このセクションでは、この2つの変換方法について詳しく説明し、梱包と取り外しについて説明します.
1.暗黙的な変換
暗黙的変換とは,宣言を必要とせずに行う変換である.暗黙的な変換を行う場合、コンパイラはチェックを必要とせずに安全に変換できます.表3.4に、暗黙的に変換できるデータ型を示す.
表3.4   暗黙タイプ変換テーブルソースタイプ ターゲットタイプsbyte short、int、long、float、double、decimal byte short、ushort、int、uint、long、ulong、float、doubleまたはdecimal short int、long、float、doubleまたはdecimal ushort int、uint、long、ulong、float、doubleまたはdecimal int long、float、doubleまたはdecimal uint long、ulong、float、doubleまたはdecimal char ushort、int、uint、long、ulong、float、doubleまたはdecimal float double ulong float、doubleまたはdecimal long float、doubleまたはdecimal
int、uint、long、またはulongからfloat、およびlongまたはulongからdoubleへの変換は精度損失をもたらす可能性がありますが、その桁数には影響しません.他の暗黙的な変換では、情報は失われません.
説明:異なる値タイプ間の変換では、低精度、小範囲のデータ型から高精度、大範囲のデータ型に変換する場合は、暗黙的な変換を使用します.
【例3.8】intタイプの値を暗黙的にlongタイプに変換し、コードは以下の通りである.01   int i=2011;   //整形変数を定義して02を初期化   long l=1;    //長い整形変数を定義し、03を初期化   l=i;       //暗黙的変換
2.明示的な変換
明示的な変換は強制変換とも呼ばれ、変換するタイプをコードに明確に宣言する必要があります.暗黙的な変換が存在しないタイプ間で変換する場合は、明示的な変換を使用する必要があります.表3.5に、明示的な変換が必要なデータ型を示す.
表3.5   明示的タイプ変換テーブルソースタイプ ターゲットタイプsbyte byte、ushort、uint、ulongまたはchar byte sbyteとchar short sbyte、byte、ushort、uint、ulongまたはchar ushort sbyte、byte、shortまたはchar int sbyte、byte、short、ushort、uint、ulongまたはchar(続き)ソースタイプ ターゲットタイプuint sbyte、byte、short、ushort、intまたはchar char sbyte、byteまたはshort float sbyte、byte、short、ushort、int、uint、long、ulong、charまたはdecimal ulong sbyte、byte、short、ushort、int、uint、longまたはchar long sbyte、byte、short、ushort、int、uint、ulongまたはchar double sbyte、byte、short、ushort、int、uint、ulong、long、charまたはdecimal decimal sbyte、byte、short、ushort、int、uint、ulong、long、charまたはdouble
明示的変換にはすべての暗黙的変換と明示的変換が含まれるため、強制変換式を使用して任意の数値タイプから任意の他の数値タイプに変換することができます.
【例3.9】doubleタイプのxを明示的にタイプ変換するコンソールアプリケーションを作成し、コードは以下の通りである.01   static void Main(string[] args) 02   { 03       double x = 19810927.0112;   //doubleタイプ変数x 04の作成       int y = (int)x;     //整数変数y 05への変換を表示       Console.WriteLine(y);    //出力整数変数y 06       Console.ReadLine(); 07   }
プログラムの実行結果は1981927です.
Convertキーワードで明示的なタイプ変換を行うこともでき、上記の例は以下のコードで実現することもできる.
【例3.10】コンソールアプリケーションを作成し、Convertキーワードにより明示的なタイプ変換を行い、コードは以下の通りである.01   double x = 19810927.0112;    //doubleタイプ変数x 02の作成   int y = Convert.ToInt32(x);   //Convertキー変換03   Console.WriteLine(y);    //出力整数変数y
3.梱包と解体
値タイプを参照タイプに変換するプロセスを梱包と呼び、逆に参照タイプを値タイプに変換するプロセスを梱包と呼びます.次に、梱包と梱包のプロセスを例によって詳しく説明します.
(1)梱包
梱包では、値タイプを暗黙的に参照タイプに変換できます.次に、梱包操作の方法を例に示します.
【例3.11】コンソールアプリケーションを作成し、整数変数iを宣言して2011に値を割り当て、梱包オブジェクトobjに値を割り当て、最後に変数iの値を変更します.コードは以下の通りです.(インスタンス位置:光ディスクmrexample第3章3.11)
コード位置:光ディスクmrexample第3章3.11Test 06Test 06Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test06
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 2011;								//    int    i,     2011
            object obj = i;								//    object  obj,      i
            Console.WriteLine("1、i   {0},        {1}", i, obj);
            i = 927;									//   I   927
            Console.WriteLine("2、i   {0},        {1}", i, obj);
            Console.ReadLine();

        }
    }
}

運転結果を図3.6に示す.
プログラムの実行結果から、値タイプ変数の値が箱詰めされたオブジェクトにコピーされ、箱詰め後に値タイプ変数の値が変更され、箱詰めオブジェクトの値に影響しないことがわかります.
(2)解体
ボックスを外すと、参照タイプを値タイプに明示的に変換できます.次に、ボックスを取り外す手順を例に示します.
【例3.12】コンソールアプリケーションを作成し、整数変数iを宣言して2011に値を割り当て、それを箱詰めオブジェクトobjにコピーし、最後に、箱詰めオブジェクトobjを整数変数jに値を割り当てる.コードは以下の通りである.(例位置:光ディスクmrexample第3章3.12)
コード位置:光ディスクmrexample第3章3.12Test 07Test 07Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test07
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 2011;								//    int     i,     2011
            object obj = i;								//      
            Console.WriteLine("    :  {0},       {1}", i, obj);
            int j = (int)obj;							//      
            Console.WriteLine("    :     {0},  {1}", obj, j);
            Console.ReadLine();

        }
    }
}

運転結果を図3.7に示す.
 
説明:梱包は、値タイプをオブジェクトタイプ(object)に変換します.を選択し、ボックスを外すと、オブジェクトタイプが明示的に値タイプに変換されます.ボックスに入れると、値タイプをコピーして変換されますが、ボックスを外すと、stringのobjectタイプをintタイプに変換できないなど、タイプの互換性に注意する必要があります.
試しに、上記の例を変更して、「int j=(int)obj;」文の前の行に「i=927;」という文を追加し、関連変数の値を出力します.