講義メモ ・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 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 ! } } p.66 列挙型 ・整数値に名前を付けてグループにて型にしたもの。 ・例: グーは0番、チョキは1番、パーは3番とするとき「次の手 = 0」とするより「次の手 = グー」とした方が分かりやすく、可読性が上がる ・このグループ名を列挙名、要素を列挙子という ・C#が提供するライブラリの中にも列挙型があり、広く用いられている  例: https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.keys Keys列挙型 ・書式: enum 列挙名 { 列挙子, … } ・列挙子には自動的に0から整数があてはめられるが、代入も可能 ・書式: enum 列挙名 { 列挙子 = 整数値, … } ・「 = 整数値」を指定しない場合、先頭は0、それ以降は1っ前の列挙子の値+1になる。 アレンジ演習:p.68 enum01.cs ・列挙子をint型にキャストせずに表示するとどうなるか確認しよう  ⇒ 列挙子がそのまま表示される ・列挙子の持つ整数をint型の変数に代入できるかどうか確認しよう 作成例 //アレンジ演習:p.68 enum01.cs using System; class enum01 { enum MyMonth { //列挙名 MyMonthの定義 Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec //先頭が1なので2,3,4,5,…,12になる }; public static void Main() { //列挙子の持つ整数をint型として扱うにはキャストする Console.WriteLine("Aprは{0}月", (int)MyMonth.Apr); //Aprは4月 Console.WriteLine("Mayは{0}月", (int)MyMonth.May); //Mayは5月 Console.WriteLine("Aprは{0}", MyMonth.Apr); //【追加】AprはApr int x = (int)MyMonth.Apr; //【追加】int型変数への列挙子の代入にも型キャストが必要 } } p.69 3.14 オブジェクト型とボックス型:割愛し「第7章 クラス」「第6章 配列」で説明します p.73 3.15 文字列型 ・文字列は0文字以上の文字がならんだもので、文字数は確定しない ・文字列はstring型(.NETではSystem.String型)で扱える ・C#では文字列を(後述する)クラスで扱うので、文字数を得たり、比較したり、コピーしたりするための仕掛(プロパティ、文字配列、メソッド)が用意されている ・ここではクラス、プロパティ、配列、メソッドの詳細は後回しにして、便利な仕掛を理解しておこう アレンジ演習:string01.cs ・コンソールに「文字列:」と表示し、文字列を入力したら、何文字あるか表示する処理を追加しよう 作成例 //アレンジ演習:p.73 string01.cs using System; class string01 { public static void Main() { string str = "今日はよい天気です"; string mystr; char c; // Lengthプロパティ(後述)で文字列の長さを調べる Console.WriteLine("strは長さ{0}です", str.Length); //文字型変数cに文字列strの5番目の文字を代入 c = str[4]; //文字列を文字の配列(後述)として扱える Console.WriteLine("文字列の5番目の文字は「{0}」です", c); //文字列strをmystrにコピー mystr = String.Copy(str); //静的メソッド(後述)を用いる Console.WriteLine("mystr = {0}", mystr); //文字列の検索 int n = str.IndexOf('は'); //メソッドに文字を与えて用いる Console.WriteLine("文字列に'は'が出てくるのは{0}番目の文字", n + 1); n = str.IndexOf("よい"); //メソッドに文字列を与えて用いるオーバーロード(後述) Console.WriteLine("文字列に「よい」が出てくるのは{0}文字目から", n + 1); //【以下追加】 Console.Write("文字列:"); string name = Console.ReadLine(); Console.WriteLine("{0}は{1}文字です。", name, name.Length); } } p.75「is演算子とas演算子」は割愛します p.78 練習問題1 ヒント ex0301.cs ・うるう年を考えないので、1年の秒数は60秒×60分×24時間×365日で算出できる 作成例 //p.78 練習問題1 ex0301.cs using System; class ex0301 { public static void Main() { Console.WriteLine("1年は{0}秒", 60 * 60 * 24 * 365); } } 提出:p.78 練習問題2 ヒント ex0302.cs ・