こんにちは、mickです。
仕事で C# を触ってます。
慣れない言語を触るときに、知っておいたほうがいいのが変数の初期値のこと。厳密には「既定値」といって、「プログラミング言語で、あらかじめ決められている値」。これは、「初期値」とはニュアンスが違います。英語では、既定値は default value 、初期値は、initial value と明確に違います。
ここでは、C# の既定値(初期値)について書いています。ざっくり言うと、0(ゼロ)か null(ヌル)です。
フィールド変数は既定値で初期化される
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CS_default_values
{
class Program
{
public struct A
{
public string str;
public int number;
}
public string str;
public int number;
public double dNumber;
public bool isYour;
public char ctr;
public A aa = new A();
enum nm
{
CCC
}
static void Main(string[] args)
{
Program pp = new Program();
Console.WriteLine(pp.str); // null
Console.WriteLine(pp.str==null); // True
Console.WriteLine(pp.number); // 0
Console.WriteLine(pp.dNumber); // 0
Console.WriteLine(pp.isYour); // False
Console.WriteLine(pp.ctr); // '\0'
Console.WriteLine(pp.ctr=='\0'); // True
Console.WriteLine(pp.aa.str); // null
Console.WriteLine(pp.aa.number); // 0
Console.WriteLine(nm.CCC); // CCC
Console.ReadKey();
}
}
}
C# の場合、フィールド変数は、既定値(C# で決まった値)で初期化してくれます。
それがこちら。
種類 | 既定値 |
任意の参照型 | null |
組み込み整数数値型(sbyte, byte, short , ushort , int, uint , long, nint) | 0 (ゼロ) |
組み込み浮動小数点数値型(float, double, decimal) | 0 (ゼロ) |
bool | false |
char | ‘\0’ (U+0000) |
enum | 式 (E)0 によって生成される値。E は列挙型識別子。 |
struct のフィールド | すべての値型フィールドは既定値に設定。すべての参照型フィールドは null に設定 |
任意の null 許容値型 | HasValue プロパティが false で、Value プロパティが未定義のインスタンス。 その規定値は、null 許容値型の “null” 値とも呼ばれる |
ローカル変数には、既定値式を使えばエラーにならない
C# はローカル変数に値を代入しない状態で使おうとすると、エラーになります。こういうときには、「既定値式」という「default 演算子」を使えば OK。
int a = default(int);
string str = default(string);
C# 7.1 以降は、default リテラルが使えます。
int a = default;
string str = default;
なお、C# 10 以降は、これらを使って型の既定値を生成する方がいいようです(特に struct )。
また、var の”暗黙的な” パラメーターなしのコンストラクターによっても、値型の既定値が生成されます。
var n = new System.Numerics.Complex();
Console.WriteLine(n); // output: (0, 0)
まとめ。
C# の型の初期値(既定値)を紹介しました。
改めて、「既定値」と「初期値」は違うんだよなぁと再確認。プログラミングでは、変数にどんな値が入っているかは、当然重要なので、この既定値を抑えておくのはマストですね。
記事を読んでくれて嬉しいです。
今日もありがとうございました。
初稿 2021/11/11