Month: July 2025

前回のコメント

・ガベージコレクションやデストラクションですが、つまりは今までに扱ってきたC#コード内でもすでに自動的に実行されていたということでしょう  ガベージコレクションは実行中にメモリ不足が懸念される場合に実行されますので、  入門編のような小さなプログラムではあまり実行されていないかもしれませんが、  実行されている可能性もあります。  デストラクタについては、newによる生成を行ったプログラムの終了時には必ず実行されています。 ・「this」は今回紹介していただいた応用例の他には、これといった使い道はないのでしょうか。  後日、学習する「インデクサ」が大きな用途の一つです。  また、今回は構文説明の都合で割愛しましたが、コンストラクタからコンストラクタを呼ぶことができます。  この件は、次回フォローしますね。

講義メモ 後半

p.171(ガベージコレクション) ・プログラムの中で生成されたオブジェクトは、基本的に終了時に破棄される ・言語によっては、プログラムの中で動的に記憶領域を確保したり破棄できるものもある ・しかし、C#などでは、オブジェクトの生成のみが可能で、プログラム側で破棄することはできない ・そこで、C#などでは、オブジェクトを参照する変数を無くすることで、オブジェクトの利用を終了したことを、システムに示すことができる ・システムは定期的な監視により、利用が終了したオブジェクトを破棄する。これをガベージコレクションという ・例:MyClass a = new MyClass(), b = new MyClass(); a = b; //最初にa用に生成したオブジェクトは破棄対象 ・例:MyClass a = new MyClass(), a = null; //a用に生成したオブジェクトは破棄対象 ・この仕組みを理解することで、非常に多くのデータを用いる処理において、使っていないオブジェクトが終了時まで残ってしまうことを  防止できる。 p.171 デストラクタ ・オブジェクトの生成時に呼ばれるコンストラクタとは逆に、オブジェクトの破棄時に呼ばれるのがデストラクタ ・デストラクタはオブジェクトの生成時に中身が空のものが自動生成されて呼び出されるが、プログラマの記述も可能 ・ただし、直接呼び出したり、動作タイミングを制御することはできず、システム任せになる ・よって、主に、後始末に用いると良い ・定義書式: ~クラス名(){…} ・デストラクタはコンストラクタと同様に、戻り値はない(voidの指定も不可) ・しかも、引数も指定できないので、オーバーロードもできない ・プログラムの終了時のように複数のオブジェクトが破棄される時、すべてのデストラクタが確実に実行されるが、その実行順序は不定であり、  プログラムから知ることもできない アレンジ演習:p.173 destruct01.cs ・変数dt2、dt3を用いずに、3つのオブジェクトを全て変数dt1で扱うとどうなるか確認しよう ⇒ 動作はアレンジ前と変わらない ・タイミングを見るために「Console.ReadLine();」を末尾に入れて、表示を確認後、Enterキーを入力して終了させよう 作成例 //アレンジ演習:p.17 destruct01.cs using System; class DestructTest {     int x;     // デストラクタ     ~DestructTest() {         Console.WriteLine("デストラクタが呼ばれました");         Console.WriteLine("xは{0}です", x);     }     // 引数付きコンストラクタ     public DestructTest(int n) {         Console.WriteLine("コンストラクタが呼ばれました");         x = n;         Console.WriteLine("xに{0}を代入しました", n);     } } class destruct {     public static void Main() {         //コンストラクタが呼ばれ1を持つオブジェクトを生成         DestructTest dt1 = new DestructTest(1);         Console.WriteLine("dt1生成");         //コンストラクタが呼ばれ2を持つオブジェクトを生成、1を持つオブジェクトは破棄対象になる         dt1 = new DestructTest(2); //【変更】         Console.WriteLine("dt2生成");         //コンストラクタが呼ばれ3を持つオブジェクトを生成、2を持つオブジェクトは破棄対象になる         dt1 = new DestructTest(3); //【変更】         Console.WriteLine("dt3生成");         Console.ReadLine(); //【追加】終了待ち…

Read the full article

講義メモ

・p.166「メソッドを定義しよう(カプセル化)」から再開します アレンジ演習:p.165 noreturnvalue.cs ・5つの「return;」を削除しても動作が変わらないことを確認しよう 作成例 //アレンジ演習:p.165 noreturnvalue.cs using System; class Kakeibo {     private int total = 0; //残高:クラス内部でのみ用いる変数なのでprivateにする     public void nyukin(int en) { //入金メソッド(外部から用いるのでpublicにする)         total += en; //引数で得た入金額を残高に足し込む         Console.WriteLine("{0}円を入金しました", en);         // return; →次の行がメソッドの終端なので、このreturnは不要     }     public void shishutsu(int en) { //支出メソッド(外部から用いるのでpublicにする)         if (total < en) { //引数で得た支出額が残高を超えている?             Console.WriteLine("{0}円も支出できません", en);             // return; →次に実行する行がメソッドの終端なので、このreturnは不要         } else {             total -= en; //引数で得た支出額を残高から差し引く             Console.WriteLine("{0}円を支出しました", en);             // return; →次に実行する行がメソッドの終端なので、このreturnは不要         }     }     public void gettotal() { //残高を表示する(外部から用いるのでpublicにする)         if (total == 0) { //残高が0?             Console.WriteLine("残高はありません");             // return; →次に実行する行がメソッドの終端なので、このreturnは不要         } else {             Console.WriteLine("残高はは{0}円です", total); //残高の表示             // return; →次に実行する行がメソッドの終端なので、このreturnは不要         }     } } class noreturnvalue {     public static void Main() {         Kakeibo k = new Kakeibo();         k.gettotal(); //残高を表示         k.nyukin(1000);         k.gettotal(); //残高を表示…

Read the full article

今週の話題

ゲームソフト販売本数ランキング:今週1位も「マリオカート ワールド(Switch2)」 GO! SIEがPlayStation Studiosタイトルのマルチプラットフォーム展開を推進か?米国向け求人で担当者募集中 GO! バンダイナムコとソニーが戦略的なパートナーシップを締結!マンガ・アニメなど幅広い領域での協業に取り組む GO! ゲーム業界の平均年収ランキングTOP20をSalesNowが公開、バンダイナムコや任天堂を上回った1位の企業は… GO! サ終済みのモバイル向けRPG『BLUE REFLECTION SUN/燦』元公式サイトには接続しないで!第三者がドメイン取得し不審なWebサイトへの誘導設置 GO! Steamでプレイテスト実施中だったゲームにマルウェア混入との告発―該当ストアページは既に閲覧できない状態に GO! Steamストアからの成人向けゲーム削除、7月26日時点でも流れは止まらず…新たに削除されたタイトル多数 GO!

前回のコメント

・5つの「return;」を削除しても動作が変わらないことを確認しました。  了解です。何よりです。 ・privateとpublicはどう使い分けると良いのでしょうか。  基本は「クラス内部でのみ用いるものはprivateに、でなければpublicに」します。  これに加えて、次回学習する「カプセル化」で、privateにすることで、データを適正な状態に保つことを学びます。 ・if文とswich文とdo文は役割が似ているようですが、仮にどれでも使える状況だったとしても、やはり状況に応じて最も適した物を使用したほうが好ましいでしょうか。  if文は条件による分岐に、switch文は値による多分岐に用います。  do文は分岐ではなく繰返し構文です。  よって「仮にどれでも使える状況」ということはあり得ません。  switch文の代わりにif文を用いることはできますが、それ以外は取り換えの難しい構文です。  用途に合わせて使い分けることが肝心です。

講義メモ 後半

p.160 メソッドを定義しよう ・Mainメソッドのような処理(振る舞い)の記述を、実行用ではないクラスにも記述できる ・メソッドは0個以上の情報を得て、なにか処理を行い、0または1個の情報を返すことができる仕掛け ・例: Addメソッドに1と2を渡すと、加算処理が動作して、3を返す ・メソッドの定義書式: アクセス修飾子 戻り値型 メソッド名(引数型 引数名, …){処理内容} ・アクセス修飾子:メソッドをクラスの外から呼び出す場合はpublicを指定(よって、Mainメソッドはpublic)  何も指定しないか、privateを指定すると、内部用になる(クラス内の別のメソッドからは利用可能) ・戻り値型(復帰型)は返す情報のデータ型を記述する。なお、ない場合は voidを指定する(よって、Mainメソッドは基本的にvoid) ・引数:メソッドに渡す情報で、0個以上いくつでも記述でき「データ型 引数名」をカンマつなぎする ・なお、0個の場合はカッコのみ記述する(よって、MainメソッドはMain()が基本) ・処理内容では、戻り値型が指定してある時は「return 値や式;」が必須になり、分岐などを含むときは、どの分岐になっても必ずreturnが  実行される必要がある。 ・外部からメソッドを実行するには、インスタンス変数と同様に「オブジェクト名.メソッド名(…)」とする ・例:  class Monster { //クラスの定義   public int hp; //インスタンス変数の定義   public void showhp() { Console.WriteLine(“HPは{0}”, hp); } //メソッドの定義  }  :  class Game { //実行用クラス   public static void Main() { //実行用の特別なメソッド    Monster slalin = new Monster(); //Monsterオブジェクトを生成してスラリンとする    slalin.hp = 10; //スラリンのインスタンス変数hpに代入    slalin.showhp(); //スラリンのメソッドshowhp()を実行   }  } ・なお、returnの直後は(if-else構文等の場合を除き)実行されないので何かを記述するとエラーになる アレンジ演習:p.161 method01.cs ・2つのint型の引数を受け取り、差をint型で返すSubメソッドを追記しよう ・Main()から、Subメソッドを呼び出して動作を確認しよう ・なお、ローカル変数を経由しないことで、シンプルに記述すること 作成例 //アレンジ演習:p.161 method01.cs using System; class MyClass //クラスの定義 {     public int Add(int x, int y) //int型の2引数を受け取り、int型を返すAddメソッドの定義     {         int z; //ローカル変数(メソッドの中で宣言され、メソッド内のみ有効な作業用の変数)         z = x + y; //2引数の和を求めてローカル変数zに代入         return z; //ローカル変数z経由で和を返す     }     public int Sub(int x, int y) { //【以下追加】int型の2引数を受け取り、int型を返すSubメソッドの定義…

Read the full article

講義メモ

・p.155 簡単なクラスを定義しよう(データメンバの利用)から p.154 簡単なクラスを定義しよう【再掲載】 ・クラスにはデータや実行用のメソッドなどを含むことができる ・ここまで作成したプログラムにおいては、1クラスの中にmainという1つのメソッドが含まれている ・クラスに含まれるデータや実行用のメソッドなどをメンバという ・今まで定義してきた変数はすべてmainメソッドの中だったが、mainメソッドの外に定義することで、変数をクラスのメンバ(データメンバ)に  することができる ・これをクラス変数といい、メソッドとは独立して扱うことができる ・定義書式: アクセス修飾子 データ型 変数名; ・アクセス修飾子はメンバをクラスの外部から利用可能にするかどうか等を指定するもので、publicにすると、外部から利用可能 ・mainメソッドがpublic指定なのは、C#システムから呼び出し可能にするため ・外部から利用可能にする必要がなければ、privateとすることで、クラス内でのみ利用可能にでき、安全性が高くなる ・クラスの定義書式: class クラス名 { メンバの定義; … } ・クラスのメンバはクラス変数のみでも良いので、複数の型が異なる変数をまとめて扱う場合にも有効  ※ C言語における構造体をより強力に実装できる ・クラス変数のみのクラスの例  class Monster { //モンスタークラス(名前とHPとMPをデータメンバとして持つ)   public string name;   public int hp;   public int mp;  } p.155 簡単なクラスを定義しよう(クラスからのオブジェクトの生成)【リライト】 ・クラス変数のうち、インスタンスに属するものをインスタンス変数といい、特例を除き、クラス変数はインスタンス変数にする ・クラスの定義のみでは、基本的に設計図にすぎないので、記述したインスタンス変数の実体はない ・クラスからオブジェクト(インスタンス)を生成することにより、インスタンス変数の実体が用意される ・クラスからオブジェクト(インスタンス)を生成して扱うには、オブジェクトを識別する名前が必要で、これをオブジェクト名または  インスタンス名という ・オブジェクト名は、クラスを型とする変数の扱いになる  例: Monster slarin; //モンスタークラスを型とするオブジェクトslarinの宣言 ・そして、クラスからオブジェクト(インスタンス)を生成するにはnew演算子を用い、生成したオブジェクトをオブジェクト名の変数に代入する  形式になる ・書式: オブジェクト名 = new クラス名(…); //クラスからオブジェクトを生成しオブジェクト名で利用可能にする  例: slarin = new Monster(); //モンスタークラスのオブジェクトを生成し、オブジェクト名slarinで利用可能にする ・変数の初期化と同様に、オブジェクト名の宣言とオブジェクトの生成は同時に行える ・書式: クラス名 オブジェクト名 = new クラス名(…); //クラスからオブジェクトを生成しオブジェクト名で利用可能にする p.155 簡単なクラスを定義しよう(データメンバの利用) ・これにより、インスタンス変数の実体が生成され「オブジェクト名.インスタンス変数名」で利用可能になる  例: slarin.name = “スラリン”; slarin.hp = 5; slarin.mp = 10; ・このドットは「の」のイメージで、ドット演算子ともいう アレンジ演習:p.156 simpleclass.cs ・インスタンス変数としてdouble型のyを追加し、Mainメソッドにyを扱う処理を追記しよう 作成例 //アレンジ演習:p.156 simpleclass.cs using System; class myclass //プログラマによる自前のクラスの定義 {     public int x; //メンバ:インスタンス変数     public double y; //【追加】メンバ:インスタンス変数…

Read the full article

今週の話題

ゲームソフト販売本数ランキング:今週1位も「マリオカート ワールド(Switch2)」 GO! GameWithは四半期黒字転換に成功、ゲームエイトは成長限界が見えたか?【ゲーム企業の決算を読む】GO! クリエイター向けマーケット「BOOTH」、AI生成作品への対応を強化―著作権侵害や大量出品にアカウント停止を含む厳格対処 GO! 相次ぐSteam成人向け削除は「クレジット決済代行業者や銀行の要請によるもの」Valve、弊誌らに回答 GO! 『妖怪ウォッチ』偽通販サイトに注意!レベルファイブが「一切関係ございません」として注意喚起 GO!