.NET ヘルプ

C# Nullable Types (開発者のための仕組み)

チペゴ
チペゴ・カリンダ
2024年10月24日
共有:

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

C&numのNull可能型;

デフォルトでは、C#の値型(例:int、bool、DateTime)にはnull値を割り当てることができません。 この制限に対処するために、C#はnullable value typesを導入しており、値型にnullを割り当てることができます。nullable型は、有効な値が存在しないことを表す必要がある場合に特に有用です。

Nullable 型の宣言

C#でnull可能な型を宣言するには、以下の構文を使用します:

// Nullable type variable value
int? nullableInt = null;
// Nullable type variable value
int? nullableInt = null;
' Nullable type variable value
Dim nullableInt? As Integer = Nothing
$vbLabelText   $csharpLabel

ここでは、int? は Nullable の省略形です。 nullableInt変数は、int値またはnullを保持することができます。

nullチェック

null可能な型の変数に値があるかどうかを確認するには、HasValueプロパティを使用するか、変数を直接nullと比較します。 例えば:

if (nullableInt.HasValue)
{
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    Console.WriteLine("No value assigned.");
}
if (nullableInt.HasValue)
{
    Console.WriteLine("Value: " + nullableInt.Value);
}
else
{
    Console.WriteLine("No value assigned.");
}
If nullableInt.HasValue Then
	Console.WriteLine("Value: " & nullableInt.Value)
Else
	Console.WriteLine("No value assigned.")
End If
$vbLabelText   $csharpLabel

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

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

nullableInt が NULL の場合、結果にはデフォルト値の 0 が割り当てられます。

Nullable 値型 vs Nullable 参照型

C#では、値型(int、bool、doubleなど)は参照型(string、objectなど)と異なります。 Nullable値型は、値型がNULLを表すことを可能にし、Nullable参照型は、参照型がデフォルトで非NULLであることを可能にするため、NULL参照例外のリスクを低減します。

Nullable 値の型

NULL可能な値型は、値型がNULL値を取ることを可能にします。 NULL可能な値型を宣言するには、クエスチョンマーク ? をデータ型に置き換えてください:

double? nullableDouble = null;
double? nullableDouble = null;
Dim nullableDouble? As Double = Nothing
$vbLabelText   $csharpLabel

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

ヌル可能な参照型

ヌル参照型はC# 8.0で導入されました。プロジェクト・レベルで、またはコード・ファイルの先頭に#nullable enableディレクティブを追加して、NULL可能な参照型を有効にします。NULL可能な参照型を有効にすると、参照型がNULL可能であることを?

#nullable enable
string? nullableString = null;
#nullable enable
string? nullableString = null;
'INSTANT VB TODO TASK: There is no equivalent to #nullable in VB:
'#nullable enable
'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であることが許可されています。 を付けずにNULLでない参照型を宣言すると、NULL代入の可能性を検出した場合にコンパイラが警告を出します。

Nullable 参照型の有効化

プロジェクトでグローバルにNULL参照型を有効にするには、.csprojファイルに以下の行を追加します:

<Nullable>enable</Nullable>
XML

有効化すると、コンパイラーはデフォルトで参照型をnull不可として扱います。 この機能は、実行時ではなくコンパイル時にヌル参照の問題をキャッチするのに特に便利です。

実用的な例

NULL可能な型についての理解を深めるために、いくつかの実用的な例を探ってみましょう。

例 1: 値型を持つ Nullable 型

この例では、intでnull可能な型を使用します:

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

ここで、nullableInt は int の nullable 型変数です。 nullableIntがnullの場合、bはnull合体演算子により値10を得る。 それ以外の場合、bはnullableIntの値を取ります。

例2:ヌル可能な参照型

では、null可能な参照型がどのように機能するか見てみましょう:

#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        Console.WriteLine(nullableString?.Length ?? 0); // Use null coalescing operator
        Console.WriteLine(nonNullableString.Length);
    }
}
#nullable enable
class Program
{
    static void Main()
    {
        string? nullableString = null;
        string nonNullableString = "Hello";
        Console.WriteLine(nullableString?.Length ?? 0); // Use null coalescing operator
        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"
		Console.WriteLine(If(nullableString?.Length, 0)) ' Use null coalescing operator
		Console.WriteLine(nonNullableString.Length)
	End Sub
End Class
$vbLabelText   $csharpLabel

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

例 3: 入れ子になった Nullable 型

C#では、入れ子になったnull可能な型を宣言することができます。例えば

int?? nestedNullableInt = null;
int?? nestedNullableInt = null;
If(Integer, nestedNullableInt) = Nothing
$vbLabelText   $csharpLabel

入れ子になったnullable型は冗長に見えるかもしれませんが、C#では構文上有効です。 しかし、実際には、ネストされたnullable型は追加機能を提供せず、ほとんど使用されません。

Null Coalescing Operator(?)

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

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

この例では、nullableValue が null の場合、defaultValue に -1 が代入されます。それ以外の場合、defaultValueはnullableValueの値を取ります。

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

C#は、NULL参照型を有効にすると、コンパイル時にNULL代入の潜在的な問題を検出した場合に警告とエラーを出力します。 このようなコンパイル時のエラーは、問題を早期に発見し、コードをより堅牢にするのに役立ちます。

以下の例を考えてみてください:

string? nullableString = null;
string nonNullableString = nullableString; // Compiler warning
string? nullableString = null;
string nonNullableString = nullableString; // Compiler warning
'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 = nullableString ' Compiler warning
$vbLabelText   $csharpLabel

この場合、nullableStringをnonNullableStringに代入すると、nullableStringがnullである可能性があり、nullableでない型に代入すると実行時例外が発生する可能性があるため、コンパイラの警告が表示されます。

IronPDFでNull可能な型を使う

C# Nullable型 (開発者のための使い方):図1 - IronPDF: C# PDF ライブラリ

IronPDFは、開発者が.NETアプリケーションから直接PDFファイルを作成、編集、および操作するためのC# PDFライブラリです。 HTMLをPDFに変換したり、レポートを生成したり、複雑なドキュメント構造を処理したりできます。

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

using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type
        string? clientName = "Iron Dev";  // Nullable reference type
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("FinancialReport.pdf");
        Console.WriteLine("PDF Generated Successfully.");
    }
}
using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        int? optionalIncome = null;  // Nullable type
        string? clientName = "Iron Dev";  // Nullable reference type
        var renderer = new ChromePdfRenderer();
        string htmlContent = $@"
            <h1>Financial Report</h1>
            <p>Client Name: {clientName ?? "Unknown"}</p>
            <p>Income: {optionalIncome?.ToString() ?? "Data not available"}</p>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        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
'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
		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>"
		Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
		pdf.SaveAs("FinancialReport.pdf")
		Console.WriteLine("PDF Generated Successfully.")
	End Sub
End Class
$vbLabelText   $csharpLabel

C# Nullable Types(開発者向けの動作方法):図2 - コード出力の例

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

結論

C# Nullable Types(開発者向けの仕組み):図3 - IronPDFライセンスページ

C#のNullable型は、値型と参照型の両方でNULL値を処理するための強力なツールです。Nullable型を使用することで、Null参照例外を回避し、コードの堅牢性を向上させることができます。 新しいプロジェクトでは、コンパイル時エラー検出を活用するために、ヌル可能参照型を有効にし、ヌル合体演算子 (??) を使用してヌル可能型を扱う際にコードを簡素化してください。

IronPDF は、無料トライアルを提供しており、コミットメントを行う前にその機能を探索するのに役立ちます。 初期費用は一切かかりませんので、まずはお試しいただき、開発プロセスへの適合性をご確認ください。 準備ができたら、ライセンスは$749から始まります。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C# ConfigureAwait (開発者のための仕組み)
次へ >
C#命名規則(開発者のための仕組み)