・p.62「Dynamic型」から
提出フォロー:アレンジ演習:p.56 escape01b.cs
・4つある変数をすべてvar型にして動作を確認しよう
作成例
//アレンジ演習:p.56 escape01b.cs
using System;
class escape01
{
public static void Main()
{
var n = '\n'; //【変更】文字変数を改行文字で初期化(char型)
var str1 = "今日は"; //【変更】文字列変数(string型)
var str2 = "よい天気です"; //【変更】〃(string型)
Console.WriteLine(str1 + n + str2); //文字列と改行文字を連結すると文字列になる
var str3 = "今日は\nよい天気です"; //【変更】途中に改行文字のある文字列(string型)
Console.WriteLine(str3); //表示すると途中で改行する
Console.WriteLine("\"Let's Go\"は\\1000です"); //「\"」「\\」が必要
}
}
p.62 dynamic型
・var型は初期化が必要で、初期化に用いた値の型によって型が決まる
・よって、型が未定義状態にはならない。
・型を未定義状態にしておいて、代入によって決まるようにするのがdynamic型
・VS2022での利用には、ソリューションエクスプローラーで「参照」を右クリックし「参照の追加」で参照マネージャを起動。
「Microsoft CSharp」のチェックをオンにして「OK」
p.63 dynamic01.cs
//p.63 dynamic01.cs
using System;
class Dynamic01 {
public static void Main() {
dynamic x = 10, y = "abc", z; //dynamic型の変数は初期化しなくても良い
z = 1.25; //代入によって型を定めることもできる
Console.WriteLine("x ---- {0}", x.GetType()); //System.Int32(int)
Console.WriteLine("y ---- {0}", y.GetType()); //System.String(string)
Console.WriteLine("z ---- {0}", z.GetType()); //System.Double(double)
}
}
アレンジ演習:p.63 dynamic01.cs
・初期化も代入もしていないdynamic型の変数にGetType()を行うとどうなるか確認しよう
・また、初期化または代入の後のdynamic型の変数に、型の違う値を代入するとどうなるか確認しよう
・加えて、nullを代入し、表示とGetType()を行うとどうなるか確認しよう
作成例
//アレンジ演習:p.63 dynamic01.cs
using System;
class Dynamic01 {
public static void Main() {
dynamic x = 10, y = "abc", z; //dynamic型の変数は初期化しなくても良い
//Console.WriteLine("z ---- {0}", z.GetType()); //【追加】初期化も代入もしてないのでエラーになる
z = 1.25; //代入によって型を定めることもできる
Console.WriteLine("x ---- {0}", x.GetType()); //System.Int32(int)
Console.WriteLine("y ---- {0}", y.GetType()); //System.String(string)
Console.WriteLine("z ---- {0}", z.GetType()); //System.Double(double)
//【以下追加】
x = "ABC"; //初期化済みのdynamic型の変数に型が異なる値を代入できる
Console.WriteLine("x ---- {0}", x.GetType()); //System.String(string)に代わっている
z = 'Z'; //代入によって型を変えることもできる
Console.WriteLine("z ---- {0}", z.GetType()); //System.Char(char)に代わっている
y = null; //nullを代入できるが…
Console.WriteLine("y ---- {0}", y); //なにも表示されない
Console.WriteLine("y ---- {0}", y.GetType()); //異常終了する
}
}
p.64 スコープ
・スコープは「視野」のことで、C#では変数などの有効範囲のこと
・「{」から「}」までをブロックという
・なお、classの「{」がクラスのブロックの開始で、Main()の「{」がMainのブロックの開始であり、最後の2つの「}」で
それぞれのブロックの終わりを示す
・なお、必要に応じて、Main()の「{」から「}」のブロックの中に、さらにブロックを何重にも作成できる
・変数などの有効範囲は自分が定義されたブロックの中のみ
・C/C++などとはC#ではスコープが異なっても同じ名の変数は定義できない(移植時に注意)
p.65 型変換
・その型で扱える範囲が広いことを「型が大きい」といい、反対を「型が小さい」という
・「型が大きい」変数へ「型が小さい」変数や値を代入すると、大きい方に合わせた形で解釈され、無条件に代入可能。
例: short s = 5; int i = s; //「型が小さい」short型から「型が大きい」int型への代入なのでOK
・これは値の大きさとは無関係で、例えば、long型の2はshort型に代入可能に思われるがエラーになる
・この場合は、型キャストを行って強制的に型変換させることも可能
・書式: (型)式や値
例: long s = 5; short i = (short)s; //変数sの値をshort型に変換してから初期値とする
※ 型キャストが正しいかどうかはプログラマの責任で行う(コンパイラは警告しないことがある)。
※ 文字列型から整数型や実数型への型変換はキャストでは不可なので、parseメソッドを用いること(p.45)
p.66 cast01.csについて
・このプログラムは実行しても何も表示されない
アレンジ演習:p.66 cast01.cs
・aの値をbyte型の範囲を超える値にすると、どうなるか確認しよう
・また、キャストによって、元の変数の型は変わらないことを確認する処理を追記しよう
作成例
//アレンジ演習:p.66 cast01.cs
using System;
class cast01 {
public static void Main() {
long a = 500; //aの値をbyte型の範囲(0~255)を超えるものにしても
byte b;
b = (byte)a; //byte型へのキャストは可能だが
Console.WriteLine("b = {0}", b); //244になってしまう(異常終了はしない)
Console.WriteLine("aの型は{0}", a.GetType()); //System.Int64(long)で変わらない
}
}
p.66 列挙型
・一連の整数値に名前をつけて扱う仕掛けが列挙で、グループの名前にあたるのが列挙名、グループのメンバーにあたるのが列挙子。
・定義書式: enum 列挙名 { 列挙子,… } //int型の列挙
・「列挙名:型」とすることで、sbyte、byte、short、ushort、uint、long、ulong型の列挙を定義することもできる列挙子
・列挙子には順に0から+1ずつ番号が振られるが「列挙子 = 整数」で任意の値に設定できる
・例:enum tuka { ichiendama = 1, goendama = 5, juendama = 10 };
・利用側は「列挙名.列挙子」で値を扱うことができる
・例:Console.WriteLine("5円玉は{0}", (int)tuka.goendama);
・C#やUnityが提供する特別な数値において、列挙型が用いられることが多い
例:ConsoleColor 列挙型 { Black, DarkBlue, DarkGreen, DarkCyan, … }を色名して利用(p.106)
・列挙子のデータ型は列挙型になるので、整数としてあつかう時は型キャストすること
例:Console.WriteLine("Blackの値は{0}", (int)ConsoleColor.Black);
p.68 enum01.cs
//p.68 enum01.cs
using System;
class enum01
{
enum MyMonth { //月名の列挙の定義
Jan = 1, Feb, Mar, Apr, May, Jun, Jul,
Aug, Sep, Oct, Nov, Dec
};
public static void Main() {
Console.WriteLine("Aprは{0}月", (int)MyMonth.Apr); //型キャストすると4になる
Console.WriteLine("Mayは{0}月", (int)MyMonth.May); //型キャストすると5になる
}
}