オブジェクトのプロパティ プロパティとは? あたかもそういうメンバー変数(フィールド)がそのクラスに存在するかのように見せる仕組み! メソッド(関数)の定義みたいだけど,( )も引数も無い → プロパティの定義 プロパティとは? あたかもそういうメンバー変数(フィールド)がそのクラスに存在するかのように見せる仕組み! class Time { private int min; public void Add(Time t) { ・・・ } //省略 public void Input() public void Write() public int Minute get { return min%60; } set { int h = min/60; min = h * 60 + value; } public int Hour get { return min/60; } int m = min%60; min = value * 60 + m; 今,何時かな? 13 今,何分かな? 85 今の時刻は14:25で~す. class lecture5 { static void Main() Time t = new Time(); Console.Write("今,何時かな? "); t.Hour = int.Parse(Console.ReadLine()); Console.Write("今,何分かな? "); t.Minute = int.Parse(Console.ReadLine()); Console.WriteLine("今の時刻は{0}:{1}で~す", t.Hour, t.Minute); } オブジェクトから値を得るのはget Minuteプロパティの定義 Timeクラスのメンバー変数HourとMinuteみたいだけど・・・ だが,改良型Timeクラスにはメンバー変数はminだけ!! Hour, Minute → プロパティ オブジェクトに値を設定するのはset Hourプロパティの定義 代入文の右辺ではgetプロパティ 代入文の左辺ではsetプロパティ x = t.Hour; 右辺の値13はキーワードvalueに入る t.Hour = 13;
静的メンバ(静的メソッド) 通常のメンバ(通常のメソッド) 静的メンバ(静的メソッド) 通常のメソッド 静的メソッド 静的メソッドの例 インスタンスの宣言 ↓ インスタンスがメモリ上に 作成される インスタンスのメンバー変数が using System; class Complex { // ・・・省略・・・・ public void Method1() { ・・・ } public static void Method2() } 通常のメンバ(通常のメソッド) 静的メンバ(静的メソッド) インスタンスのメンバー変数 に関する処理 通常のメソッド インスタンス(クラス変数)に対して呼び出す インスタンスを宣言する前には呼び出せない 静的メソッド クラスに対して呼び出す インスタンスを宣言しなくても呼び出せる (インスタンスに対して呼び出すとエラーになる) class lecture5 { static void Main() { Complex z1 = new Complex(2.0, 10.0); Complex.Method1() z1.Method1(); Complex.Method2(); z1.Method2(); } } インスタンスのメンバー 変数に関係ない処理 静的メソッドの例 Console.WriteLine() → Consoleクラスの静的メソッド Math.Sqrt(double x) → Mathクラスの静的メソッド
演算子オーバーロード 演算子オーバーロード コンパイラは というソースを, という関数呼び出しと解釈 する z2←z2+z1 using System; class Complex { // ・・・省略・・・ public void Add(Complex a) { this.Real = this.Real + a.Real; this.Imag = this.Imag + a.Imag; } public static Complex Add(Complex a, Complex b) Complex z = new Complex(); z.Real = a.Real + b.Real; z.Imag = a.Imag + b.Imag; return z; public static Complex operator+(Complex a, Complex b) } class lecture5 { static void Main() { Complex z1 = new Complex(2.0, 10.0); Complex z2 = new Complex(-1.5, 10.2); Complex z3 = new Complex(); z2.Add(z1); z3 = Complex.Add(z1, z2); z3 = z1 + z2; } } z2←z2+z1 z3←z1+z2 演算子オーバーロード コンパイラは z3 = z1 + z2; というソースを, z3 = operator+(z1, z2) という関数呼び出しと解釈 する
C#における配列 要素数10のint型配列の宣言 a[0], a[1], a[2], ・・・, a[9] インデックスは 0 から(要素数-1)まで using System; class kadai61 { public static void Main() { int[] a = new int[10] ; int i; for (i = 0; i < 10; i++) a[i] = i*3; Console.Write("a[{0}] = {1} ", i, a[i]); Console.WriteLine(); } } // C言語だったら int a[10]; a[0] = 0 a[1] = 3 a[2] = 6 a[3] = 9 a[4] = 12 a[5] = 15 a[6] = 18 a[7] = 21 a[8] = 24 a[9] = 27 Press any key to continue
配列の初期化と定義 配列の初期化 重要:C#の配列宣言では要素数として変数を指定できる.これはCではできなかった. using System; class kadai61 { public static void Main() { int[] a = new int[] { 3, 6, 9, 12 } ; int i; for (i = 0; i < 4; i++) Console.Write("a[{0}] = {1} ", i, a[i]); Console.WriteLine(); } } 配列の初期化 // C言語だったら int a[10] = { 3, 6, 9, 12 }; a[0] = 3 a[1] = 6 a[2] = 9 a[3] = 12 Press any key to continue int n; n = int.Parse(Console.ReadLine()); // 要素数を入力 int[] a = new int[n]; // その要素数で配列宣言 重要:C#の配列宣言では要素数として変数を指定できる.これはCではできなかった. → C#ではダイナミックに配列要素数を決めることができる.
2次元の配列 2次元配列の定義 int[,] は2次元の配列を表わす int[4,3]は3行4列の行列と考えればよい using System; class kadai61 { public static void Main() { int[,] a = new int[4,3]; int i, j; for (j = 0; j < 3; j++) for (i = 0; i < 4; i++) a[i, j] = (i+j) * 3; { Console.Write("a[{0}, {1}] = {2} ", i, j, a[i, j]); Console.WriteLine(); } } } a[0,0] a[1,0] a[2,0] a[3,0] a[0,1] a[1,1] a[2,1] a[3,1] a[0,2] a[1,2] a[2,2] a[3,2] a[,,] は3次元の配列 a[0, 0] = 0 a[1, 0] = 3 a[2, 0] = 6 a[3, 0] = 9 a[0, 1] = 3 a[1, 1] = 6 a[2, 1] = 9 a[3, 1] = 12 a[0, 2] = 6 a[1, 2] = 9 a[2, 2] = 12 a[3, 2] = 15 Press any key to continue
C#における配列の真実 注目! 配列aのプロパティ? Yes,配列はプロパティを持っている ↓ C#の配列は実は オブジェクトだ! using System; class kadai61 { public static void Main() { int[] a = new int[10] ; int i; for (i = 0; i < 10; i++) a[i] = i*3; Console.Write("a[{0}] = {1} ", i, a[i]); Console.WriteLine(); Console.WriteLine("配列aの長さは{0}である.", a.Length ); } } a[0] = 0 a[1] = 3 a[2] = 6 a[3] = 9 a[4] = 12 a[5] = 15 a[6] = 18 a[7] = 21 a[8] = 24 a[9] = 27 配列aの長さは10である. Press any key to continue
Arrayクラス C#における配列はArrayクラスのオブジェクト Arrayクラスで定義されているメソッド,プロパティを用いることができる Length : 配列の長さを取得する a.Length → 10 (2次元以上の場合は全ての次元の長さの合計) Rank : 配列の次元を取得する a.Rank → 2 メソッド GetLength() : 指定した次元の配列の長さを返す GetUpperBound() : 指定した次元のインデックスの上限を返す 静的メソッド Reverse() : 1次元配列の要素の並びを逆転させる 以上は一例.その他たくさんのメンバーが定義されている
配列のプロパティやメソッドの使用例 0番目の次元の長さが8 1番目の次元の長さが5 静的メソッドのため,頭にクラス名が必要 using System; class kadai6 { public static void Main() { int[] a = new int[] { 3, 10, 2, -3, 6 }; int[,] b = new int[8,5]; Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}", a.Length, b.Length, b.GetLength(0), b.GetLength(1), b.GetUpperBound(0), b.GetUpperBound(1)); int i; for (i = 0; i < a.Length; i++) Console.Write("{0} ", a[i]); Console.WriteLine(); Array.Reverse(a); } } 0番目の次元の長さが8 1番目の次元の長さが5 ループでこのような書き方が出来る.実際の配列の長さを気にしなくてよいので便利 静的メソッドのため,頭にクラス名が必要 5, 40, 8, 5, 7, 4 3 10 2 -3 6 6 -3 2 10 3 Press any key to continue
もっと詳しくArrayクラスについて調べるには → キーワード検索 (3) 「検索する文字列」に「Array」を入力 (2) 「フィルタ条件」を「Visual C#および関連項目」にする (4) 表示されるリスト中から一つのトピックスを選ぶ (1) 「キーワード」タブをポイントする
C#言語の変数の型 char sbyte 1 unsigned char byte short 2 int 4 unsigned int 値の範囲 サイズ (バイト) 説明 char sbyte -128~127 1 ANSI文字,または小さな数値 unsigned char byte 0~255 符号無し.ANSI文字,または小さな数値 short -32768~32767 2 小さな数値 Unicode文字(日本語もOK) int -2147483648 ~2147483647 4 一般的な整数値 unsigned int uint 0~4294967295 符号無しのint long 基本的にintと同じ -9223372036854775808 ~9223372036854775807 8 巨大な整数値 float ±1.5x10-45~±3.4x1038 単精度浮動小数点(実数値).有効桁数7桁 double ±5.0x10-324~±1.7x10308 倍精度浮動小数点(実数値).有効桁数15 ~ 16 桁 decimal ±1.0x10-28~±7.9x1028 16 有効桁数 28 ~ 29桁の高精度実数値 string Unicode文字の文字列(日本語OK) bool true または false 真 と 偽 を表わす型 注) C言語の変数のサイズや値の範囲は,コンパイラや実行するCPUによって変わってくる.上の値は32bit CPUでの値.
文字列を表わすstring型 string型の変数宣言. 同時に初期化も行っている. 日本語OK. stringはオブジェクト. Lengthプロパティで文字列の長さを取得. '+'演算子はオーバーロードされている. 文字列を連結する. '=='演算子もオーバーロードされている. 文字列が全く同じならtrueになる. using System; class kadai6 { public static void Main() { string s1 = "今日は"; string s2 = "基礎計算機演習の"; string s3 = "日だ"; Console.WriteLine("文字列「{0}」は{1}文字だ", s1, s1.Length); string s4; s4 = s1 + s2 + s3; Console.WriteLine("全部あわすと「{0}」", s4); if (s1 == s2) Console.WriteLine("同じ文字列"); else Console.WriteLine("違う文字列"); } } 文字列「今日は」は3文字だ 全部あわすと「今日は基礎計算機演習の日だ」 違う文字列 Press any key to continue
stringクラスのメンバ例 以上は,ごく一部のメンバを示した.詳しくはStringをキーワード検索 種類 名前 説明 プロパティ Length 文字列の長さを取得する メソッド CompareTo() 二つの文字列を比較する Insert() 文字列に他の文字列を挿入するために使う Remove() 指定位置から指定した数の文字を削除 静的メソッド Format() {0}の書式を使って数値データなどの他の要素を文字列化する Concat() 二つの文字列を結合した新しい文字列を返す 演算子 + == 二つの文字列が同じならtrueを返す != 二つの文字列が同じでなければtrueを返す 以上は,ごく一部のメンバを示した.詳しくはStringをキーワード検索
C#言語の変数の真実 → すべての変数はオブジェクト クラスのメンバを詳しく知るためにはクラス名をキーワード検索 C言語 C#言語 クラス/構造体名 説明 char sbyte Sbyte ANSI文字,または小さな数値 unsigned char byte Byte 符号無し.ANSI文字,または小さな数値 short Int16 小さな数値 Char Unicode文字(日本語もOK) int Int32 一般的な整数値 unsigned int uint UInt32 符号無しのint long 基本的にintと同じ Int64 巨大な整数値 float Float 単精度浮動小数点(実数値).有効桁数7桁 double Double 倍精度浮動小数点(実数値).有効桁数15 ~ 16 桁 decimal Decimal 有効桁数 28 ~ 29桁の高精度実数値 string String Unicode文字の文字列(日本語OK) bool Boolean 真 と 偽 を表わす型 例えば,intはInt32の別名である
int型のメンバの利用例 静的・・・ は頭にクラス名が必要 intの静的プロパティ int.MaxValue, int.MinValue 静的・・・ は頭にクラス名が必要 using System; class kadai6 { public static void Main() { Console.WriteLine("int型の最大値は{0},最小値は{1}だ", int.MaxValue, int.MinValue); int x; x = int.Parse("1232"); string s; s = Console.ReadLine(); x = int.Parse(s); } } intの静的メソッド int int.Parse(string s) 文字列sをint型の数値に変換して返す Consoleクラスの静的メソッド stirng Console.ReadLine() コンソールから一行分の文字列を入力して返す この2行をまとめて書くと x = int.Parse(Console.WriteLine()) となる.