Skip to content

第11章 値型と参照型

この章では、C#の型を理解するうえで重要な 値型参照型 について学習します。

これまでの章では、次のような型を使ってきました。

int score = 80;
bool isPassed = true;
string name = "山田太郎";
Employee employee = new Employee(1001, "山田太郎", "営業部");

一見すると、どれも同じように変数へ値を入れているように見えます。

しかし、C#では型によって、値の扱われ方が異なります。

大きく分けると、C#の型には次の2種類があります。

値型
値そのものを持つ型
参照型
オブジェクトの場所を指し示す型

この違いは、最初は少し分かりにくいですが、クラスや配列、リスト、DBから取得したデータを扱うようになると重要になります。

特に、後の章でOracle Databaseからデータを取得する場合、データベースの NULL をC#側でどう扱うかが問題になります。

この章では、次の内容を学びます。

構造体
列挙型
値型と参照型の違い
null
null許容型

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

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

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

  • 値型と参照型の違いをおおまかに説明できる
  • 構造体とは何かを説明できる
  • 簡単な構造体を定義できる
  • 列挙型とは何かを説明できる
  • 列挙型を使って選択肢を分かりやすく表現できる
  • 値型を代入したときの動きを説明できる
  • 参照型を代入したときの動きを説明できる
  • null が「参照先がない」状態を表すことを説明できる
  • null によるエラーを防ぐ基本的な書き方ができる
  • int?decimal? のようなnull許容型を使える
  • DBのNULLとC#のnullの関係をおおまかに説明できる

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

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

  • intdoubleboolstring を使える
  • クラスを作成できる
  • プロパティを定義できる
  • コンストラクターを作成できる
  • メソッドを作成できる
  • if 文で条件分岐できる
  • 第10章の内容をGitに提出済みである

構造体は、複数の値を1つのまとまりとして扱うための型です。

クラスと似ていますが、構造体は 値型 です。

C#では、次のような型も構造体として用意されています。

int
double
decimal
bool
DateTime

たとえば、DateTime は日付や時刻を表す構造体です。

DateTime today = DateTime.Today;

自分で構造体を定義することもできます。


ここでは、社員番号を表す簡単な構造体を作成します。

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 も構造体です。

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

実行結果:

2026
5
18

DateTime は構造体ですが、プロパティやメソッドを持っています。

hireDate.Year
hireDate.AddDays(7)

つまり、値型であっても、プロパティやメソッドを持つことがあります。


列挙型は、決まった選択肢を名前で表すための型です。

たとえば、社員の在籍状態を文字列で表す場合、次のように書けます。

string status = "在籍中";

しかし、文字列で管理すると、入力ミスが起きる可能性があります。

string status = "在籍";
string status = "在籍中 ";
string status = "退職済";

このように、同じ意味なのに表記が揺れることがあります。

そこで、決まった選択肢を列挙型として定義します。


社員の状態を表す列挙型を作成します。

enum EmployeeStatus
{
Active,
Retired,
LeaveOfAbsence
}

それぞれの意味は次のように考えます。

意味
Active在籍中
Retired退職
LeaveOfAbsence休職中

次のコードを入力して実行してください。

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 文と相性がよいです。

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

列挙型を使うことで、状態を安全に扱いやすくなります。


列挙型の値をそのまま表示すると、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
氏名:山田太郎
状態:在籍中

C#の型は、大きく分けると 値型参照型 に分けられます。

種類ひとまずの説明
値型intdoubleboolDateTime、構造体、列挙型値そのものを持つ
参照型string、配列、クラス、Listオブジェクトの場所を指し示す

この違いは、変数を別の変数に代入したときに分かりやすく現れます。


まず、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:99
numberB:10

numberB = numberA; とした時点で、numberA の値が numberB にコピーされます。

その後、numberA を変更しても、numberB には影響しません。

numberAの値をnumberBにコピーした
その後は別々の値として扱われる

自分で作った構造体でも確認してみます。

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:2001
idB:1001

構造体は値型なので、代入すると値がコピーされます。


次に、クラスで確認します。

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 オブジェクトそのものがコピーされるわけではありません。

employeeAemployeeB は、同じオブジェクトを参照します。

employeeA
同じEmployeeオブジェクト
employeeB
同じEmployeeオブジェクト

そのため、employeeA.Name を変更すると、employeeB.Name でも同じ変更後の値が見えます。


参照型は「同じものを見ている」ことがある

Section titled “参照型は「同じものを見ている」ことがある”

参照型では、複数の変数が同じオブジェクトを指していることがあります。

Employee employeeA = new Employee(1001, "山田太郎");
Employee employeeB = employeeA;

この場合、employeeAemployeeB は別々の社員ではありません。

同じ社員オブジェクトを、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:山田太郎

employeeAemployeeB は、同じ内容で作成されていますが、別々のオブジェクトです。


値型をメソッドに渡したときの動きを確認します。

using System;
class Program
{
static void Main()
{
int number = 10;
ChangeNumber(number);
Console.WriteLine(number);
}
static void ChangeNumber(int value)
{
value = 99;
}
}

実行結果:

10

ChangeNumber メソッドの中で value を変更しても、呼び出し元の number は変わりません。

値型は、メソッドに渡すときも値がコピーされるためです。


参照型をメソッドに渡した場合を確認します。

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 を変更すると、呼び出し元にも影響します。


観点値型参照型
代表例intboolDateTime、構造体string、配列、クラス、List
代入値がコピーされる参照先がコピーされる
変更の影響基本的に別の変数へ影響しない同じオブジェクトを参照していると影響する
null通常は入れられない入れられる

11-4 参照先がないことを表すnull

Section titled “11-4 参照先がないことを表す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; } = "";
}

employeenull なので、Name プロパティを参照できません。

employeeがどのオブジェクトも指していない
employee.Name を取り出そうとしても、対象が存在しない
エラーになる

このようなエラーは、C#でよく起きるため注意が必要です。


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 を返すことがあります。


.NET 8のプロジェクトでは、設定によっては次のような警告が出る場合があります。

Employee employee = null;

これは、C#が「この変数はnullになる可能性があるが、本当に大丈夫か」と警告してくれているものです。

nullを許可したい場合は、次のように ? を付けます。

Employee? employee = null;

Employee? は、Employee オブジェクトまたは null が入る可能性があることを表します。

Employee? employee = FindEmployee(9999);

この書き方は、後のDB接続でも重要になります。


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 の可能性がある変数に対して、安全にプロパティやメソッドを呼び出したい場合、?. を使えます。

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

値型には通常nullを入れられない

Section titled “値型には通常nullを入れられない”

intDateTime などの値型には、通常 null を代入できません。

エラーになる例:

int salary = null;
DateTime hireDate = null;

int は整数値を持つ型であり、通常は「値がない」という状態を持てません。


値型でも、? を付けると null を入れられるようになります。

int? salary = null;
DateTime? hireDate = null;
decimal? commission = null;

これを null許容型 と呼びます。

通常の値型null許容型
intint?
decimaldecimal?
DateTimeDateTime?
boolbool?

次のコードを入力して実行してください。

using System;
class Program
{
static void Main()
{
int? salary = null;
if (salary == null)
{
Console.WriteLine("給与は未設定です。");
}
else
{
Console.WriteLine($"給与:{salary}");
}
}
}

実行結果:

給与は未設定です。

int? を使うと、整数または null を扱えます。


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 は実際の値を取り出します。

ただし、Valuenull の状態で使うとエラーになるため、必ず HasValue を確認してから使います。


?? を使うと、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 を使う

データベースでは、値が入っていないことを 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? を使う

この章でよくあるつまずきを確認します。

つまずき原因対応
構造体とクラスの違いが分からない見た目が似ている構造体は値型、クラスは参照型と考える
列挙型を使う意味が分からない文字列でも表現できてしまう決まった選択肢を安全に扱うために使う
値型の代入結果が分からない値がコピーされる感覚がないint の例で確認する
参照型の代入結果が分からない同じオブジェクトを参照している感覚がないEmployee クラスの例で確認する
メソッド内で値を変えたのに反映されない値型はコピーが渡されている値型と参照型の違いを確認する
null の意味が分からない空文字や0と混同しているnull は参照先がない状態
null の変数を使ってエラーになるオブジェクトが存在しないのにプロパティを参照しているif (変数 == null) で確認する
int salary = null; がエラーになるint は通常nullを持てないint? salary = null; と書く
Value を使ってエラーになるnullなのに値を取り出そうとしているHasValue を確認してから使う
string?Employee? が難しいnull許容参照型に慣れていないnullになる可能性を示す印と考える

次の項目について、自分で説明できるか確認してください。

  • 構造体とは何かを説明できる
  • struct を使って簡単な構造体を定義できる
  • DateTime が構造体であることを説明できる
  • 列挙型とは何かを説明できる
  • enum を使って列挙型を定義できる
  • 値型と参照型の違いをおおまかに説明できる
  • 値型を別の変数に代入したときの動きを説明できる
  • 参照型を別の変数に代入したときの動きを説明できる
  • new すると別のオブジェクトになることを説明できる
  • null が何を表すか説明できる
  • null かどうかを if 文で確認できる
  • Employee? のように、nullになる可能性がある参照型を表現できる
  • int? のようなnull許容型を使える
  • ?? を使ってnullの場合の代替値を指定できる

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

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

  1. 値型と参照型の違いは何ですか。
  2. int numberB = numberA; とした後に numberA を変更しても、numberB が変わらないのはなぜですか。
  3. Employee employeeB = employeeA; とした後に employeeA.Name を変更すると、employeeB.Name も変わることがあるのはなぜですか。
  4. null とは何ですか。
  5. intnull を入れたい場合、どのように書きますか。
  6. DBのNULLをC#で扱うとき、どのようなことに注意しますか。

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


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

制限時間は 70分 です。

時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。


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


課題11-1 EmployeeStatus列挙型を使う

Section titled “課題11-1 EmployeeStatus列挙型を使う”

社員の状態を表す EmployeeStatus 列挙型を作成してください。

値は次の3つとします。

Active
Retired
LeaveOfAbsence

EmployeeStatus.Active を変数に代入し、switch 文で日本語表示してください。

実行結果例:

在籍中です。

条件:

  • enum を使う
  • switch 文を使う
  • ActiveRetiredLeaveOfAbsence の3種類を用意する

課題11-2 値型の代入を確認する

Section titled “課題11-2 値型の代入を確認する”

int 型の変数を2つ用意し、値型の代入を確認してください。

実行結果例:

numberA:99
numberB:10

条件:

  • numberA10 を代入する
  • numberBnumberA を代入する
  • その後 numberA99 に変更する
  • numberB の値が変わらないことを確認する

課題11-3 参照型の代入を確認する

Section titled “課題11-3 参照型の代入を確認する”

Employee クラスを作成し、参照型の代入を確認してください。

実行結果例:

employeeA:佐藤花子
employeeB:佐藤花子

条件:

  • Employee クラスに EmployeeIdName を持たせる
  • employeeA を作成する
  • employeeB = employeeA; と代入する
  • employeeA.Name を変更する
  • employeeB.Name も変わることを確認する

社員検索を想定し、見つからなかった場合に 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 を使う

int? salary = null; を用意し、表示用給与として 0 を使ってください。

実行結果例:

表示用給与:0円

条件:

  • int? を使う
  • ?? を使う
  • salarynull の場合に 0 を表示する

課題11-9 DBデータを想定したEmployeeクラスを作る

Section titled “課題11-9 DBデータを想定したEmployeeクラスを作る”

後のDB接続編を想定し、次のプロパティを持つ Employee クラスを作成してください。

プロパティ名意味
EmployeeIdint社員ID
EmployeeNamestring社員名
Yomistring?よみがな
ManagerIdint?上司ID
HireDateDateTime入社日
Salarydecimal?給与
Commissiondecimal?歩合
DepartmentIdint部署ID

実行結果例:

社員ID:1020
社員名:内田雄介
よみがな:未設定
給与:200000
歩合:未設定

条件:

  • string?int?decimal? を使う
  • null の場合は "未設定" と表示する
  • 後のDB接続編で使うクラスの準備として考える

課題が終わったら、できたところまでをGitに提出します。

まず、現在の状態を確認します。

Terminal window
git status

変更されたファイルを追加します。

Terminal window
git add .

コミットします。

Terminal window
git commit -m "Chapter11 値型と参照型"

ファイルサーバー上のリポジトリへpushします。

Terminal window
git push

Gitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。


提出前に、次の項目を確認してください。

  • struct を使った構造体を作成できている
  • enum を使った列挙型を作成できている
  • 値型の代入結果を確認できている
  • 参照型の代入結果を確認できている
  • null かどうかを確認してからプロパティを参照している
  • Employee? のようなnull許容参照型を使っている
  • int?decimal? のようなnull許容型を使っている
  • ?? を使ってnullの場合の代替値を指定できている
  • インデントが整っている
  • Gitにcommitしている
  • Gitにpushしている

この章では、値型と参照型について学習しました。

この章で学んだ主な内容は次の通りです。

  • 構造体は struct で定義する
  • 構造体は値型である
  • DateTime も構造体である
  • 列挙型は enum で定義する
  • 列挙型を使うと、決まった選択肢を安全に扱いやすくなる
  • 値型は、代入すると値そのものがコピーされる
  • 参照型は、代入すると参照先がコピーされる
  • 複数の変数が同じオブジェクトを参照することがある
  • null は、参照先がない状態を表す
  • null の可能性がある変数を使う前には確認が必要である
  • Employee? のように書くと、nullになる可能性を表せる
  • int?decimal? を使うと、値型でもnullを扱える
  • ?? を使うと、nullの場合の代替値を指定できる
  • DBのNULLをC#で扱うときには、null許容型を意識する必要がある

次章では、List と LINQ を学習します。

配列より柔軟に複数のデータを扱える List<T> を使い、さらに LINQ による検索や絞り込みを学びます。
後のDB接続編では、DBから取得した複数件の社員情報を List<Employee> として扱うため、この章と次章の内容が重要になります。