型名の後ろに"?" がある - null を許容する型の宣言 Nullable型の利用 - C#
概要
C#で型名の後ろに"?"記号がついているコードの紹介です。
型名の後ろの"?"はなに?
型名の後ろに"?" がついている場合、null を許容する型であるNullable型になります。
Nullable型とは
C# 2.0以降ではnullを許容できる、Nullable型を利用できます。Nullable型を利用することで、Nullの値をとることができない値型の変数(int, char, byte, DateTimeなど)にNULLの値をとらせることができます。
書式
または
System.Nullable<(型名)> (変数名)
型名の直後に"?"を記述するとNullable 型となります。System.Nullable を利用する書式も可能です。
プログラム例
UI
下図のUIを作成します。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NullableDemo
{
public partial class FormStandardDemo : Form
{
public FormStandardDemo()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int? nint = null; //nullable型
//System.Nullable<int> nint = null; //int? と同義
int nnint = 0;
nint = 3;
nnint = 4;
textBox1.Text = Convert.ToString(nint + nnint);
}
private void button2_Click(object sender, EventArgs e)
{
int? nint = null; //nullable型
int nnint = 0;
nnint = 4;
textBox1.Text = Convert.ToString(nint + nnint);
}
private void button3_Click(object sender, EventArgs e)
{
int? nint = null; //nullable型
System.Nullable<int> nint2 = null; //int? と同義
int nnint = 0;
//int X = nint; //コンパイルエラー
int X = (int)nint; //ninit が nullの場合は実行時エラー
nint2 = nint; //OK
nint = nnint; //OK
}
}
}
解説
Nullable型の変数は"(型名)?"と宣言します。または"System.Nullable<型名>"と宣言します。Nullable型からNullableでない型へ変換する場合は明示的なキャストを用います。Nullableでない型からNullable型への変換は代入で暗示的に変換されます。
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
[button1]をクリックします。計算結果の"7"が表示されます。
[button2]をクリックします。実行時エラーは発生せず、テキストボックスには何も表示されません。
[button3]をクリックします。実行時エラーが発生します。
補足: nullとの演算
下記コードで、nullに4を加算した値をresult に代入しています。nullに数値を加算した場合の結果はnullとなり、実行時エラーにはなりません。
int? nint = null; //nullable型
int nnint = 0;
int? result;
nnint = 4;
result = nint + nnint;
textBox1.Text = Convert.ToString(result);
なお、nullに4を加算したものはnullとなるため、Nullableでない型に演算結果を代入することはできず、コンパイルエラーになります。
int? nint = null; //nullable型
int nnint = 0;
int result;
nnint = 4;
result = nint + nnint;
textBox1.Text = Convert.ToString(result);
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2009-10-07
改訂日: 2021-01-24