第8章 静的メソッド/静的プロパティ/静的クラス
この章の目的
Section titled “この章の目的”この章では、static キーワードを使った 静的メソッド、静的プロパティ、静的クラス について学習します。
第 7 章では、Employee クラスを作成し、new でオブジェクトを作成してから使いました。
Employee employee = new Employee();employee.PrintProfile();一方、これまでの章でも、new をせずに使ってきた ものがあります。
Console.WriteLine("こんにちは");int number = int.Parse("123");Console.WriteLine や int.Parse は、new Console() のようにオブジェクトを作らず、クラス名から直接 呼び出しています。
このように呼び出せるメンバーを 静的メンバー といいます。
オブジェクトを作ってから使うもの → インスタンスメンバー(インスタンスプロパティ、インスタンスメソッド)
クラス名から直接使うもの → 静的メンバー(静的プロパティ、静的メソッド)この章では、両者の違いを整理し、自分でも静的メンバー・静的クラスを作れるようになります。
この章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
staticの意味を説明できる- インスタンスメンバーと静的メンバーの違いを説明できる
DateTime.NowやMath.Maxなどの .NET が用意した静的メンバーを使える- 自分で静的メソッド・静的プロパティを定義できる
- 静的クラスを作成できる
- 共通処理を静的クラスにまとめる考え方を説明できる
- 静的メソッドからインスタンスプロパティを直接使えない理由をおおまかに説明できる
- インスタンスクラスと静的クラスの使い分けを説明できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| プロジェクト種類 | コンソール アプリ |
| 対象フレームワーク | .NET 8 |
| ソリューション名 | Chapter08 |
| プロジェクト名 | Ch08_Static |
csproj の Nullable は disable に変更してください
プロジェクト作成後、
Ch08_Static.csprojを開き、<Nullable>disable</Nullable>に変更してください。詳しい手順は、第 1 章「1-1 プロジェクトを作成する」を参照してください。
作業前チェック
Section titled “作業前チェック”作業を始める前に、次の内容を確認してください。
- クラスを作成できる(第 7 章)
- プロパティ・メソッドを定義できる
-
newを使ってオブジェクトを作成できる - ファイルスコープ namespace(
namespace XXX;)を書ける - 自作クラスを別ファイル(
Employee.csなど)に書ける - 第 7 章の内容を Git に提出済みである
8-1 オブジェクトを作らずに使うメンバー
Section titled “8-1 オブジェクトを作らずに使うメンバー”第 7 章までのおさらい
Section titled “第 7 章までのおさらい”第 7 章では、次のように Employee オブジェクトを作成してから、プロパティやメソッドを使いました。
Employee employee = new Employee{ EmployeeId = 1001, EmployeeName = "山田二郎", DepartmentName = "総務"};
employee.PrintProfile();employee. の前には、必ず 具体的なオブジェクト(employee)があります。
これを インスタンスメンバー といいます。
new していないのに呼べている例
Section titled “new していないのに呼べている例”一方、これまで何度も使ってきた次のコードを思い出してください。
Console.WriteLine("こんにちは");int number = int.Parse("123");DateTime now = DateTime.Now;これらは、次のようには書きません。
Console console = new Console();console.WriteLine("こんにちは");Console.WriteLine、int.Parse、DateTime.Now は、すべて クラス名から直接 呼び出しています。
このように呼び出せるメンバーを 静的メンバー といいます。
| 種類 | 使い方 | 例 |
|---|---|---|
| インスタンスメンバー | オブジェクトを作ってから使う | employee.PrintProfile() |
| 静的メンバー | クラス名から直接使う | Console.WriteLine("...") |
static は「クラスそのものに属する」
Section titled “static は「クラスそのものに属する」”static が付いたメンバーは、オブジェクトではなくクラスそのものに属する と考えます。
static なし → 個別のオブジェクトに属する(オブジェクトごとに別) → 使うには new が必要
static あり → クラスそのものに属する(全体で 1 つ) → クラス名から直接使える補足:
Mainメソッドにもstaticが付くこれまで書いてきた
static void Main(string[] args)のstaticも同じ意味です。 プログラムが起動した直後は、まだどのオブジェクトも作られていません。 そのため、Mainメソッドはオブジェクトなしで呼び出せるよう、staticで定義します。
8-2 .NET が用意している静的メンバーを使う
Section titled “8-2 .NET が用意している静的メンバーを使う”Math クラスの静的メソッド
Section titled “Math クラスの静的メソッド”Math クラスには、数値計算用の静的メソッドが用意されています。
オブジェクトを作らず、Math.〇〇() の形で呼び出します。
namespace Ch08_Static;
internal class Program{ static void Main(string[] args) { int value1 = 340; int value2 = 500;
int max = Math.Max(value1, value2); int min = Math.Min(value1, value2);
Console.WriteLine($"大きい値:{max}"); Console.WriteLine($"小さい値:{min}"); }}実行結果:
大きい値:500小さい値:340Math.Max も Math.Min も、特定のオブジェクトの状態を必要としません。
だから静的メソッドとして用意されています。
代表的な Math の静的メソッド:
| メソッド | 戻り値 | 内容 |
|---|---|---|
Math.Max(a, b) | 大きい方の値 | 最大値を求める |
Math.Min(a, b) | 小さい方の値 | 最小値を求める |
Math.Abs(x) | x の絶対値 | 負の数を正にする |
Math.Pow(x, y) | x の y 乗 | べき乗(戻り値は double) |
DateTime の静的プロパティ
Section titled “DateTime の静的プロパティ”DateTime クラスには、現在日時を取得する静的プロパティがあります。
namespace Ch08_Static;
internal class Program{ static void Main(string[] args) { DateTime now = DateTime.Now; DateTime today = DateTime.Today;
Console.WriteLine($"現在日時:{now}"); Console.WriteLine($"今日の日付:{today}"); }}実行結果(例):
現在日時:2026/05/18 10:30:45今日の日付:2026/05/18 0:00:00DateTime.Now は時刻まで、DateTime.Today は 0 時 0 分の日付までを返します。
プロパティとメソッドの書き方の違い
Section titled “プロパティとメソッドの書き方の違い”DateTime.Now には () を 付けません。
一方、Math.Max(...) には () を 付けます。
| 種類 | 例 | () |
|---|---|---|
| 静的プロパティ | DateTime.Now | 付けない |
| 静的メソッド | Math.Max(10, 20) | 付ける |
() を付け間違えるとエラーになります。
DateTime now = DateTime.Now(); // ← エラー(Now はプロパティ)補足:プロパティかメソッドかは IDE が教えてくれる
Visual Studio で
DateTime.まで入力すると、候補一覧が表示されます。 プロパティはレンチのようなアイコン、メソッドは紫の立方体のようなアイコンで表示されるので、見分けやすいです。
DateTime のインスタンスメンバー
Section titled “DateTime のインスタンスメンバー”DateTime には、静的メンバーだけでなく、インスタンスメンバー もあります。
具体的な日付を表すオブジェクトに対して、年・月・日を取り出したり、日付を計算したりできます。
namespace Ch08_Static;
internal class Program{ static void Main(string[] args) { DateTime trainingStartDate = new DateTime(2026, 5, 18);
Console.WriteLine($"年:{trainingStartDate.Year}"); Console.WriteLine($"月:{trainingStartDate.Month}"); Console.WriteLine($"日:{trainingStartDate.Day}");
DateTime afterSevenDays = trainingStartDate.AddDays(7); Console.WriteLine($"7日後:{afterSevenDays}"); }}実行結果:
年:2026月:5日:187日後:2026/05/25 0:00:00Year・Month・Day・AddDays(...) は、具体的な日付オブジェクト に対して使うインスタンスメンバーです。
trainingStartDate.Year のように、オブジェクト名を前に書きます。
静的かインスタンスかの整理
Section titled “静的かインスタンスかの整理”DateTime クラスを例に整理します。
| メンバー | 種類 | 呼び出し |
|---|---|---|
DateTime.Now | 静的プロパティ | クラス名から |
DateTime.Today | 静的プロパティ | クラス名から |
DateTime.IsLeapYear(2024) | 静的メソッド | クラス名から |
trainingStartDate.Year | インスタンスプロパティ | オブジェクト名から |
trainingStartDate.AddDays(7) | インスタンスメソッド | オブジェクト名から |
「特定の日付」と切り離せる処理は静的に、「ある日付に対して」の処理はインスタンスとして用意されています。
8-3 自分で静的メソッドを定義する
Section titled “8-3 自分で静的メソッドを定義する”PriceCalculator クラスを作る
Section titled “PriceCalculator クラスを作る”ここからは、自分で静的メソッドを作成します。
金額計算用の PriceCalculator クラスを別ファイル(PriceCalculator.cs)に作成します。
PriceCalculator.cs:
namespace Ch08_Static;
class PriceCalculator{ public static int GetTotalPrice(int unitPrice, int quantity) { return unitPrice * quantity; }}Program.cs:
namespace Ch08_Static;
internal class Program{ static void Main(string[] args) { int totalPrice = PriceCalculator.GetTotalPrice(180, 5);
Console.WriteLine($"合計金額:{totalPrice}円"); }}実行結果:
合計金額:900円static の付け方
Section titled “static の付け方”メソッド名の前に static を付けるだけで、静的メソッドになります。
public static int GetTotalPrice(int unitPrice, int quantity){ return unitPrice * quantity;}| 部分 | 意味 |
|---|---|
public | クラスの外から呼び出せる |
static | クラス名から直接呼び出せる |
int | 戻り値の型 |
GetTotalPrice | メソッド名 |
呼び出すときは、クラス名から 直接呼び出します。
int totalPrice = PriceCalculator.GetTotalPrice(180, 5);new PriceCalculator() は 必要ありません。
static がない場合との比較
Section titled “static がない場合との比較”static を付けない場合は、オブジェクトを作ってから呼び出す必要があります。
// static なし(従来のインスタンスメソッド)PriceCalculator calculator = new PriceCalculator();int totalPrice = calculator.GetTotalPrice(180, 5);
// static あり(静的メソッド)int totalPrice = PriceCalculator.GetTotalPrice(180, 5);金額計算のように オブジェクトの状態(プロパティ)を必要としない 処理は、静的メソッドにすると new を省けて簡潔になります。
8-4 自分で静的プロパティを定義する
Section titled “8-4 自分で静的プロパティを定義する”TrainingInfo クラスを作る
Section titled “TrainingInfo クラスを作る”研修情報を表す TrainingInfo クラスを別ファイル(TrainingInfo.cs)に作成します。
TrainingInfo.cs:
namespace Ch08_Static;
class TrainingInfo{ public static string CourseName { get; set; } public static int CurrentChapter { get; set; }}Program.cs:
namespace Ch08_Static;
internal class Program{ static void Main(string[] args) { TrainingInfo.CourseName = "C# 基礎研修"; TrainingInfo.CurrentChapter = 8;
Console.WriteLine($"研修名:{TrainingInfo.CourseName}"); Console.WriteLine($"現在の章:第{TrainingInfo.CurrentChapter}章"); }}実行結果:
研修名:C# 基礎研修現在の章:第8章TrainingInfo.CourseName のように、クラス名から直接アクセスしています。
オブジェクトは作りません。
静的プロパティは全体で 1 つ
Section titled “静的プロパティは全体で 1 つ”静的プロパティは、クラスそのものに属するため、プログラム内で 1 つだけ存在 します。 複数の場所から書き込み・読み込みしても、同じ値を共有します。
カウンタを例に確認します。
AccessCounter.cs:
namespace Ch08_Static;
class AccessCounter{ public static int Count { get; set; }
public static void CountUp() { Count += 1; }}Program.cs:
namespace Ch08_Static;
internal class Program{ static void Main(string[] args) { AccessCounter.CountUp(); AccessCounter.CountUp(); AccessCounter.CountUp();
Console.WriteLine($"実行回数:{AccessCounter.Count}"); }}実行結果:
実行回数:3Count は静的プロパティなので、AccessCounter クラス全体で共有される値です。
インスタンスプロパティと比べると違いがはっきりします。
| 種類 | 値の所有者 | 例 |
|---|---|---|
| インスタンスプロパティ | オブジェクトごと | employee1.EmployeeName、employee2.EmployeeName は別の値 |
| 静的プロパティ | クラス全体で 1 つ | AccessCounter.Count は唯一の値 |
静的メソッドからインスタンスプロパティは使えない
Section titled “静的メソッドからインスタンスプロパティは使えない”次のコードはエラーになります。
class Employee{ public string EmployeeName { get; set; }
public static void PrintName() { Console.WriteLine(EmployeeName); // ← エラー }}EmployeeName はインスタンスプロパティです。具体的な Employee オブジェクトごとに値が異なります。
しかし、PrintName は静的メソッドなので、特定のオブジェクトに属していません。
そのため、どの社員の EmployeeName か分からない ためエラーになります。
解決方法は 2 つあります。
方法 1: インスタンスメソッドに変える
public void PrintName() // ← static を外す{ Console.WriteLine(EmployeeName);}方法 2: 引数でオブジェクトを渡す
public static void PrintName(Employee employee){ Console.WriteLine(employee.EmployeeName);}ポイント 静的メソッドは「特定のオブジェクト」を持たない ↓ どのオブジェクトの値を使うのか分からない ↓ 引数で受け取るか、インスタンスメソッドにする8-5 静的クラス
Section titled “8-5 静的クラス”静的クラスとは
Section titled “静的クラスとは”静的クラス とは、static を付けたクラスのことです。
static class ClassName{ public static void MethodName() { }}静的クラスには 2 つの特徴があります。
- メンバーはすべて
staticでなければならない newでオブジェクトを作成できない
PriceCalculator calc = new PriceCalculator(); // ← 静的クラスならエラークラス自体に「これは静的専用です」と宣言しておくことで、誤って new してしまうミスを防げます。
共通処理をまとめる入力補助クラス
Section titled “共通処理をまとめる入力補助クラス”整数入力を受け取る処理を静的クラスにまとめると、コードがすっきりします。
InputHelper.cs:
namespace Ch08_Static;
static class InputHelper{ public static int ReadInt(string message) { Console.Write(message); string input = Console.ReadLine(); return int.Parse(input); }}Program.cs:
namespace Ch08_Static;
internal class Program{ static void Main(string[] args) { int unitPrice = InputHelper.ReadInt("単価を入力してください:"); int quantity = InputHelper.ReadInt("数量を入力してください:");
int totalPrice = unitPrice * quantity;
Console.WriteLine($"合計金額:{totalPrice}円"); }}実行例:
単価を入力してください:180数量を入力してください:5合計金額:900円InputHelper.ReadInt の中に「メッセージ表示」「入力受け取り」「数値変換」がまとまっています。
Main の中では InputHelper.ReadInt(...) の 1 行で済むので、何をしているかが読みやすくなります。
複数の静的メソッドをまとめる
Section titled “複数の静的メソッドをまとめる”静的クラスには、関連する処理を複数まとめられます。
PriceCalculator に複数のメソッドを持たせる例を見ます。
PriceCalculator.cs:
namespace Ch08_Static;
static class PriceCalculator{ public static int GetTotalPrice(int unitPrice, int quantity) { return unitPrice * quantity; }
public static decimal GetTaxIncludedPrice(decimal price, decimal taxRate) { return price * taxRate; }
public static int GetDiscountedPrice(int price, int discount) { return price - discount; }}Program.cs:
namespace Ch08_Static;
internal class Program{ static void Main(string[] args) { int totalPrice = PriceCalculator.GetTotalPrice(180, 5); decimal taxIncludedPrice = PriceCalculator.GetTaxIncludedPrice(2980m, 1.10m); int discountedPrice = PriceCalculator.GetDiscountedPrice(5000, 500);
Console.WriteLine($"合計金額:{totalPrice}円"); Console.WriteLine($"税込金額:{taxIncludedPrice}円"); Console.WriteLine($"割引後金額:{discountedPrice}円"); }}実行結果:
合計金額:900円税込金額:3278.00円割引後金額:4500円「金額に関する計算」を PriceCalculator クラスにまとめておくと、関連処理が探しやすくなり、追加・変更もしやすくなります。
補足:
decimalの出力
2980m * 1.10mの結果は3278.00のように小数第 2 位まで表示されます。decimalは内部で「小数点以下を何桁残すか」の情報も持っているためです。
静的クラスとインスタンスクラスの使い分け
Section titled “静的クラスとインスタンスクラスの使い分け”| 使い方 | 向いている例 |
|---|---|
| インスタンスクラス | 社員、商品、注文など、個別のデータを持つもの |
| 静的クラス | 金額計算、入力補助、配列処理など、状態を持たない共通処理 |
社員 1 人ひとりは固有の情報を持つので、インスタンスとして扱います。
Employee employee = new Employee();金額計算は、特定のオブジェクトに属さないので、静的クラスにまとめます。
PriceCalculator.GetTotalPrice(180, 5);「データを持つもの = インスタンスクラス、処理だけのもの = 静的クラス」と覚えると分かりやすいです。
よくあるつまずき
Section titled “よくあるつまずき”| つまずき | 原因 | 対応 |
|---|---|---|
static の意味が分からない | クラスに属するかオブジェクトに属するかの区別が曖昧 | new が必要なら non-static、不要なら static |
DateTime.Now() と書いてしまう | プロパティとメソッドを混同 | Now はプロパティなので () を付けない |
Math.Max を new して使おうとする | 静的メソッドの呼び出し方に慣れていない | Math.Max(値1, 値2) のようにクラス名から呼ぶ |
| 静的メソッドからインスタンスプロパティを使えずエラー | どのオブジェクトの値か特定できない | インスタンスメソッドにするか、引数でオブジェクトを渡す |
静的クラスを new してエラー | 静的クラスはインスタンス化できない | クラス名から直接メソッドを呼ぶ |
何でも static にしてしまう | 個別の状態を持つものまで静的にしている | 社員・商品など固有データを持つものはインスタンスにする |
static を避けすぎる | 共通処理を毎回 new してしまう | 状態を持たない共通処理は静的にする |
Main の static が気になる | プログラム開始時はまだオブジェクトがない | 「Main はオブジェクトなしで呼ぶため static」と覚える |
学んだことチェック
Section titled “学んだことチェック”-
staticの意味を説明できる - インスタンスメンバーと静的メンバーの違いを説明できる
-
DateTime.Nowが静的プロパティであることを説明できる -
Math.Maxが静的メソッドであることを説明できる - プロパティに
()を付けない理由を説明できる - 自分で静的メソッドを定義できる
- 自分で静的プロパティを定義できる
- 静的クラスを定義できる
- 静的クラスを
newできない理由を説明できる - 静的メソッドからインスタンスプロパティを直接使えない理由を説明できる
- インスタンスクラスと静的クラスの使い分けを説明できる
研修の進め方によっては、隣の人またはチーム内で説明確認を行います。
次の内容を、自分の言葉で説明してください。
employee.PrintProfile()とConsole.WriteLine()の呼び出し方の違いは何ですか。staticが付いたメソッドは、どのように呼び出しますか。DateTime.Nowに()が付かないのはなぜですか。- 静的メソッドからインスタンスプロパティを直接使えないのはなぜですか。
- 静的クラスはどのような処理をまとめるときに向いていますか。
- なぜ
Mainメソッドにはstaticが付いているのですか。
説明するときは、完全な答えでなくても構いません。 自分の言葉で説明しようとすることが大切です。
この章の演習課題に取り組みます。
本章では タイマー方式 を試験導入します。次の 3 段階で進めてください。
| 段階 | 時間 | 内容 |
|---|---|---|
| ① 準備 | 10 分(目安) | 上の「ペア確認」と、これから取り組む課題(仕様)の読み込み。ペアや講師に質問してよい |
| ② ソロ作業 | 25 分(タイマーで計測) | 一人で課題に取り組む。タイマーが鳴ったら、完成・未完成にかかわらず作業を止めて提出する |
| ③ チーム時間 | 講師が指定する発表開始時刻まで | チーム内でコードレビューを行い、発表者を決める。実装の続行も可。時間配分はチームで管理する |
第 8 章は概念中心の章のため、ソロ作業は 25 分 と短めです。準備フェーズの終わりに講師が号令をかけ、そこからタイマーを開始します。 評価対象はタイマー時点で提出されたコードです(タイマー後に書き足した分は評価には含まれません)。 発表開始時刻は厳守 です。チーム時間中も、その時刻が来たら全員手を止めて発表に移ります。
演習の進め方の詳細は、付録A「演習の進め方」 を参照してください。
この章の演習の進め方
Section titled “この章の演習の進め方”課題はソリューション Kadai08 の中に作成してください。
課題ごとに別のプロジェクトを作成 し、指定されたプロジェクト名を使います。
| 課題 | 必須/発展 | プロジェクト名 | 作成する主なファイル |
|---|---|---|---|
| 課題 8-1 | 必須 | Kd08_01_BuiltInStatic | Program.cs |
| 課題 8-2 | 必須 | Kd08_02_ScoreHelper | Program.cs、ScoreHelper.cs |
| 課題 8-3 | 発展 | Kd08_03_SalesRecorder | Program.cs、SalesRecorder.cs |
| 課題 8-4 | 発展 | Kd08_04_ArrayCalculator | Program.cs、ArrayCalculator.cs |
フォルダ構成は次のようになります。
Kadai08/ ← 課題用ソリューションフォルダ Kadai08.sln Kd08_01_BuiltInStatic/ Kd08_02_ScoreHelper/ Kd08_03_SalesRecorder/ Kd08_04_ArrayCalculator/補足:ソリューションに複数のプロジェクトを追加する方法
最初の課題で
Kadai08ソリューションとKd08_01_BuiltInStaticプロジェクトを同時に作成します。2 つ目以降の課題は、ソリューションエクスプローラーで
Kadai08を右クリックし、追加→新しいプロジェクトから追加します。
演習の共通ルール
Section titled “演習の共通ルール”以下は、本章のすべての課題に共通する作業です。各課題の本文には繰り返し書きません。
| 作業 | 内容 | 参照 |
|---|---|---|
| プロジェクト作成時の設定 | 「最上位レベルのステートメントを使用しない」にチェック | 第 1 章 1-1 |
| csproj の編集 | <Nullable>disable</Nullable> に変更 | 第 1 章 1-1 |
namespace の書き方 | ファイルスコープ形式(namespace XXX;)で書く | 第 7 章 冒頭 |
| クラスファイルの追加 | ソリューションエクスプローラーでプロジェクトを右クリック → 追加 → クラス | 第 7 章 7-7 |
| ファイルを保存して実行 | Ctrl + S で保存 → F5 で実行 | 第 1 章 1-2 |
特に 2 つ目以降のプロジェクト(Kd08_02_ScoreHelper など)も、新規追加するたびに csproj の Nullable を disable に変更する 必要があります。
クラスファイルを自動生成すると、ブロック形式の namespace プロジェクト名 { ... } で作られます(例:課題 8-2 なら namespace Kd08_02_ScoreHelper { ... })。本章でもファイルスコープ形式に統一するため、生成後に namespace Kd08_02_ScoreHelper; のように ; 形式に書き換えてください。同じプロジェクト内の Program.cs と他のクラスファイルの namespace は揃えます。
提出ルール(タイマー方式)
- 準備フェーズの後、講師の号令で 25 分のタイマー をスタートします
- タイマーが鳴ったら、完成・未完成にかかわらず手を止め、その場で
git add→git commit→git pushを行います- これがこの演習の 唯一の提出 です。タイマー後も実装を続けて構いませんが、書き足した分は評価対象には含まれません
コミットメッセージの形式:
Chapter08 タイマー提出: <どの課題まで完成> / <詰まったポイント>例:
Chapter08 タイマー提出: 8-1完成、8-2は途中 / 8-2 の static class の書き方で詰まっているChapter08 タイマー提出: 8-1〜8-2完成、発展未着手 / 特になしChapter08 タイマー提出: 8-1の途中まで / Math.Max の呼び出し方が分からない「どこまでできたか」「詰まったポイント」は短くて構いません。順調なときも「特になし」と明示 してください(順調さの証拠になります)。
提出方法:Git が使えないときはサーバへコピー
Git の状態によっては、講師から「今回は
pushではなくサーバへのフォルダコピーで提出」と指示が出ることがあります。その場合は、pushの代わりにKadai08フォルダをサーバの所定の場所へコピーして提出してください(コピー手順は別途案内済みのとおり)。このとき コミットメッセージが残せない ため、代わりに
提出メモ.txtというテキストファイルを提出先に作成します。コピーが終わってから、次の手順で作成してください。
Kadai08フォルダをコピーした、サーバ上の自分の名前のフォルダをエクスプローラーで開く- 何もないところで右クリック → 新規作成 → テキスト ドキュメント を選ぶ
- ファイル名を
提出メモ.txtに変更する- ダブルクリックで開き、次の内容を書いて保存する
どこまで完成: 8-1〜8-2完成、発展未着手詰まったポイント: 特になし書く内容は、コミットメッセージに書くはずだった「どこまで完成したか」「詰まったポイント」と同じです。順調なときも「詰まったポイント: 特になし」と明示 してください。
タイマー後のチーム時間の使い方
タイマー後、講師が指定する 発表開始時刻 までがチーム時間です。チーム内で次の 3 つを自由に管理してください。
- コードレビュー:他のメンバーの commit を読んで、気づいたことを共有する
- 発表者の選出:発表開始時刻に、チームから 1 人が要点を発表できるよう、誰が話すかを決めておく
- 実装の続行(任意):途中だった課題を続けても構いません(提出後の追加分は評価対象外ですが、理解を深める意義はあります)
どの順番で進めるか、何分ずつ使うかはチームの判断です。ただし 発表開始時刻は厳守 です。その時刻までにレビューと発表者選出を必ず終わらせてください。
まずは、全員が必須課題に取り組んでください。
課題 8-1 組み込みの静的メンバーを使う
Section titled “課題 8-1 組み込みの静的メンバーを使う”DateTime と Math の静的メンバーを使って、次の内容を表示するプログラムを作成してください。
表示する内容:
- 現在日時(
DateTime.Now) - 今日の年・月・日(
DateTime.TodayのYear・Month・Day) - 2 つの整数
340と500の大きい方・小さい方(Math.Max・Math.Min)
実行結果例:
現在日時:2026/05/18 10:30:00今年:2026 / 今月:5 / 今日:18値1:340 値2:500大きい値:500 / 小さい値:340条件:
DateTime.Now、DateTime.Todayを使うMath.Max、Math.Minを使う- メソッドとプロパティで
()の有無を間違えない
課題 8-2 ScoreHelper 静的クラスを作成する
Section titled “課題 8-2 ScoreHelper 静的クラスを作成する”点数の合否を判定する ScoreHelper 静的クラスを別ファイル(ScoreHelper.cs)に作成してください。
クラス仕様
- クラス名:
ScoreHelper(static classとして定義) - ファイル名:
ScoreHelper.cs - メソッド:
IsPass(int score):scoreが 60 以上ならtrue、60 未満ならfalseを返す静的メソッド
Main メソッド仕様
- 3 つの点数
75、52、88について、それぞれScoreHelper.IsPassで判定する - 点数と判定結果(合格/不合格)を表示する
実行結果例:
75点:合格52点:不合格88点:合格条件:
ScoreHelperをstatic classとして定義するnew ScoreHelper()は 使わないIsPassの戻り値(bool)をifで受けて「合格」「不合格」を表示する
必須課題が終わった人は、発展課題に取り組んでください。 発展課題は 仕様だけが提示されます。実装方法は自分で考えてください。
課題 8-3 SalesRecorder 静的クラスを作成する
Section titled “課題 8-3 SalesRecorder 静的クラスを作成する”売上の累計を記録する SalesRecorder 静的クラスを作成してください。
クラス仕様
- クラス名:
SalesRecorder(static classとして定義) - ファイル名:
SalesRecorder.cs - 静的プロパティ:
Total(int):売上の累計
- 静的メソッド:
Add(int amount):Totalにamountを加算するPrintTotal():現在のTotalを「現在の売上合計:〇〇円」の形式で表示する
Main メソッド仕様
SalesRecorder.Add(5000)を呼び、SalesRecorder.PrintTotal()で表示する- 続けて
SalesRecorder.Add(7000)→SalesRecorder.PrintTotal() - 続けて
SalesRecorder.Add(3000)→SalesRecorder.PrintTotal()
実行結果例:
現在の売上合計:5000円現在の売上合計:12000円現在の売上合計:15000円ヒント
Totalは静的プロパティなので、SalesRecorderクラス全体で 1 つだけ存在します。Addを呼ぶたびに、同じTotalに値が積み重なっていきます。本章 8-4「静的プロパティは全体で 1 つ」のAccessCounter(Count+CountUp)の考え方を、amountを受け取る形に発展させたものです。
課題 8-4 ArrayCalculator 静的クラスを作成する
Section titled “課題 8-4 ArrayCalculator 静的クラスを作成する”整数配列の合計と平均を求める静的クラスを作成してください。
クラス仕様
- クラス名:
ArrayCalculator(static classとして定義) - ファイル名:
ArrayCalculator.cs - メソッド:
GetTotal(int[] numbers):合計値(int)を返すGetAverage(int[] numbers):平均値(double)を返す
Main メソッド仕様
- 配列
{ 80, 75, 90, 68, 85 }を用意する ArrayCalculator.GetTotalで合計を取得して表示するArrayCalculator.GetAverageで平均を取得して表示する
実行結果例:
合計:398平均:79.6条件:
static class ArrayCalculatorとして定義するGetAverageの中でGetTotalを呼び出してもよい- 平均は
doubleで求める(整数同士の割り算にならないようキャストを使う)
提出前チェックリスト
Section titled “提出前チェックリスト”- プログラムを Visual Studio から実行できる
-
DateTime.Now、DateTime.Today、Math.Max、Math.Minを使えている - 静的メソッドを定義できている
- 静的プロパティを定義できている
- 静的クラスを定義できている
- 静的クラスを
newしていない - 静的メソッドをクラス名から呼び出している
- プロパティに
()を付けていない - メソッドに
()を付けている - クラスを別ファイルに分けて書けている
- インデントが整っている
- 課題を提出した(Git の
commit→push、または講師指示があればKadai08フォルダをサーバへコピーし、提出先フォルダに提出メモ.txtを作成)
Git への提出
Section titled “Git への提出”タイマーが鳴ったら、第 8 章の課題プロジェクト群(Kadai08 ソリューション)をその場で Git に提出します。
git statusgit add .git commit -m "Chapter08 タイマー提出: <どこまで完成> / <詰まったポイント>"git push実行例:
git commit -m "Chapter08 タイマー提出: 8-1〜8-2完成、8-3は途中 / 8-3 の静的プロパティの共有で悩んだ"Git の詳しい操作は、付録 C「Git のインストールと提出ルール」 を参照してください。
コミットメッセージの形式は、本章冒頭「演習課題 > 提出ルール(タイマー方式)」を参照してください。
サーバへのコピーで提出する場合
講師から指示があった場合は、
pushの代わりにKadai08フォルダをサーバへコピーして提出します。コピー後、提出先(サーバ上の自分の名前のフォルダ)をエクスプローラーで開き、右クリック → 新規作成 → テキスト ドキュメント で提出メモ.txtを作って「どこまで完成」「詰まったポイント」を書いてください。詳しくは本章冒頭「演習課題 > 提出方法:Git が使えないときはサーバへコピー」を参照してください。
この章のまとめ
Section titled “この章のまとめ”この章では、静的メソッド・静的プロパティ・静的クラスを学習しました。 主な内容は次のとおりです。
staticが付いたメンバーは、クラスそのものに属する- 静的メンバーは、クラス名から直接呼び出せる(
new不要) - 静的プロパティは
()なし、静的メソッドは()あり DateTime.Nowは静的プロパティ、Math.Maxは静的メソッド- 静的クラスは静的メンバーだけを持ち、
newできない - 状態を持たない共通処理は静的クラスにまとめると整理しやすい
- 個別の情報を持つものはインスタンスクラスで扱う
- 静的メソッドからインスタンスプロパティを直接使うことはできない
Mainもstaticで定義されている(起動直後はオブジェクトがないため)
次章では、.NET が用意しているクラスと名前空間 を学習します。
文字列を扱う string、数値計算に使う Math、日付を扱う DateTime、ファイル操作に使う File などを利用しながら、using の役割や名前空間の考え方を整理します。
この章までに学んだ「クラス」「静的メンバー」「インスタンスメンバー」の知識を活かして、.NET の豊富な機能を使いこなせるようになります。