講義メモ

・p.59「Object.GetTypeメソッド」から

p.58(サフィックス:接尾語)【再掲載】

・整数リテラルと実数リテラルはサフィックスをつけることで、扱われる型を変更できる
・整数型サフィックスは「L」でlong型、「U」でuint型、「UL」でulong型で扱える
 ※ 小文字でも良いが「L」を「l」で示すことは推奨されない
・例: ulong work = 4900000000UL; //49億をulong型で扱う(このULは略しても文法エラーにはならない)
・実数型サフィックスは「F」でfloat型、「M」でdeciml型で扱える
 ※ 小文字でも良い。また「d」でdouble型にできるが、指定不要
・例: float work = 3.141592F; //円周率をfloat型で扱う(このFは略すと文法エラー)

提出フォロー:ミニ演習 mini059.cs

・上記のサフィックスの2つの例を試すプログラムを作ろう
・略すと文法エラーになる場合はメッセージを確認してからコメントアウトすると良い

作成例

//ミニ演習 mini059.cs
using System;
class mini059
{
    public static void Main()
    {
        ulong work1 = 4900000000UL; //49億をulong型で扱う
        ulong work2 = 4900000000;  //(このUは略しても文法エラーにはならない)
        float work3 = 3.141592F; //円周率をfloat型で扱う
        //float work4 = 3.141592; //(このFは略すと文法エラー)
        Console.WriteLine("{0} {1} {2}", work1, work2, work3);
    }
}

p.59 Object.GetTypeメソッド

・C#にはあらゆるプログラム(クラス)の基本的存在としてObject/objectというクラスが用意されている。
・この中に、汎用的なメソッドがあり、その1つがGetTypeメソッド
・GetTypeメソッドは型情報を返すもので、これをConsole.Write/WriteLineなどに与えると.NET型(p.42)を表す文字列がで表示される
・書式: 値または式.GetType() ⇒ 戻り値型はType型だが、Console.Write/WriteLineなどに与えると文字列になる
・例:Console.WriteLine(100.GetType()); ⇒ System.Int32 //100はint型扱いであり、.NET型にするとInt32

アレンジ演習:p.60 literal01.cs

・文字リテラル、文字列リテラル、論理型リテラルも試してみよう

作成例

//アレンジ演習:p.60 literal01.cs
using System;
class literal01
{
    public static void Main()
    {
        string format = "{0}の型は.NET型で{1}です"; //これ以降のWriteLineで用いる書式を事前定義
        Console.WriteLine(format, "100", 100.GetType());
        Console.WriteLine(format, "100U", 100U.GetType());
        Console.WriteLine(format, "100L", 100L.GetType());
        Console.WriteLine(format, "100UL", 100UL.GetType());
        Console.WriteLine(format, "1.25", 1.25.GetType());
        Console.WriteLine(format, "1.25F", 1.25F.GetType());
        Console.WriteLine(format, "1.25M", 1.25M.GetType());
        Console.WriteLine();
        Console.WriteLine(format, "10F", 10F.GetType());
        Console.WriteLine(format, "10D", 10D.GetType());
        Console.WriteLine(format, "10M", 10M.GetType());
        Console.WriteLine();
        Console.WriteLine(format, "-10D", (-10D).GetType());
        Console.WriteLine(); //【以下追加】
        Console.WriteLine(format, "文字", 'A'.GetType());     //System.Char
        Console.WriteLine(format, "文字列", "ABC".GetType()); //System.String
        Console.WriteLine(format, "論理型", true.GetType());  //System.Boolean
    }
}

p.61 暗黙の型指定

・初期化を行う時、初期値によって型が決まる場合は、変数の型指定は不要で代わりに「var」を記述できる。
・例: var i = 100; //100はint型なので「int i = 100;」とみなされる
・なお「var i;」のような宣言のみはエラーになる。
・型の無いリテラル「null」があるが、これは暗黙の型指定には利用できない

アレンジ演習:p.62 var01.cs

・変数noはint型(System.Int32型)になっていることがわかるが、この表示後に文字列などの異なる型の値を代入するとどうなるか
 確認しよう。
・なお、テキストでは「int Main()」となり「return 0;」があるが、このプログラムでは不必要なので、
 今まで通り「void Main()」として良い。「return 0;」は不要。

作成例

//アレンジ演習:p.62 var01.cs
using System;
class var01
{
    public static void Main()
    {
        var mytext = "猫でもわかるC#プログラミング 第"; //string型になる
        var no = 3; //int型になる
        var myc = '版'; //char型になる
        Console.WriteLine(mytext + no + myc); //上記を連結して表示
        Console.WriteLine("mytextの型は{0}で、noの型は{1}で、mycの型は{2}です",
            mytext.GetType(), no.GetType(), myc.GetType()); //型情報を.NET形式で表示
        // no = "ABC"; //noはint型になっているので文字列は代入できない
        // no = 3.14; //実数も代入できない
    }
}

p.62 dynamic型

・var型の進化系で、初期化ではなく宣言で指定できる暗黙の型
・最初の値の代入によって、型が決まる
・よって、実行するまで変数型が確定できない場合に便利
・例: dynamic d; d = 100; //dはint型(Int32)と見なされる
・もちろん、var型と同様に初期化で用いることも可能
・利用には、VS(VC++)のプロジェクトの参照設定に追加が必要
 ①プロジェクトエクスプローラの「参照」を右クリックし「参照の追加」
 ②参照マネージャで「Microsoft.CSharp」のチェックをオンにして「OK」

アレンジ演習:p.62 var01.cs

・変数zはdouble型(System.Double型)になっていることがわかるが、この表示後に文字列などの異なる型の値を代入するとどうなるか
 確認しよう。
 ⇒varとは異なりエラーにはならず、型が変化する
・なお、テキストでは「int Main()」となり「return 0;」があるが、このプログラムでは不必要なので、
 今まで通り「void Main()」として良い。「return 0;」は不要。

作成例

//p.63 dynamic01.cs
using System;
class Dynamic01
{
    public static void Main()
    {
        dynamic x = 10, y = "abc", z; //xはint、yはstring型になるが、zは未定
        z = 1.25; //zはdouble型になる
        Console.WriteLine("x ---- {0}", x.GetType());
        Console.WriteLine("y ---- {0}", y.GetType());
        Console.WriteLine("z ---- {0}", z.GetType()); //System.Doubleなのだが
        z = "ABC"; //【以下追加】文字列を代入可能
        Console.WriteLine("z ---- {0}", z.GetType()); //System.Stringになっている
    }
}

p.64 3.11 スコープ

・変数はこれを宣言したブロックおよびその内側のブロックから利用可能で、この範囲のことをスコープという
・スコープは基の意味は「視野」だがこの場合「有効範囲」のこと
・なお、{}にブロックはプログラマが自由に指定できるので、変数のスコープを制限できる
・しかし、C#ではスコープが異なっても同じ変数名は使えないので(C/C++では使えるが)、任意のブロックによる変数のスコープの
 制限はあまり意味がない。

アレンジ演習:p.64 scope01.cs

・スコープの外で変数を用いるとどういうエラーになるか確認しよう
・確認したらコメントアウトすること

作成例

//p.64 scope01.cs
using System;
class scope01
{
    public static void Main()
    {
        int a = 10;
        Console.WriteLine("a = {0}", a);
        {
            int b = 5;
            Console.WriteLine("a = {0}, b = {1}", a, b);
            {
                int c = 1;
                Console.WriteLine("a = {0}, b = {1}, c = {2}", a, b, c);
            }
            //ここではcは見えません
            Console.WriteLine("a = {0}, b = {1}", a, b);
            //c = 5; //「ここには存在しない」エラーになる
        }
        //ここでは、b,cは見えません
        Console.WriteLine("a = {0}", a);
        //b = 100; //「ここには存在しない」エラーになる
    }
}

p.65 3.12 型変換

・型の値の範囲が狭いものを「型が小さい」広いものを「型が大きい」という
・型が小さいものから、型が大きいものへの代入では「暗黙の型変換」が行われ、大きい方の型に変換してから代入される
・型が大きいものから、型が小さいものへの代入はエラーになる
・しかし、プログラマの責任において行いたい場合は「型キャスト」によって可能になる
・書式: (型名)式または値
・例: long a = 2; byte b; b = (byte)a; //aはlong型だがbyte型に強制変換して代入せよ

アレンジ演習:p.66 cast01.cs

・整数型からdouble型への型キャストが可能かを確認しよう
・整数型からdecimal型への型キャストが可能かを確認しよう
・整数型からchar型への型キャストが可能かを確認しよう
・整数型からstring型への型キャストが可能かを確認しよう
・整数型からbool型への型キャストが可能かを確認しよう

作成例

//p.66 cast01.cs
using System;
class cast01
{
    public static void Main()
    {
        long a = 33;
        byte b;
        b = (byte)a; //long型からbyte型にキャストすればbyte型変数に代入可能
        double w1 = (double)b;    //byte⇒doubleの型キャストはOK
        decimal w2 = (decimal)b;  //byte⇒decimalの型キャストはOK
        char w3 = (char)b;        //byte⇒charの型キャストはOK(文字コードが33の文字!になる)
        //string w4 = (string)b; //byte⇒stringの型キャストは文法エラーになる
        //bool w5 = (bool)b;     //byte⇒boolの型キャストは文法エラーになる
        Console.WriteLine("w1 = {0} w2 = {1} w3 = {2}", w1, w2, w3); //2 2 !
    }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です