English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 可変長型(Nullable)

値型には null を割り当てることができません。例えば、int i = null コンパイル時エラーが発生します。

c# 2.0 で可空型が導入され、値型変数に null を割り当てることができます。Nullable<t> を使用して可空型を宣言できます。ここで T は型です。

可空类型の定義

Nullable<int> i = null;

可空型はその基本値型の正しい値範囲を表すことができますが、追加で空値も表します。例えば、Nullable < int > は、 -2147483648 まで 2147483647 のどの値でも、または null 値です。

Nullable 类型は System.Nullable < t > struct のインスタンスです。

[Serializable]
public struct Nullable<T> where T : struct
{        
    public bool HasValue { get; }
      
    public T Value { get; }
        
    // 他の実装
}

Int 型の nullable は通常の int 型と同じですが、値があるかどうかを示すフラグが追加されています。それ以外はすべてコンパイラのマジックで、null を有効な値として扱います。

static void Main(string[] args)
{
    Nullable<int> i = null;
    if (i.HasValue)
        Console.WriteLine(i.Value); // 或 Console.WriteLine(i)
    else
        Console.WriteLine("Null");
}
出力:
Null

オブジェクトに値が割り当てられている場合、trueを返します;値が割り当てられていないまたはnull値が割り当てられている場合、falseを返します。

NullableType.value 型がnullまたは値が割り当てられていない場合、NullableType.valueを使用して値にアクセスするとランタイムエラーが発生します。たとえば、iがnullの場合、値にアクセスすると例外が発生します:

可空型の無効使用

nullでない場合 GetValueOrDefault() メソッドを使用して実際の値を取得します;nullの場合はデフォルト値を使用します。たとえば:

static void Main(string[] args)
{
    Nullable<int> i = null;
    Console.WriteLine(i.GetValueOrDefault()); 
}

可空型の簡略表記法

「?」演算子を使用して、int ?, long?などのNullable <T>を使用しないでシンプルな表記にすることができます。

int? i = null;
double? D = null;

Null 合并演算子( ?? )

「??」演算子を使用して、nullになる可能性のある型をnullでない型に割り当てます。

int? i = null;
            
int j = i ?? 0;
Console.WriteLine(j);
出力:
0

上記の例では、iはnullになる可能性のあるintで、それをnullでないint jに割り当てる場合、iがnullの場合はランタイムエラーが発生します。したがって、例外が発生するリスクを減らすために、「??」演算子を使用し、iがnullの場合は0をjに割り当てます。

using System;
namespace CalculatorApplication
{
   class NullablesAtShow
   {
         
      static void Main(string[] args)
      {
         
         double? num1 = null;
         double? num2 = 3.14157;
         double num3;
         num3 = num1 ?? 5.34;      // num1 空値の場合は返します 5.34
         Console.WriteLine("num3 の値: {0}", num3);
         num3 = num2 ?? 5.34;
         Console.WriteLine("num3 の値: {0}", num3);
         Console.ReadLine();
      }
   }
}

出力結果:

num3 の値: 5.34
num3 の値: 3.14157

代入規則

null型の代入規則は値型の代入規則と同じです。関数内でnull型をローカル変数として宣言する場合、使用する前に代入する必要があります。それがどのクラスのフィールドである場合、デフォルトでは空値があります。

たとえば、以下のint型のnullableを宣言し、値を割り当てずに使用します。コンパイラは出力します「未分配のローカル変数 'i' を使用しています」エラー:

未分配の nullable 型エラー

以下の例では、int 型の nullable がこのクラスのフィールドであり、エラーが発生しません。

class MyClass
{
    public Nullable<int> i;
}
class Program
{
    static void Main(string[] args)
    {
        MyClass mycls = new MyClass();
        if (mycls.i == null)
            Console.WriteLine("Null");
    }
}
出力:
Null

Nullable クラスの比較メソッド

Null は他のどの値よりも小さいと見なされます。したがって、比較演算子は null に対して使用できません。以下の例では、i は j より小さくも大きくもなく、j に等しくありません:

static void Main(string[] args)
{
    int? i = null;
    int j = 10;
    if (i < j)
        Console.WriteLine("i < j");
    else if (i > 10)
        Console.WriteLine("i > j");
    else if (i == 10)
        Console.WriteLine("i == j");
    else
        Console.WriteLine("比較不可");
}
出力:
比較不可

Nullable 静的クラスは Nullable 型の補助クラスです。可空型の比較メソッドを提供しており、GetUnderlyingType メソッドも持ちます。これは可为nullの型の基本型パラメータを返します。

static void Main(string[] args)
{
    int? i = null;
    int j = 10;
    if (Nullable.Compare<int>(i, j) < 0)
        Console.WriteLine("i < j");
    else if (Nullable.Compare<int>(i, j) > 0)
        Console.WriteLine("i > j");
    else
        Console.WriteLine("i = j");
}
出力:
i < j

可空型の特性

  1. 可空型は値型と一緒に使用できます。

  2. Value が null である場合、Value プロパティは InvalidOperationException をスローします;それ以外の場合は値を返します。

  3. 変数が値を含んでいる場合、HasValue 属性は true を返します;null である場合、false を返します。

  4. == と != 运算子は null が許される型と一緒に使用できます。他の比較には Nullable 静的クラスを使用してください。

  5. ネストされた可変長型の使用は許可されていません。Nullable <Nullable <int >> i; はコンパイル時エラーを返します。

 覚えておくべきポイント

  1. Nullable <T>型は、値型にnullを割り当てることを許可します。

  2. 演算子はNullable型の短縮記法です。

  3. 可変長型の値を取得するにはvalue属性を使用します。

  4. 使用HasValue属性が値に値を割り当てるかどうかを確認します。可変長空の型

  5. 静的Nullableクラスは、可変長型を比較するためのヘルパークラスです。