第11章 値型と参照型
この章の目的
Section titled “この章の目的”この章では、C#の型を理解するうえで重要な 値型 と 参照型 について学習します。
これまでの章では、次のような型を使ってきました。
int score = 80;bool isPassed = true;string name = "山田太郎";
Employee employee = new Employee(1001, "山田太郎", "営業部");一見すると、どれも同じように変数へ値を入れているように見えます。
しかし、C#では型によって、値の扱われ方が異なります。
大きく分けると、C#の型には次の2種類があります。
値型 値そのものを持つ型
参照型 オブジェクトの場所を指し示す型この違いは、最初は少し分かりにくいですが、クラスや配列、リスト、DBから取得したデータを扱うようになると重要になります。
特に、後の章でOracle Databaseからデータを取得する場合、データベースの NULL をC#側でどう扱うかが問題になります。
この章では、次の内容を学びます。
構造体列挙型値型と参照型の違いnullnull許容型この章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
- 値型と参照型の違いをおおまかに説明できる
- 構造体とは何かを説明できる
- 簡単な構造体を定義できる
- 列挙型とは何かを説明できる
- 列挙型を使って選択肢を分かりやすく表現できる
- 値型を代入したときの動きを説明できる
- 参照型を代入したときの動きを説明できる
nullが「参照先がない」状態を表すことを説明できるnullによるエラーを防ぐ基本的な書き方ができるint?やdecimal?のようなnull許容型を使える- DBのNULLとC#のnullの関係をおおまかに説明できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| プロジェクト種類 | コンソール アプリ |
| 対象フレームワーク | .NET 8 |
| プロジェクト名 | Chapter11_ValueReferenceNull |
作業前チェック
Section titled “作業前チェック”作業を始める前に、次の内容を確認してください。
-
int、double、bool、stringを使える - クラスを作成できる
- プロパティを定義できる
- コンストラクターを作成できる
- メソッドを作成できる
-
if文で条件分岐できる - 第10章の内容をGitに提出済みである
11-1 構造体
Section titled “11-1 構造体”構造体は、複数の値を1つのまとまりとして扱うための型です。
クラスと似ていますが、構造体は 値型 です。
C#では、次のような型も構造体として用意されています。
intdoubledecimalboolDateTimeたとえば、DateTime は日付や時刻を表す構造体です。
DateTime today = DateTime.Today;自分で構造体を定義することもできます。
EmployeeId構造体を作る
Section titled “EmployeeId構造体を作る”ここでは、社員番号を表す簡単な構造体を作成します。
using System;
class Program{ static void Main() { EmployeeId id = new EmployeeId(1001);
Console.WriteLine(id.Value); }}
struct EmployeeId{ public int Value { get; private set; }
public EmployeeId(int value) { Value = value; }}実行結果:
1001次の部分が構造体です。
struct EmployeeId{ public int Value { get; private set; }
public EmployeeId(int value) { Value = value; }}構造体は、struct キーワードを使って定義します。
構造体にもプロパティやコンストラクターを持たせられる
Section titled “構造体にもプロパティやコンストラクターを持たせられる”構造体にも、クラスと同じようにプロパティやコンストラクターを定義できます。
public int Value { get; private set; }
public EmployeeId(int value){ Value = value;}ただし、この章では構造体を深く使い込むことはしません。
まずは、次のように理解してください。
構造体 → 小さな値のまとまりを表す型 → 値型であるDateTimeも構造体
Section titled “DateTimeも構造体”これまで使ってきた DateTime も構造体です。
using System;
class Program{ static void Main() { DateTime hireDate = new DateTime(2026, 5, 18);
Console.WriteLine(hireDate.Year); Console.WriteLine(hireDate.Month); Console.WriteLine(hireDate.Day); }}実行結果:
2026518DateTime は構造体ですが、プロパティやメソッドを持っています。
hireDate.YearhireDate.AddDays(7)つまり、値型であっても、プロパティやメソッドを持つことがあります。
11-2 列挙型
Section titled “11-2 列挙型”列挙型は、決まった選択肢を名前で表すための型です。
たとえば、社員の在籍状態を文字列で表す場合、次のように書けます。
string status = "在籍中";しかし、文字列で管理すると、入力ミスが起きる可能性があります。
string status = "在籍";string status = "在籍中 ";string status = "退職済";このように、同じ意味なのに表記が揺れることがあります。
そこで、決まった選択肢を列挙型として定義します。
EmployeeStatus列挙型を作る
Section titled “EmployeeStatus列挙型を作る”社員の状態を表す列挙型を作成します。
enum EmployeeStatus{ Active, Retired, LeaveOfAbsence}それぞれの意味は次のように考えます。
| 値 | 意味 |
|---|---|
Active | 在籍中 |
Retired | 退職 |
LeaveOfAbsence | 休職中 |
列挙型を使う
Section titled “列挙型を使う”次のコードを入力して実行してください。
using System;
class Program{ static void Main() { EmployeeStatus status = EmployeeStatus.Active;
if (status == EmployeeStatus.Active) { Console.WriteLine("在籍中です。"); } else { Console.WriteLine("在籍中ではありません。"); } }}
enum EmployeeStatus{ Active, Retired, LeaveOfAbsence}実行結果:
在籍中です。列挙型を使うと、決まった値だけを扱えるため、文字列の入力ミスを減らせます。
switch文と列挙型
Section titled “switch文と列挙型”列挙型は、switch 文と相性がよいです。
using System;
class Program{ static void Main() { EmployeeStatus status = EmployeeStatus.LeaveOfAbsence;
switch (status) { case EmployeeStatus.Active: Console.WriteLine("在籍中です。"); break;
case EmployeeStatus.Retired: Console.WriteLine("退職しています。"); break;
case EmployeeStatus.LeaveOfAbsence: Console.WriteLine("休職中です。"); break; } }}
enum EmployeeStatus{ Active, Retired, LeaveOfAbsence}実行結果:
休職中です。列挙型をクラスのプロパティに使う
Section titled “列挙型をクラスのプロパティに使う”Employee クラスに、在籍状態を表すプロパティを追加します。
using System;
class Program{ static void Main() { Employee employee = new Employee(1001, "山田太郎", EmployeeStatus.Active);
employee.PrintProfile(); }}
class Employee{ public int EmployeeId { get; private set; } public string Name { get; private set; } public EmployeeStatus Status { get; private set; }
public Employee(int employeeId, string name, EmployeeStatus status) { EmployeeId = employeeId; Name = name; Status = status; }
public void PrintProfile() { Console.WriteLine($"社員番号:{EmployeeId}"); Console.WriteLine($"氏名:{Name}"); Console.WriteLine($"状態:{Status}"); }}
enum EmployeeStatus{ Active, Retired, LeaveOfAbsence}実行結果:
社員番号:1001氏名:山田太郎状態:Active列挙型を使うことで、状態を安全に扱いやすくなります。
表示用の日本語に変換する
Section titled “表示用の日本語に変換する”列挙型の値をそのまま表示すると、Active のように英語名が表示されます。
画面表示用には、日本語に変換するメソッドを作るとよいです。
using System;
class Program{ static void Main() { Employee employee = new Employee(1001, "山田太郎", EmployeeStatus.Active);
employee.PrintProfile(); }}
class Employee{ public int EmployeeId { get; private set; } public string Name { get; private set; } public EmployeeStatus Status { get; private set; }
public Employee(int employeeId, string name, EmployeeStatus status) { EmployeeId = employeeId; Name = name; Status = status; }
public void PrintProfile() { Console.WriteLine($"社員番号:{EmployeeId}"); Console.WriteLine($"氏名:{Name}"); Console.WriteLine($"状態:{GetStatusText()}"); }
public string GetStatusText() { switch (Status) { case EmployeeStatus.Active: return "在籍中";
case EmployeeStatus.Retired: return "退職";
case EmployeeStatus.LeaveOfAbsence: return "休職中";
default: return "不明"; } }}
enum EmployeeStatus{ Active, Retired, LeaveOfAbsence}実行結果:
社員番号:1001氏名:山田太郎状態:在籍中11-3 値型と参照型
Section titled “11-3 値型と参照型”値型と参照型の違い
Section titled “値型と参照型の違い”C#の型は、大きく分けると 値型 と 参照型 に分けられます。
| 種類 | 例 | ひとまずの説明 |
|---|---|---|
| 値型 | int、double、bool、DateTime、構造体、列挙型 | 値そのものを持つ |
| 参照型 | string、配列、クラス、List | オブジェクトの場所を指し示す |
この違いは、変数を別の変数に代入したときに分かりやすく現れます。
値型を代入する
Section titled “値型を代入する”まず、int 型で確認します。
using System;
class Program{ static void Main() { int numberA = 10; int numberB = numberA;
numberA = 99;
Console.WriteLine($"numberA:{numberA}"); Console.WriteLine($"numberB:{numberB}"); }}実行結果:
numberA:99numberB:10numberB = numberA; とした時点で、numberA の値が numberB にコピーされます。
その後、numberA を変更しても、numberB には影響しません。
numberAの値をnumberBにコピーした ↓その後は別々の値として扱われる構造体も値型
Section titled “構造体も値型”自分で作った構造体でも確認してみます。
using System;
class Program{ static void Main() { EmployeeId idA = new EmployeeId(1001); EmployeeId idB = idA;
idA.Value = 2001;
Console.WriteLine($"idA:{idA.Value}"); Console.WriteLine($"idB:{idB.Value}"); }}
struct EmployeeId{ public int Value { get; set; }
public EmployeeId(int value) { Value = value; }}実行結果:
idA:2001idB:1001構造体は値型なので、代入すると値がコピーされます。
参照型を代入する
Section titled “参照型を代入する”次に、クラスで確認します。
using System;
class Program{ static void Main() { Employee employeeA = new Employee(1001, "山田太郎"); Employee employeeB = employeeA;
employeeA.Name = "佐藤花子";
Console.WriteLine($"employeeA:{employeeA.Name}"); Console.WriteLine($"employeeB:{employeeB.Name}"); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; }
public Employee(int employeeId, string name) { EmployeeId = employeeId; Name = name; }}実行結果:
employeeA:佐藤花子employeeB:佐藤花子employeeB = employeeA; とすると、Employee オブジェクトそのものがコピーされるわけではありません。
employeeA と employeeB は、同じオブジェクトを参照します。
employeeA ↓同じEmployeeオブジェクト
employeeB ↓同じEmployeeオブジェクトそのため、employeeA.Name を変更すると、employeeB.Name でも同じ変更後の値が見えます。
参照型は「同じものを見ている」ことがある
Section titled “参照型は「同じものを見ている」ことがある”参照型では、複数の変数が同じオブジェクトを指していることがあります。
Employee employeeA = new Employee(1001, "山田太郎");Employee employeeB = employeeA;この場合、employeeA と employeeB は別々の社員ではありません。
同じ社員オブジェクトを、2つの変数名で見ている状態です。
newすると別のオブジェクトになる
Section titled “newすると別のオブジェクトになる”別々のオブジェクトにしたい場合は、それぞれ new します。
using System;
class Program{ static void Main() { Employee employeeA = new Employee(1001, "山田太郎"); Employee employeeB = new Employee(1001, "山田太郎");
employeeA.Name = "佐藤花子";
Console.WriteLine($"employeeA:{employeeA.Name}"); Console.WriteLine($"employeeB:{employeeB.Name}"); }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; }
public Employee(int employeeId, string name) { EmployeeId = employeeId; Name = name; }}実行結果:
employeeA:佐藤花子employeeB:山田太郎employeeA と employeeB は、同じ内容で作成されていますが、別々のオブジェクトです。
メソッドに値型を渡す
Section titled “メソッドに値型を渡す”値型をメソッドに渡したときの動きを確認します。
using System;
class Program{ static void Main() { int number = 10;
ChangeNumber(number);
Console.WriteLine(number); }
static void ChangeNumber(int value) { value = 99; }}実行結果:
10ChangeNumber メソッドの中で value を変更しても、呼び出し元の number は変わりません。
値型は、メソッドに渡すときも値がコピーされるためです。
メソッドに参照型を渡す
Section titled “メソッドに参照型を渡す”参照型をメソッドに渡した場合を確認します。
using System;
class Program{ static void Main() { Employee employee = new Employee(1001, "山田太郎");
ChangeEmployeeName(employee);
Console.WriteLine(employee.Name); }
static void ChangeEmployeeName(Employee target) { target.Name = "佐藤花子"; }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; }
public Employee(int employeeId, string name) { EmployeeId = employeeId; Name = name; }}実行結果:
佐藤花子ChangeEmployeeName メソッドに渡された target は、呼び出し元の employee と同じオブジェクトを参照しています。
そのため、メソッド内で Name を変更すると、呼び出し元にも影響します。
値型と参照型の整理
Section titled “値型と参照型の整理”| 観点 | 値型 | 参照型 |
|---|---|---|
| 代表例 | int、bool、DateTime、構造体 | string、配列、クラス、List |
| 代入 | 値がコピーされる | 参照先がコピーされる |
| 変更の影響 | 基本的に別の変数へ影響しない | 同じオブジェクトを参照していると影響する |
null | 通常は入れられない | 入れられる |
11-4 参照先がないことを表すnull
Section titled “11-4 参照先がないことを表すnull”nullとは
Section titled “nullとは”null は、参照先がないことを表す特別な値です。
参照型の変数には、オブジェクトを参照していない状態として null を入れることができます。
Employee employee = null;これは、employee という変数はあるものの、まだ具体的な Employee オブジェクトを指していない状態です。
nullの変数を使うとエラーになる
Section titled “nullの変数を使うとエラーになる”次のコードは実行時にエラーになります。
using System;
class Program{ static void Main() { Employee employee = null;
Console.WriteLine(employee.Name); }}
class Employee{ public string Name { get; set; } = "";}employee は null なので、Name プロパティを参照できません。
employeeがどのオブジェクトも指していない ↓employee.Name を取り出そうとしても、対象が存在しない ↓エラーになるこのようなエラーは、C#でよく起きるため注意が必要です。
nullかどうか確認する
Section titled “nullかどうか確認する”null の可能性がある変数を使う前には、null かどうか確認します。
using System;
class Program{ static void Main() { Employee employee = FindEmployee(9999);
if (employee == null) { Console.WriteLine("社員が見つかりませんでした。"); } else { Console.WriteLine(employee.Name); } }
static Employee FindEmployee(int employeeId) { if (employeeId == 1001) { return new Employee(1001, "山田太郎"); }
return null; }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; }
public Employee(int employeeId, string name) { EmployeeId = employeeId; Name = name; }}実行結果:
社員が見つかりませんでした。このように、検索結果が見つからなかった場合に null を返すことがあります。
nullable reference typesについて
Section titled “nullable reference typesについて”.NET 8のプロジェクトでは、設定によっては次のような警告が出る場合があります。
Employee employee = null;これは、C#が「この変数はnullになる可能性があるが、本当に大丈夫か」と警告してくれているものです。
nullを許可したい場合は、次のように ? を付けます。
Employee? employee = null;Employee? は、Employee オブジェクトまたは null が入る可能性があることを表します。
Employee? employee = FindEmployee(9999);この書き方は、後のDB接続でも重要になります。
Employee? を使う例
Section titled “Employee? を使う例”using System;
class Program{ static void Main() { Employee? employee = FindEmployee(9999);
if (employee == null) { Console.WriteLine("社員が見つかりませんでした。"); } else { Console.WriteLine(employee.Name); } }
static Employee? FindEmployee(int employeeId) { if (employeeId == 1001) { return new Employee(1001, "山田太郎"); }
return null; }}
class Employee{ public int EmployeeId { get; set; } public string Name { get; set; }
public Employee(int employeeId, string name) { EmployeeId = employeeId; Name = name; }}Employee? と書くことで、「見つからなかった場合はnullになる可能性がある」ことをコード上で表現できます。
null条件演算子
Section titled “null条件演算子”null の可能性がある変数に対して、安全にプロパティやメソッドを呼び出したい場合、?. を使えます。
using System;
class Program{ static void Main() { Employee? employee = null;
Console.WriteLine(employee?.Name); }}
class Employee{ public string Name { get; set; } = "";}employee?.Name は、次のような意味です。
employee が null でなければ Name を取り出すemployee が null なら null のままただし、初学者のうちは、まず if 文で明示的に確認する書き方に慣れましょう。
if (employee != null){ Console.WriteLine(employee.Name);}11-5 値型とnull許容型
Section titled “11-5 値型とnull許容型”値型には通常nullを入れられない
Section titled “値型には通常nullを入れられない”int や DateTime などの値型には、通常 null を代入できません。
エラーになる例:
int salary = null;DateTime hireDate = null;int は整数値を持つ型であり、通常は「値がない」という状態を持てません。
null許容型
Section titled “null許容型”値型でも、? を付けると null を入れられるようになります。
int? salary = null;DateTime? hireDate = null;decimal? commission = null;これを null許容型 と呼びます。
| 通常の値型 | null許容型 |
|---|---|
int | int? |
decimal | decimal? |
DateTime | DateTime? |
bool | bool? |
int? を使う
Section titled “int? を使う”次のコードを入力して実行してください。
using System;
class Program{ static void Main() { int? salary = null;
if (salary == null) { Console.WriteLine("給与は未設定です。"); } else { Console.WriteLine($"給与:{salary}円"); } }}実行結果:
給与は未設定です。int? を使うと、整数または null を扱えます。
値があるか確認する
Section titled “値があるか確認する”null許容型には、値があるかどうかを確認する HasValue があります。
using System;
class Program{ static void Main() { int? salary = 300000;
if (salary.HasValue) { Console.WriteLine($"給与:{salary.Value}円"); } else { Console.WriteLine("給与は未設定です。"); } }}実行結果:
給与:300000円HasValue は値があるかどうかを表します。
Value は実際の値を取り出します。
ただし、Value は null の状態で使うとエラーになるため、必ず HasValue を確認してから使います。
null合体演算子
Section titled “null合体演算子”?? を使うと、nullだった場合の代わりの値を指定できます。
using System;
class Program{ static void Main() { int? salary = null;
int displaySalary = salary ?? 0;
Console.WriteLine($"表示用給与:{displaySalary}円"); }}実行結果:
表示用給与:0円salary ?? 0 は、次の意味です。
salary が null でなければ salary の値を使うsalary が null なら 0 を使うDBのNULLとC#のnull
Section titled “DBのNULLとC#のnull”データベースでは、値が入っていないことを NULL で表します。
たとえば、社員情報の中で、給与や歩合、読み仮名などが未設定になる場合があります。
C#でDBのデータを受け取るときは、NULLになる可能性がある列を意識する必要があります。
たとえば、後のDB接続編では次のようなクラスを使うことになります。
class Employee{ public int EmployeeId { get; set; } public string EmployeeName { get; set; } = ""; public string? Yomi { get; set; } public int JobId { get; set; } public int? ManagerId { get; set; } public DateTime HireDate { get; set; } public decimal? Salary { get; set; } public decimal? Commission { get; set; } public int DepartmentId { get; set; }}ここで、string?、int?、decimal? は、nullになる可能性があることを表しています。
この章では、すべてを理解し切る必要はありません。
まずは、次のように理解してください。
DBのNULL → C#ではnullとして扱うことがある
値型でnullを扱いたい → int? や decimal? を使う
参照型でnullの可能性を明示したい → string? や Employee? を使うよくあるつまずき
Section titled “よくあるつまずき”この章でよくあるつまずきを確認します。
| つまずき | 原因 | 対応 |
|---|---|---|
| 構造体とクラスの違いが分からない | 見た目が似ている | 構造体は値型、クラスは参照型と考える |
| 列挙型を使う意味が分からない | 文字列でも表現できてしまう | 決まった選択肢を安全に扱うために使う |
| 値型の代入結果が分からない | 値がコピーされる感覚がない | int の例で確認する |
| 参照型の代入結果が分からない | 同じオブジェクトを参照している感覚がない | Employee クラスの例で確認する |
| メソッド内で値を変えたのに反映されない | 値型はコピーが渡されている | 値型と参照型の違いを確認する |
null の意味が分からない | 空文字や0と混同している | null は参照先がない状態 |
null の変数を使ってエラーになる | オブジェクトが存在しないのにプロパティを参照している | if (変数 == null) で確認する |
int salary = null; がエラーになる | int は通常nullを持てない | int? salary = null; と書く |
Value を使ってエラーになる | nullなのに値を取り出そうとしている | HasValue を確認してから使う |
string? や Employee? が難しい | null許容参照型に慣れていない | nullになる可能性を示す印と考える |
学んだことチェック
Section titled “学んだことチェック”次の項目について、自分で説明できるか確認してください。
- 構造体とは何かを説明できる
-
structを使って簡単な構造体を定義できる -
DateTimeが構造体であることを説明できる - 列挙型とは何かを説明できる
-
enumを使って列挙型を定義できる - 値型と参照型の違いをおおまかに説明できる
- 値型を別の変数に代入したときの動きを説明できる
- 参照型を別の変数に代入したときの動きを説明できる
-
newすると別のオブジェクトになることを説明できる -
nullが何を表すか説明できる -
nullかどうかをif文で確認できる -
Employee?のように、nullになる可能性がある参照型を表現できる -
int?のようなnull許容型を使える -
??を使ってnullの場合の代替値を指定できる
研修の進め方によっては、隣の人またはチーム内で説明確認を行います。
次の内容を、自分の言葉で説明してください。
- 値型と参照型の違いは何ですか。
int numberB = numberA;とした後にnumberAを変更しても、numberBが変わらないのはなぜですか。Employee employeeB = employeeA;とした後にemployeeA.Nameを変更すると、employeeB.Nameも変わることがあるのはなぜですか。nullとは何ですか。intにnullを入れたい場合、どのように書きますか。- DBのNULLをC#で扱うとき、どのようなことに注意しますか。
説明するときは、完全な答えでなくても構いません。
自分の言葉で説明しようとすることが大切です。
この章の演習課題に取り組みます。
制限時間は 70分 です。
時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。
まずは、全員が必須課題に取り組んでください。
課題11-1 EmployeeStatus列挙型を使う
Section titled “課題11-1 EmployeeStatus列挙型を使う”社員の状態を表す EmployeeStatus 列挙型を作成してください。
値は次の3つとします。
ActiveRetiredLeaveOfAbsenceEmployeeStatus.Active を変数に代入し、switch 文で日本語表示してください。
実行結果例:
在籍中です。条件:
enumを使うswitch文を使うActive、Retired、LeaveOfAbsenceの3種類を用意する
課題11-2 値型の代入を確認する
Section titled “課題11-2 値型の代入を確認する”int 型の変数を2つ用意し、値型の代入を確認してください。
実行結果例:
numberA:99numberB:10条件:
numberAに10を代入するnumberBにnumberAを代入する- その後
numberAを99に変更する numberBの値が変わらないことを確認する
課題11-3 参照型の代入を確認する
Section titled “課題11-3 参照型の代入を確認する”Employee クラスを作成し、参照型の代入を確認してください。
実行結果例:
employeeA:佐藤花子employeeB:佐藤花子条件:
EmployeeクラスにEmployeeIdとNameを持たせるemployeeAを作成するemployeeB = employeeA;と代入するemployeeA.Nameを変更するemployeeB.Nameも変わることを確認する
課題11-4 nullチェックを行う
Section titled “課題11-4 nullチェックを行う”社員検索を想定し、見つからなかった場合に null を返すメソッドを作成してください。
仕様:
static Employee? FindEmployee(int employeeId)実行結果例:
社員が見つかりませんでした。条件:
Employee?を使う- 社員IDが
1001の場合だけEmployeeオブジェクトを返す - それ以外は
nullを返す - 戻り値が
nullかどうかをif文で確認する
必須課題が終わった人は、発展課題に取り組んでください。
課題11-5 EmployeeId構造体を作成する
Section titled “課題11-5 EmployeeId構造体を作成する”社員番号を表す EmployeeId 構造体を作成してください。
仕様:
| メンバー | 内容 |
|---|---|
Value | 社員番号を表す int 型のプロパティ |
| コンストラクター | int value を受け取り、Value に設定する |
実行結果例:
社員番号:1001条件:
structを使うValueプロパティを定義する- コンストラクターを作成する
課題11-6 列挙型をEmployeeクラスに持たせる
Section titled “課題11-6 列挙型をEmployeeクラスに持たせる”Employee クラスに EmployeeStatus 型の Status プロパティを持たせてください。
実行結果例:
社員番号:1001氏名:山田太郎状態:在籍中条件:
EmployeeStatus列挙型を使うEmployeeクラスにStatusプロパティを定義する- 状態を日本語に変換して表示するメソッドを作成する
課題11-7 int? を使って給与未設定を表す
Section titled “課題11-7 int? を使って給与未設定を表す”給与を表す int? salary を使い、給与が未設定の場合と設定済みの場合を表示してください。
実行結果例:
給与は未設定です。給与:300000円条件:
int?を使うnullの場合と値がある場合を両方確認するif文またはHasValueを使う
課題11-8 null合体演算子を使う
Section titled “課題11-8 null合体演算子を使う”int? salary = null; を用意し、表示用給与として 0 を使ってください。
実行結果例:
表示用給与:0円条件:
int?を使う??を使うsalaryがnullの場合に0を表示する
課題11-9 DBデータを想定したEmployeeクラスを作る
Section titled “課題11-9 DBデータを想定したEmployeeクラスを作る”後のDB接続編を想定し、次のプロパティを持つ Employee クラスを作成してください。
| プロパティ名 | 型 | 意味 |
|---|---|---|
EmployeeId | int | 社員ID |
EmployeeName | string | 社員名 |
Yomi | string? | よみがな |
ManagerId | int? | 上司ID |
HireDate | DateTime | 入社日 |
Salary | decimal? | 給与 |
Commission | decimal? | 歩合 |
DepartmentId | int | 部署ID |
実行結果例:
社員ID:1020社員名:内田雄介よみがな:未設定給与:200000歩合:未設定条件:
string?、int?、decimal?を使うnullの場合は"未設定"と表示する- 後のDB接続編で使うクラスの準備として考える
Gitへの提出
Section titled “Gitへの提出”課題が終わったら、できたところまでをGitに提出します。
まず、現在の状態を確認します。
git status変更されたファイルを追加します。
git add .コミットします。
git commit -m "Chapter11 値型と参照型"ファイルサーバー上のリポジトリへpushします。
git pushGitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。
提出前チェックリスト
Section titled “提出前チェックリスト”提出前に、次の項目を確認してください。
-
structを使った構造体を作成できている -
enumを使った列挙型を作成できている - 値型の代入結果を確認できている
- 参照型の代入結果を確認できている
-
nullかどうかを確認してからプロパティを参照している -
Employee?のようなnull許容参照型を使っている -
int?やdecimal?のようなnull許容型を使っている -
??を使ってnullの場合の代替値を指定できている - インデントが整っている
- Gitにcommitしている
- Gitにpushしている
この章のまとめ
Section titled “この章のまとめ”この章では、値型と参照型について学習しました。
この章で学んだ主な内容は次の通りです。
- 構造体は
structで定義する - 構造体は値型である
DateTimeも構造体である- 列挙型は
enumで定義する - 列挙型を使うと、決まった選択肢を安全に扱いやすくなる
- 値型は、代入すると値そのものがコピーされる
- 参照型は、代入すると参照先がコピーされる
- 複数の変数が同じオブジェクトを参照することがある
nullは、参照先がない状態を表すnullの可能性がある変数を使う前には確認が必要であるEmployee?のように書くと、nullになる可能性を表せるint?やdecimal?を使うと、値型でもnullを扱える??を使うと、nullの場合の代替値を指定できる- DBのNULLをC#で扱うときには、null許容型を意識する必要がある
次章では、List
配列より柔軟に複数のデータを扱える List<T> を使い、さらに LINQ による検索や絞り込みを学びます。
後のDB接続編では、DBから取得した複数件の社員情報を List<Employee> として扱うため、この章と次章の内容が重要になります。