Skip to content

第8章 静的メソッド/静的プロパティ/静的クラス

この章では、static キーワードを使った 静的メソッド静的プロパティ静的クラス について学習します。

第 7 章では、Employee クラスを作成し、new でオブジェクトを作成してから使いました。

Employee employee = new Employee();
employee.PrintProfile();

一方、これまでの章でも、new をせずに使ってきた ものがあります。

Console.WriteLine("こんにちは");
int number = int.Parse("123");

Console.WriteLineint.Parse は、new Console() のようにオブジェクトを作らず、クラス名から直接 呼び出しています。 このように呼び出せるメンバーを 静的メンバー といいます。

オブジェクトを作ってから使うもの
→ インスタンスメンバー(インスタンスプロパティ、インスタンスメソッド)
クラス名から直接使うもの
→ 静的メンバー(静的プロパティ、静的メソッド)

この章では、両者の違いを整理し、自分でも静的メンバー・静的クラスを作れるようになります。


この章でできるようになること

Section titled “この章でできるようになること”

この章を終えると、次のことができるようになります。

  • static の意味を説明できる
  • インスタンスメンバーと静的メンバーの違いを説明できる
  • DateTime.NowMath.Max などの .NET が用意した静的メンバーを使える
  • 自分で静的メソッド・静的プロパティを定義できる
  • 静的クラスを作成できる
  • 共通処理を静的クラスにまとめる考え方を説明できる
  • 静的メソッドからインスタンスプロパティを直接使えない理由をおおまかに説明できる
  • インスタンスクラスと静的クラスの使い分けを説明できる

項目内容
開発環境Visual Studio 2022
プロジェクト種類コンソール アプリ
対象フレームワーク.NET 8
ソリューション名Chapter08
プロジェクト名Ch08_Static

csproj の Nullable は disable に変更してください

プロジェクト作成後、Ch08_Static.csproj を開き、<Nullable>disable</Nullable> に変更してください。

詳しい手順は、第 1 章「1-1 プロジェクトを作成する」を参照してください。


作業を始める前に、次の内容を確認してください。

  • クラスを作成できる(第 7 章)
  • プロパティ・メソッドを定義できる
  • new を使ってオブジェクトを作成できる
  • ファイルスコープ namespace(namespace XXX;)を書ける
  • 自作クラスを別ファイル(Employee.cs など)に書ける
  • 第 7 章の内容を Git に提出済みである

8-1 オブジェクトを作らずに使うメンバー

Section titled “8-1 オブジェクトを作らずに使うメンバー”

第 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.WriteLineint.ParseDateTime.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 クラスには、数値計算用の静的メソッドが用意されています。 オブジェクトを作らず、Math.〇〇() の形で呼び出します。

Program.cs
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
小さい値:340

Math.MaxMath.Min も、特定のオブジェクトの状態を必要としません。 だから静的メソッドとして用意されています。

代表的な Math の静的メソッド:

メソッド戻り値内容
Math.Max(a, b)大きい方の値最大値を求める
Math.Min(a, b)小さい方の値最小値を求める
Math.Abs(x)x の絶対値負の数を正にする
Math.Pow(x, y)xyべき乗(戻り値は double)

DateTime クラスには、現在日時を取得する静的プロパティがあります。

Program.cs
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:00

DateTime.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 には、静的メンバーだけでなく、インスタンスメンバー もあります。 具体的な日付を表すオブジェクトに対して、年・月・日を取り出したり、日付を計算したりできます。

Program.cs
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
日:18
7日後:2026/05/25 0:00:00

YearMonthDayAddDays(...) は、具体的な日付オブジェクト に対して使うインスタンスメンバーです。 trainingStartDate.Year のように、オブジェクト名を前に書きます。


DateTime クラスを例に整理します。

メンバー種類呼び出し
DateTime.Now静的プロパティクラス名から
DateTime.Today静的プロパティクラス名から
DateTime.IsLeapYear(2024)静的メソッドクラス名から
trainingStartDate.Yearインスタンスプロパティオブジェクト名から
trainingStartDate.AddDays(7)インスタンスメソッドオブジェクト名から

「特定の日付」と切り離せる処理は静的に、「ある日付に対して」の処理はインスタンスとして用意されています。


8-3 自分で静的メソッドを定義する

Section titled “8-3 自分で静的メソッドを定義する”

ここからは、自分で静的メソッドを作成します。 金額計算用の PriceCalculator クラスを別ファイル(PriceCalculator.cs)に作成します。

PriceCalculator.cs:

PriceCalculator.cs
namespace Ch08_Static;
class PriceCalculator
{
public static int GetTotalPrice(int unitPrice, int quantity)
{
return unitPrice * quantity;
}
}

Program.cs:

Program.cs
namespace Ch08_Static;
internal class Program
{
static void Main(string[] args)
{
int totalPrice = PriceCalculator.GetTotalPrice(180, 5);
Console.WriteLine($"合計金額:{totalPrice}");
}
}

実行結果:

合計金額:900円

メソッド名の前に 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 を付けない場合は、オブジェクトを作ってから呼び出す必要があります。

// 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 クラスを別ファイル(TrainingInfo.cs)に作成します。

TrainingInfo.cs:

TrainingInfo.cs
namespace Ch08_Static;
class TrainingInfo
{
public static string CourseName { get; set; }
public static int CurrentChapter { get; set; }
}

Program.cs:

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 つだけ存在 します。 複数の場所から書き込み・読み込みしても、同じ値を共有します。

カウンタを例に確認します。

AccessCounter.cs:

AccessCounter.cs
namespace Ch08_Static;
class AccessCounter
{
public static int Count { get; set; }
public static void CountUp()
{
Count += 1;
}
}

Program.cs:

Program.cs
namespace Ch08_Static;
internal class Program
{
static void Main(string[] args)
{
AccessCounter.CountUp();
AccessCounter.CountUp();
AccessCounter.CountUp();
Console.WriteLine($"実行回数:{AccessCounter.Count}");
}
}

実行結果:

実行回数:3

Count は静的プロパティなので、AccessCounter クラス全体で共有される値です。 インスタンスプロパティと比べると違いがはっきりします。

種類値の所有者
インスタンスプロパティオブジェクトごとemployee1.EmployeeNameemployee2.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);
}
ポイント
静的メソッドは「特定のオブジェクト」を持たない
どのオブジェクトの値を使うのか分からない
引数で受け取るか、インスタンスメソッドにする

静的クラス とは、static を付けたクラスのことです。

static class ClassName
{
public static void MethodName()
{
}
}

静的クラスには 2 つの特徴があります。

  1. メンバーはすべて static でなければならない
  2. new でオブジェクトを作成できない
PriceCalculator calc = new PriceCalculator(); // ← 静的クラスならエラー

クラス自体に「これは静的専用です」と宣言しておくことで、誤って new してしまうミスを防げます。


共通処理をまとめる入力補助クラス

Section titled “共通処理をまとめる入力補助クラス”

整数入力を受け取る処理を静的クラスにまとめると、コードがすっきりします。

InputHelper.cs:

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:

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:

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:

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);

「データを持つもの = インスタンスクラス、処理だけのもの = 静的クラス」と覚えると分かりやすいです。


つまずき原因対応
static の意味が分からないクラスに属するかオブジェクトに属するかの区別が曖昧new が必要なら non-static、不要なら static
DateTime.Now() と書いてしまうプロパティとメソッドを混同Now はプロパティなので () を付けない
Math.Maxnew して使おうとする静的メソッドの呼び出し方に慣れていないMath.Max(値1, 値2) のようにクラス名から呼ぶ
静的メソッドからインスタンスプロパティを使えずエラーどのオブジェクトの値か特定できないインスタンスメソッドにするか、引数でオブジェクトを渡す
静的クラスを new してエラー静的クラスはインスタンス化できないクラス名から直接メソッドを呼ぶ
何でも static にしてしまう個別の状態を持つものまで静的にしている社員・商品など固有データを持つものはインスタンスにする
static を避けすぎる共通処理を毎回 new してしまう状態を持たない共通処理は静的にする
Mainstatic が気になるプログラム開始時はまだオブジェクトがないMain はオブジェクトなしで呼ぶため static」と覚える

  • static の意味を説明できる
  • インスタンスメンバーと静的メンバーの違いを説明できる
  • DateTime.Now が静的プロパティであることを説明できる
  • Math.Max が静的メソッドであることを説明できる
  • プロパティに () を付けない理由を説明できる
  • 自分で静的メソッドを定義できる
  • 自分で静的プロパティを定義できる
  • 静的クラスを定義できる
  • 静的クラスを new できない理由を説明できる
  • 静的メソッドからインスタンスプロパティを直接使えない理由を説明できる
  • インスタンスクラスと静的クラスの使い分けを説明できる

研修の進め方によっては、隣の人またはチーム内で説明確認を行います。

次の内容を、自分の言葉で説明してください。

  1. employee.PrintProfile()Console.WriteLine() の呼び出し方の違いは何ですか。
  2. static が付いたメソッドは、どのように呼び出しますか。
  3. DateTime.Now() が付かないのはなぜですか。
  4. 静的メソッドからインスタンスプロパティを直接使えないのはなぜですか。
  5. 静的クラスはどのような処理をまとめるときに向いていますか。
  6. なぜ Main メソッドには static が付いているのですか。

説明するときは、完全な答えでなくても構いません。 自分の言葉で説明しようとすることが大切です。


この章の演習課題に取り組みます。

本章では タイマー方式 を試験導入します。次の 3 段階で進めてください。

段階時間内容
① 準備10 分(目安)上の「ペア確認」と、これから取り組む課題(仕様)の読み込み。ペアや講師に質問してよい
② ソロ作業25 分(タイマーで計測)一人で課題に取り組む。タイマーが鳴ったら、完成・未完成にかかわらず作業を止めて提出する
③ チーム時間講師が指定する発表開始時刻までチーム内でコードレビューを行い、発表者を決める。実装の続行も可。時間配分はチームで管理する

第 8 章は概念中心の章のため、ソロ作業は 25 分 と短めです。準備フェーズの終わりに講師が号令をかけ、そこからタイマーを開始します。 評価対象はタイマー時点で提出されたコードです(タイマー後に書き足した分は評価には含まれません)。 発表開始時刻は厳守 です。チーム時間中も、その時刻が来たら全員手を止めて発表に移ります。

演習の進め方の詳細は、付録A「演習の進め方」 を参照してください。


課題はソリューション Kadai08 の中に作成してください。 課題ごとに別のプロジェクトを作成 し、指定されたプロジェクト名を使います。

課題必須/発展プロジェクト名作成する主なファイル
課題 8-1必須Kd08_01_BuiltInStaticProgram.cs
課題 8-2必須Kd08_02_ScoreHelperProgram.csScoreHelper.cs
課題 8-3発展Kd08_03_SalesRecorderProgram.csSalesRecorder.cs
課題 8-4発展Kd08_04_ArrayCalculatorProgram.csArrayCalculator.cs

フォルダ構成は次のようになります。

Kadai08/ ← 課題用ソリューションフォルダ
Kadai08.sln
Kd08_01_BuiltInStatic/
Kd08_02_ScoreHelper/
Kd08_03_SalesRecorder/
Kd08_04_ArrayCalculator/

補足:ソリューションに複数のプロジェクトを追加する方法

最初の課題で Kadai08 ソリューションと Kd08_01_BuiltInStatic プロジェクトを同時に作成します。

2 つ目以降の課題は、ソリューションエクスプローラーで Kadai08 を右クリックし、追加新しいプロジェクト から追加します。


以下は、本章のすべての課題に共通する作業です。各課題の本文には繰り返し書きません。

作業内容参照
プロジェクト作成時の設定最上位レベルのステートメントを使用しない」にチェック第 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 addgit commitgit 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 というテキストファイルを提出先に作成します。コピーが終わってから、次の手順で作成してください。

  1. Kadai08 フォルダをコピーした、サーバ上の自分の名前のフォルダをエクスプローラーで開く
  2. 何もないところで右クリック → 新規作成 → テキスト ドキュメント を選ぶ
  3. ファイル名を 提出メモ.txt に変更する
  4. ダブルクリックで開き、次の内容を書いて保存する
どこまで完成: 8-1〜8-2完成、発展未着手
詰まったポイント: 特になし

書く内容は、コミットメッセージに書くはずだった「どこまで完成したか」「詰まったポイント」と同じです。順調なときも「詰まったポイント: 特になし」と明示 してください。

タイマー後のチーム時間の使い方

タイマー後、講師が指定する 発表開始時刻 までがチーム時間です。チーム内で次の 3 つを自由に管理してください。

  • コードレビュー:他のメンバーの commit を読んで、気づいたことを共有する
  • 発表者の選出:発表開始時刻に、チームから 1 人が要点を発表できるよう、誰が話すかを決めておく
  • 実装の続行(任意):途中だった課題を続けても構いません(提出後の追加分は評価対象外ですが、理解を深める意義はあります)

どの順番で進めるか、何分ずつ使うかはチームの判断です。ただし 発表開始時刻は厳守 です。その時刻までにレビューと発表者選出を必ず終わらせてください。


まずは、全員が必須課題に取り組んでください。


課題 8-1 組み込みの静的メンバーを使う

Section titled “課題 8-1 組み込みの静的メンバーを使う”

DateTimeMath の静的メンバーを使って、次の内容を表示するプログラムを作成してください。

表示する内容:

  1. 現在日時(DateTime.Now)
  2. 今日の年・月・日(DateTime.TodayYearMonthDay)
  3. 2 つの整数 340500 の大きい方・小さい方(Math.MaxMath.Min)

実行結果例:

現在日時:2026/05/18 10:30:00
今年:2026 / 今月:5 / 今日:18
値1:340 値2:500
大きい値:500 / 小さい値:340

条件:

  • DateTime.NowDateTime.Today を使う
  • Math.MaxMath.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 つの点数 755288 について、それぞれ ScoreHelper.IsPass で判定する
  • 点数と判定結果(合格/不合格)を表示する

実行結果例:

75点:合格
52点:不合格
88点:合格

条件:

  • ScoreHelperstatic 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):Totalamount を加算する
    • 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 で求める(整数同士の割り算にならないようキャストを使う)

  • プログラムを Visual Studio から実行できる
  • DateTime.NowDateTime.TodayMath.MaxMath.Min を使えている
  • 静的メソッドを定義できている
  • 静的プロパティを定義できている
  • 静的クラスを定義できている
  • 静的クラスを new していない
  • 静的メソッドをクラス名から呼び出している
  • プロパティに () を付けていない
  • メソッドに () を付けている
  • クラスを別ファイルに分けて書けている
  • インデントが整っている
  • 課題を提出した(Git の commitpush、または講師指示があれば Kadai08 フォルダをサーバへコピーし、提出先フォルダに 提出メモ.txt を作成)

タイマーが鳴ったら、第 8 章の課題プロジェクト群(Kadai08 ソリューション)をその場で Git に提出します。

Terminal window
git status
git add .
git commit -m "Chapter08 タイマー提出: <どこまで完成> / <詰まったポイント>"
git push

実行例:

Terminal window
git commit -m "Chapter08 タイマー提出: 8-1〜8-2完成、8-3は途中 / 8-3 の静的プロパティの共有で悩んだ"

Git の詳しい操作は、付録 C「Git のインストールと提出ルール」 を参照してください。

コミットメッセージの形式は、本章冒頭「演習課題 > 提出ルール(タイマー方式)」を参照してください。

サーバへのコピーで提出する場合

講師から指示があった場合は、push の代わりに Kadai08 フォルダをサーバへコピーして提出します。コピー後、提出先(サーバ上の自分の名前のフォルダ)をエクスプローラーで開き、右クリック → 新規作成 → テキスト ドキュメント で 提出メモ.txt を作って「どこまで完成」「詰まったポイント」を書いてください。詳しくは本章冒頭「演習課題 > 提出方法:Git が使えないときはサーバへコピー」を参照してください。


この章では、静的メソッド・静的プロパティ・静的クラスを学習しました。 主な内容は次のとおりです。

  • static が付いたメンバーは、クラスそのものに属する
  • 静的メンバーは、クラス名から直接呼び出せる(new 不要)
  • 静的プロパティは () なし、静的メソッドは () あり
  • DateTime.Now は静的プロパティ、Math.Max は静的メソッド
  • 静的クラスは静的メンバーだけを持ち、new できない
  • 状態を持たない共通処理は静的クラスにまとめると整理しやすい
  • 個別の情報を持つものはインスタンスクラスで扱う
  • 静的メソッドからインスタンスプロパティを直接使うことはできない
  • Mainstatic で定義されている(起動直後はオブジェクトがないため)

次章では、.NET が用意しているクラスと名前空間 を学習します。

文字列を扱う string、数値計算に使う Math、日付を扱う DateTime、ファイル操作に使う File などを利用しながら、using の役割や名前空間の考え方を整理します。

この章までに学んだ「クラス」「静的メンバー」「インスタンスメンバー」の知識を活かして、.NET の豊富な機能を使いこなせるようになります。