前回から引き続き、C#でWindows OSを時間指定してシャットダウンするアプリケーションを作成していきます。
アプリの最終的な完成イメージは以下の動画の通りです。
時間、分、秒を設定して、シャットダウンまでの時間を任意に指定、キャンセルすることができます。
前回までの記事で必要な機能は実装できている状態なので、今回もプログラムを改良していきます。
第4回目となる今回は『クラス』の使い方をご紹介します。
簡単なプログラムを徐々にステップアップさせていきますので、その過程でプログラミングに必要な基礎知識を身につけることができます。
作業時間としては30~60分程度です。
説明中の見えにくい画像はクリックすることで拡大できます。
前回作成したアプリ、今回作成するアプリ
前回は『秒換算する関数を作成 』までをプログラミングしました。
今回は『シャットダウン機能をまとめたクラス』を作成します。
プログラミングを始めたばかりの方にクラスは難しい概念かもしれませんが、クラスは一度作ってしまえば移植が楽になったり、プログラムコードがシンプルで読みやすくなったりと、多くのメリットがあります。
慣れないうちは、クラスは変数や関数をまとめたものという程度で使ってみましょう。
今回はコーディングと解説を交互に行って、クラスを作成する過程を解説していきます。
基本的にはこれまでの記事で作成してきたものをクラスとしてまとめるだけですので、比較的理解しやすいかと思います。
クラスに関連する用語もいくつか登場しますが、これらもすぐに覚える必要はありません。
まずはクラスの使い方を理解して、これまでのプログラムコードがシンプルに記述できるようになることを実感してみてください。
前回の続きから機能を追加していくので、アプリをまだ作成していない場合は、以下のリンクを参考に作成してください。
フォームのレイアウト
今回はフォームのレイアウト変更はありません。
前回のレイアウトをそのまま使用します。
プログラミング
それではプログラミングを行います。
プログラムコードを表示するには、画面右側の[ソリューションエクスプローラー]の[Form1.cs]を右クリックして[コードの表示]を選択するか、もしくはF7キーを押します。
今回はプログラムの入力と解説を交互にしていきます。
ShutDownクラスを定義
まずは『class Form1』と同列の場所にクラスと呼ばれるコードを追加します。
追加する場所は次を参考にしてください。
namespace ShutDownApp
{
public partial class Form1 : Form
{
public Form1()
{
// 【省略】
}
private void b_Shutdown_Click(object sender, EventArgs e)
{
// 【省略】
}
private void b_Cancel_Click(object sender, EventArgs e)
{
// 【省略】
}
private int MinToSec(int time_m)
{
// 【省略】
}
private int HourToSec(int time_h)
{
// 【省略】
}
}
//【ここに今回のclassを追加】
}
クラスの名前は『ShutDown』として、これまで作ってきたシャットダウンに関する機能をすべてこのクラスに任せるような仕様にしていきます。
まずは次のように記述しましょう。
internal class ShutDown
{
}
『internal』は前回関数の解説で触れた『private』と同じくアクセス修飾子と呼ばれるものです。
ここではまだ気にする必要はありません。
Processクラスを用意
次に、これまでも『shutdown.exe』を実行するために使ってきたProcessクラスを定義したいのですが、これまで作成してきたアプリのように記述すると次のようになります。
internal class ShutDown
{
System.Diagnostics.Process ShutDownProc
= new System.Diagnostics.Process();
}
これでも問題なく機能するのですが、少し長ったらしいので省略して記述します。
プログラムコードの先頭に並ぶ『using』の中に次の一行を追加してください。
using System.Diagnostics;
これでプログラム内の『System.Diagnostics』は省略できるようになります。
クラス『ShutDown』の中も次のように記述できます。
internal class ShutDown
{
private Process ShutDownProc = new Process();
}
コンストラクタを記述
次にProcessクラスで『shutdown.exe』を使うことを記述します。
internal class ShutDown
{
private Process ShutDownProc = new Process();
public ShutDown()
{
ShutDownProc.StartInfo.FileName = "shutdown.exe";
}
}
『public ShutDown()』は、今回作成している『ShutDown』クラスを実態として使う際、最初に自動実行される関数です。
後ほど『ShutDown』クラスを実際に使用するときに再度説明するので、ここでは深く考えずに、最初に自動実行される関数という程度の認識で大丈夫です。
ちなみに、このようにクラスの中で定義された関数を『メソッド』と呼び分けたりします。
そしてこの最初に自動実行されるメソッドのことを『コンストラクタ』と呼びます。
実際に使ってみないことにはよくわからないと思うので今すぐ呼び方を暗記する必要はありません。
使いながら徐々に慣れていってください。
ここではシャットダウンを時間指定する際と、シャットダウンをキャンセルする際に共通して使う
ShutDownProc.StartInfo.FileName = "shutdown.exe";
を最初にまとめて記述する目的で、コンストラクタ『public ShutDown()』の中に記述しました。
『shutdown.exe』の使い方については、以前ご紹介しているので、忘れた方は次の記事を参考にしてください。
クラス内で使用するメソッドを用意
次に前回作成した関数『MinToSec』『HourToSec』を、『ShutDown』クラスの中に移動します。
internal class ShutDown
{
private Process ShutDownProc = new Process();
public ShutDown()
{
ShutDownProc.StartInfo.FileName = "shutdown.exe";
}
// ここから追加
private int MinToSec(int time_m)
{
return time_m * 60;
}
private int HourToSec(int time_h)
{
return MinToSec(time_h * 60);
}
// ここまで追加
}
これは、シャットダウンに関する処理をすべて『ShutDown』クラスに任せるためです。
元あった『class Form1』の中の 『MinToSec』『HourToSec』 は消去してしまって構いません。
一時的にエラーとして表示されますが、後ほど修正を加えます。
シャットダウンタイマのメソッドを追加
続いてシャットダウンタイマを実行するメソッド『Timer』を記述します。
internal class ShutDown
{
private Process ShutDownProc = new Process();
public ShutDown()
{
ShutDownProc.StartInfo.FileName = "shutdown.exe";
}
// ここから追加
public void Timer(int time_h, int time_m, int time_s)
{
ShutDownProc.StartInfo.Arguments
= "/s /t " + (HourToSec(time_h)
+ MinToSec(time_m)
+ time_s).ToString();
ShutDownProc.Start();
}
// ここまで追加
private int MinToSec(int time_m)
{
return time_m * 60;
}
private int HourToSec(int time_h)
{
return MinToSec(time_h * 60);
}
}
このメソッド(関数)では、引数として『time_h(時)』『time_m(分)』『time_s(秒)』を受け取り、『MinToSec』『HourToSec』で秒換算して、シャットダウンを実行するといった処理を行います。
新しく登場した要素としては『.ToString()』ですが、これは『.ToString()』の前の( )の中の数値を文字列に変換するというメソッドです。
これまでは、『.ToString()』は記述せずに数値のまま実行していましたが、本来であれば『shutdown.exe』のオプションは文字列で指定するので、『.ToString()』で文字列に変換する方がより正しい記述となります。
『shutdown.exe』の実行方法や、メソッド(関数)の使い方については過去の記事を参考にしてください。
『shutdown.exe』の実行方法についてはこちらの記事
メソッド(関数)の使い方についてはこちらの記事
シャットダウンキャンセルのメソッドを追加
続いてシャットダウンをキャンセルするメソッド『Cancel』を記述します。
internal class ShutDown
{
private Process ShutDownProc = new Process();
public ShutDown()
{
ShutDownProc.StartInfo.FileName = "shutdown.exe";
}
public void Timer(int time_h, int time_m, int time_s)
{
ShutDownProc.StartInfo.Arguments
= "/s /t " + (HourToSec(time_h)
+ MinToSec(time_m)
+ time_s).ToString();
ShutDownProc.Start();
}
// ここから追加
public void Cancel()
{
ShutDownProc.StartInfo.Arguments = "/a";
ShutDownProc.Start();
}
// ここまで追加
private int MinToSec(int time_m)
{
return time_m * 60;
}
private int HourToSec(int time_h)
{
return MinToSec(time_h * 60);
}
}
キャンセルのオプション『/a』を付与するだけですので、引数は必要ありません。
ShutDownクラスのインスタンス生成
いよいよ作成した『ShutDown』クラスを使っていきます。
『class Form1』の中に、次のように記述しましょう。
namespace ShutDownApp
{
public partial class Form1 : Form
{
// ここから追加
private ShutDown sd= new ShutDown();
// ここまで追加
public Form1()
{
// 【省略】
}
private void b_Shutdown_Click(object sender, EventArgs e)
{
// 【省略】
}
private void b_Cancel_Click(object sender, EventArgs e)
{
// 【省略】
}
}
internal class ShutDown
{
// 【省略】
}
}
見覚えのある書き方だと気づいた方もいるかもしれませんが、これは『Process』クラスを使うときと同じ書き方になります。
private Process ShutDownProc = new Process();
このように『Process』クラスを使う際に生成する『ShutDownProc』をインスタンスと呼びます。
『ShutDown』のインスタンスは『sd』としています。
『new ShutDown()』でインスタンスが生成され、この時にコンストラクタが自動実行されます。
ShutDownクラスを使う
最後に『ShutDown』クラスのインスタンス『sd』を実際に使ってみます。
『b_Shutdown_Click』『b_Cancel_Click』の中を次のように変更しましょう。
namespace ShutDownApp
{
public partial class Form1 : Form
{
private ShutDown sd= new ShutDown();
public Form1()
{
// 【省略】
}
// この中を変更
private void b_Shutdown_Click(object sender, EventArgs e)
{
sd.Timer(int.Parse(cb_Hour.Text),
int.Parse(cb_Min.Text),
int.Parse(cb_Sec.Text));
}
// この中を変更
private void b_Cancel_Click(object sender, EventArgs e)
{
sd.Cancel();
}
}
internal class ShutDown
{
// 【省略】
}
}
『b_Shutdown_Click』の中では、『ShutDown』クラスの中で作成したメソッド『Timer』を呼び出しています。
インスタンス『sd』から続けて『sd.Timer』のように記述します。
( )の中にはメソッド『Timer』の引数『time_h(時)』『time_m(分)』『time_s(秒)』に渡す値を記述します。
それぞれコンボボックスに入力された数字を渡しています。
『b_Cancel_Click』の中では、『ShutDown』クラスの中で作成したメソッド『Cancel』を呼び出しています。
呼び出し方は『Timer』と同様です。
実行
では実行してみましょう。
画面上部の▶ボタン、または[F5]キーを押します。
入力ミス等がなければ、フォームが表示されます。
見た目や行われる処理が前回と変わらないことを確認しましょう。
コンボボックスから時間を選んでボタンを押してみましょう。
シャットダウン通知や、シャットダウンのキャンセル通知は表示されたでしょうか?
以上で今回のプログラミングは終了です。おつかれさまでした。
まとめ
シャットダウンタイマ作成の第5回目として、基本的な『クラス』の使い方を解説をしました。
今回はインスタンスを1つしか生成していないので、クラスの利便性を実感しにくかったかもしれませんが、もともとあった『b_Shutdown_Click』『b_Cancel_Click』の中がとてもシンプルに記述できたことはわかったかと思います。
クラスは大規模なプログラムを作るときや、複数人でプログラムを作るとき、また、一度作った機能を再度使いまわしたいときに大いに役に立ちます。
たとえば別のプログラムで今回作成したシャットダウン機能を使いたいときも、『ShutDown』クラスをインスタンス化するだけで、かんたんに機能を使うことができます。
慣れるまでは記事を読み返して理解を深めてみてください。
用語も徐々に覚えてくると他の解説記事も読みやすくなります。
C#の魅力
C#はWindows OSで知られるMicrosoftが開発したプログラミング言語です。
現在、OSシェア75%という圧倒的なユーザ数を誇るWindowsですが、
Windowsデスクトップアプリケーションを作成するとなった場合、最有力として採用されるプログラミング言語のひとつがC#でしょう。
参考: TECH+『3月デスクトップOSシェア、Windowsが増加しMacが減少』
最近ではWindows以外のアプリケーション開発環境(クロスプラットフォーム)も強化され、macOS、Linux上で動作するアプリケーションに加え、iOS、Androidのスマートフォンアプリの開発も可能となっています。
また、ゲームエンジンUnityの開発言語として使用できることもC#の魅力です。
Unityは家庭用ゲーム機(PlayStation、Nintendo Switch、Xbox等)の他にもスマートフォンゲームアプリの開発も可能な人気のゲーム開発環境です。
Unityで作られた有名なゲームとしては『ポケモンGO』、『原神』等が挙げられます。
以上のように非常に汎用性が高く、多種多様な開発現場で使用でき、魅力的なプログラミング言語であるC#ですが、もう一つの特徴である『オブジェクト指向』という考え方が、プログラミング初心者にとっては高いハードルと感じてしまうかもしれません。
オブジェクト指向が難しいとされる所以は、説明する側もどうやって説明すれば伝わるのかわからず、明確な解説方法が確立されていないという点が挙げられるでしょう。
無理に一言でまとめた概念を解説をしたところで、かえってハードルが高いと感じ、習得意欲を削ぐ結果になりかねません。
今回C#の魅力を伝えるうえで便宜上オブジェクト指向という言葉を出しましたが、
C#を習得したい方は、まずはオブジェクト指向という言葉は一旦忘れてしまって構いません。
まずはC#でできることを実際にプログラミングして慣れることが、習得への第一歩だと考えています。
そのうちご自身が実現したいアプリケーションを作成していくうえで、C#の様々な機能やテクニックを覚えていくことになると思います。
C#を使っていればオブジェクト指向はその中で自然と身についていくでしょう。
とはいえ、独学でC#を習得することはなかなか難しいと感じる方も多いかもしれません。
近年はオンラインスクールを利用して短期間で集中して実務レベルまで習熟させるという方も増えています。
プログラミングのオンラインスクールを活用する場合は、現役のエンジニアが講師となるスクールが優位でしょう。開発現場で通用する質の高い実務ノウハウを学ぶことができます。
また、オンラインスクールであれば全国どこからでも受講できるため、わざわざ都会へ出たり交通費をかけることなく、ライフスタイルに合わせて効率的にスキルを身につけることができることが魅力です。
ITエンジニアとしての強力な武器となるC#を習得するための先行投資として、オンラインスクールは一つの選択肢となり得るでしょう。
無料体験できるオンラインスクールもあるため、独学でも習得できそうか、短期集中で学んだ方がいいのか、ご自身の力量を見極めてみるのもいいのではないでしょうか。
こちらの記事ではオンラインスクールを受講する価値はあるのかについて解説しています。あわせてどうぞ
コメント