フッターコンテンツにスキップ
.NETヘルプ

C#のNullable Types(開発者向けの仕組み)

C#を使用する場合、特に参照型ではnull値を扱う必要があることがよくあります。C#のnullable型は、値型に対して未定義または存在しない値を表現する方法を提供します。このガイドでは、C#のnullable型の基本、実際の使用法、およびさまざまなシナリオでの動作について説明します。 記事の後半では<IronPDFも探ります。

C#のNullable型

C#ではデフォルトで値型(例:int、bool、DateTime)にnull値を割り当てることはできません。 この制限に対処するために、C#はnullable値型を導入し、値型にnullを割り当てることができます。nullable型は、有効な値が欠如している場合に特に役立ちます。

Nullable型の宣言

C#でnullable型を宣言するには、次の構文を使用します。

// Declare a nullable integer
int? nullableInt = null;
// Declare a nullable integer
int? nullableInt = null;
' Declare a nullable integer
Dim nullableInt? As Integer = Nothing
$vbLabelText   $csharpLabel

ここで、int?Nullable<int>の短縮形です。 nullableInt変数は、int値またはnullのいずれかを保持できます。

nullを確認する

nullable型変数に値があるかどうかを確認するには、HasValueプロパティを使用するか、変数を直接nullと比較することができます。以下に示す通りです。

if (nullableInt.HasValue)
{
    // If nullableInt has a value, print it
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    // If nullableInt does not have a value, print a message
    Console.WriteLine("No value assigned.");
}
if (nullableInt.HasValue)
{
    // If nullableInt has a value, print it
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    // If nullableInt does not have a value, print a message
    Console.WriteLine("No value assigned.");
}
If nullableInt.HasValue Then
	' If nullableInt has a value, print it
	Console.WriteLine("Value: " & nullableInt.Value)
Else
	' If nullableInt does not have a value, print a message
	Console.WriteLine("No value assigned.")
End If
$vbLabelText   $csharpLabel

また、nullable型がnullの場合にデフォルト値を提供するために、null合体演算子(??)を使用することもできます。

// Assign 0 if nullableInt is null
int result = nullableInt ?? 0;
Console.WriteLine("Result: " + result);
// Assign 0 if nullableInt is null
int result = nullableInt ?? 0;
Console.WriteLine("Result: " + result);
' Assign 0 if nullableInt is null
Dim result As Integer = If(nullableInt, 0)
Console.WriteLine("Result: " & result)
$vbLabelText   $csharpLabel

もしnullableIntがnullの場合、resultにはデフォルト値の0が割り当てられます。

Nullable値型とNullable参照型

C#では、値型(int、bool、doubleなど)と参照型(string、objectなど)は異なります。 nullable値型は値型にnullを表現することを許可し、nullable参照型はデフォルトで参照型を非nullableにすることで、null参照例外のリスクを軽減します。

Nullable値型

nullable値型は、値型にnull値を取らせることを可能にします。 nullable値型を宣言するには、データ型に質問符?を追加します。

// Declare a nullable double
double? nullableDouble = null;
// Declare a nullable double
double? nullableDouble = null;
' Declare a nullable double
Dim nullableDouble? As Double = Nothing
$vbLabelText   $csharpLabel

この例では、nullableDoubleはdouble値またはnullを保持できます。

Nullable参照型

nullable参照型はC# 8.0で導入されました。プロジェクトレベルでnullable参照型を有効にするか、コードファイルの先頭に#nullable enableディレクティブを追加することで有効にできます。nullable参照型が有効化されている場合、参照型は?を使用して明示的にnullableとしてマークする必要があり、null参照による潜在的な実行時例外を回避するのに役立ちます。

#nullable enable
// Declare a nullable string
string? nullableString = null;
#nullable enable
// Declare a nullable string
string? nullableString = null;
'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
' Declare a nullable string
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = Nothing
$vbLabelText   $csharpLabel

ここで、nullableStringはnullを許可されています。 ?を付けずに非nullable参照型を宣言した場合、コンパイラは潜在的なnull代入を検出した場合に警告を出すでしょう。

Nullable参照型の有効化

プロジェクト全体でnullable参照型を有効にするには、.csprojファイルに次の行を追加します。

<Nullable>enable</Nullable>
<Nullable>enable</Nullable>
XML

一旦有効化されると、コンパイラはデフォルトで参照型を非nullableとして扱います。 この機能は、実行時ではなくコンパイル時にnull参照の問題を検出するのに特に便利です。

実用的な例

nullable型の理解を深めるためにいくつかの実用的な例を見てみましょう。

例1: 値型とNullable型

この例では、intを使用したnullable型を使用します。

class Program
{
    static void Main(string[] args)
    {
        int? nullableInt = null;
        // Use null coalescing operator to assign a default value
        int b = nullableInt ?? 10;
        Console.WriteLine("b: " + b);
        if (nullableInt.HasValue)
        {
            // nullableInt has a value
            Console.WriteLine("nullableInt has value: " + nullableInt.Value);
        }
        else
        {
            // nullableInt is null
            Console.WriteLine("nullableInt is null");
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        int? nullableInt = null;
        // Use null coalescing operator to assign a default value
        int b = nullableInt ?? 10;
        Console.WriteLine("b: " + b);
        if (nullableInt.HasValue)
        {
            // nullableInt has a value
            Console.WriteLine("nullableInt has value: " + nullableInt.Value);
        }
        else
        {
            // nullableInt is null
            Console.WriteLine("nullableInt is null");
        }
    }
}
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim nullableInt? As Integer = Nothing
		' Use null coalescing operator to assign a default value
		Dim b As Integer = If(nullableInt, 10)
		Console.WriteLine("b: " & b)
		If nullableInt.HasValue Then
			' nullableInt has a value
			Console.WriteLine("nullableInt has value: " & nullableInt.Value)
		Else
			' nullableInt is null
			Console.WriteLine("nullableInt is null")
		End If
	End Sub
End Class
$vbLabelText   $csharpLabel

ここで、nullableIntはintのnullable型変数です。 nullableIntがnullの場合、bはnull合体演算子によって10の値を取ります。 そうでなければ、bnullableIntの値を取ります。

例2: Nullable参照型

次に、nullable参照型がどのように機能するか見てみましょう。

#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        // Use null coalescing operator to provide a default value for length
        Console.WriteLine(nullableString?.Length ?? 0);
        Console.WriteLine(nonNullableString.Length);
    }
}
#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        // Use null coalescing operator to provide a default value for length
        Console.WriteLine(nullableString?.Length ?? 0);
        Console.WriteLine(nonNullableString.Length);
    }
}
'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
Friend Class Program
	Shared Sub Main()
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
		Dim nullableString As String = Nothing
		Dim nonNullableString As String = "Hello"
		' Use null coalescing operator to provide a default value for length
		Console.WriteLine(If(nullableString?.Length, 0))
		Console.WriteLine(nonNullableString.Length)
	End Sub
End Class
$vbLabelText   $csharpLabel

上記のコードでは、nullableStringはnullになる可能性があり、null合体演算子はそれがnullの場合、文字列の長さをデフォルトで0にします。

例3: ネストされたNullable型

C#はネストされたnullable型を宣言することを許可しています。例:

// Redundant, but syntactically valid
int? nestedNullableInt = null;
// Redundant, but syntactically valid
int? nestedNullableInt = null;
' Redundant, but syntactically valid
Dim nestedNullableInt? As Integer = Nothing
$vbLabelText   $csharpLabel

ネストされたnullable型は冗長に見えるかもしれませんが、C#では文法的に有効です。 ただし、実際には、ネストされたnullable型は追加の機能を提供せず、滅多に使用されません。

Null合体演算子(??)

null合体演算子(??)は、nullable型がnullの場合にデフォルト値を提供するために頻繁に使用されます。 この演算子は、明示的なif-elseチェックを避けつつコードを簡潔にします。

int? nullableValue = null;
// Assign -1 if nullableValue is null
int defaultValue = nullableValue ?? -1;
int? nullableValue = null;
// Assign -1 if nullableValue is null
int defaultValue = nullableValue ?? -1;
Dim nullableValue? As Integer = Nothing
' Assign -1 if nullableValue is null
Dim defaultValue As Integer = If(nullableValue, -1)
$vbLabelText   $csharpLabel

この例では、nullableValueがnullの場合、defaultValueに-1が割り当てられます。そうでなければ、defaultValueにはnullableValueの値が入ります。

コンパイル時エラーとNullable型

nullable参照型が有効化された状態では、C#はコンパイル中に潜在的なnull代入の問題を検出すると警告やエラーを生成します。 これらのコンパイル時エラーは、問題を早期に発見し、コードをより堅牢にします。

次の例を考えてみましょう。

string? nullableString = null;
// This will produce a compiler warning because nullableString may be null
string nonNullableString = nullableString;
string? nullableString = null;
// This will produce a compiler warning because nullableString may be null
string nonNullableString = nullableString;
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? nullableString = null;
Dim nullableString As String = Nothing
' This will produce a compiler warning because nullableString may be null
Dim nonNullableString As String = nullableString
$vbLabelText   $csharpLabel

この場合、nullableStringnonNullableStringに代入すると、nullableStringがnullになる可能性があるため、コンパイラ警告が発生します。非nullable型に代入することは実行時例外を引き起こす可能性があるためです。

IronPDFでのNullable型の使用

C# Nullable Types: 図1 - IronPDF: C# PDFライブラリ

IronPDFは、開発者が.NETアプリケーションから直接PDFファイルを作成、編集、および操作するのに役立つC# PDFライブラリです。 HTMLをPDFに変換したり、レポートを生成したり、複雑な文書構造を扱ったりすることができます。

nullable型は、特に不完全な財務データを持つ会計士のためにPDFを生成する場合など、動的レポート生成シナリオにおいて役立ちます。 nullable型を使用することで、オプションのフィールドを管理し、例外を回避し、デフォルト値を提供できます。

using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type for optional income
        string? clientName = "Iron Dev";  // Nullable reference type for client name
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        // Render the HTML to a PDF
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        // Save the PDF to disk
        pdf.SaveAs("FinancialReport.pdf");
        Console.WriteLine("PDF Generated Successfully.");
    }
}
using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type for optional income
        string? clientName = "Iron Dev";  // Nullable reference type for client name
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        // Render the HTML to a PDF
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        // Save the PDF to disk
        pdf.SaveAs("FinancialReport.pdf");
        Console.WriteLine("PDF Generated Successfully.");
    }
}
Imports IronPdf
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim optionalIncome? As Integer = Nothing ' Nullable type for optional income
'INSTANT VB WARNING: Nullable reference types have no equivalent in VB:
'ORIGINAL LINE: string? clientName = "Iron Dev";
		Dim clientName As String = "Iron Dev" ' Nullable reference type for client name
		Dim renderer = New ChromePdfRenderer()
		Dim htmlContent As String = $"
            <h1>Financial Report</h1>
            <p>Client Name: {If(clientName, "Unknown")}</p>ignoreignore<p>Income: {If(optionalIncome?.ToString(), "Data not available")}</p>"
		' Render the HTML to a PDF
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
		' Save the PDF to disk
		pdf.SaveAs("FinancialReport.pdf")
		Console.WriteLine("PDF Generated Successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Nullable Types: 図2 - 例のコード出力

このコードでは、nullable型(int?string?)が使用されており、データが欠落していても安全に処理できます。 null合体演算子(??)は、データが欠けている場合にデフォルト値がPDFに使用されることを保証します。

結論

C# Nullable Types: 図3 - IronPDFライセンスページ

C#におけるnullable型は、値型および参照型に対するnull値の処理において強力なツールです。nullable型を使用することで、null参照例外を回避し、コードの堅牢性を向上させることができます。 新しいプロジェクトではnullable参照型を有効にしてコンパイル時エラーチェックの恩恵を受け、nullable型を扱う際にはnull合体演算子(??)を使用してコードを簡素化することを心がけましょう。

IronPDFは無料トライアルを提供しており、実際に利用して機能を確認する機会を提供します。 費用なしで、試験的に機能を試すことができ、開発プロセスにどのように適合するかを確認できます。 準備が整ったら、ライセンスはfrom $liteLicenseから始まります。

よくある質問

nullable型は動的なPDF生成でどのように利用できますか?

nullable型は、IronPDFのようなライブラリを使用して、オプションフィールドを安全に表現することで、動的なPDF生成において重要です。これにより、データが欠落している場合も適切に処理され、必要に応じてデフォルト値が提供されます。

C#でnullable型を宣言するための文法は何ですか?

C#では、データ型に疑問符 '?' を付けることでnullable型を宣言できます。例えば、nullableな整数を宣言するには、int? nullableInt = null;と書きます。

C#のnullable型は生成されるレポートの堅牢性に影響を与えることがありますか?

はい、nullable型を使用することで、値が欠落している場合にオプションフィールドがエラーを引き起こさないようにすることで、生成されるレポートの堅牢性を高めることができます。IronPDFのようなライブラリは、これらの条件を効率的に管理するためにnullable型を利用できます。

nullable参照型はランタイムエラーを防ぐのにどのように役立ちますか?

C# 8.0で導入されたnullable参照型は、参照型がデフォルトでnull許容でないようにすることで、ランタイムエラーを防ぎます。これにより、null参照例外のリスクが減少し、コンパイル中に潜在的な問題を早期に発見することができます。

nullable型を管理する際のnull合体演算子の役割は何ですか?

null合体演算子 ?? は、nullable型がnullの場合にデフォルト値を提供することでnullable型の管理に使用されます。これによりコードが簡素化され、明示的なif-elseチェックを避けることができます。

C#でnullable型に値があるかどうかをどのように確認できますか?

C#では、HasValueプロパティを使用するか、変数を直接nullと比較することで、nullable型に値があるかどうかを判定できます。

C#アプリケーションでnullable型を使用する典型的なシナリオにはどのようなものがありますか?

Nullable型は、データが不完全またはオプショナルである可能性がある状況、例えばフォーム入力、設定、またはnull値を許可するデータベースとのインターフェースでよく使用されます。IronPDFのようなライブラリを使用して動的レポート生成に特に便利です。

nullable参照型の有効化はC#プロジェクトのコンパイルにどのように影響しますか?

C#プロジェクトでnullable参照型を有効にすることで、潜在的なnull参照問題に対するコンパイル時警告とエラーが発生し、問題を早期に発見してより堅牢なコード開発を促進します。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。