C# の型の初期値(既定値)はこれ

C# Tips PROGRAMMING

こんにちは、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 (ゼロ)
boolfalse
char‘\0’ (U+0000)
enum式 (E)0 によって生成される値。E は列挙型識別子。
struct のフィールドすべての値型フィールドは既定値に設定。すべての参照型フィールドは null に設定
任意の null 許容値型HasValue プロパティが false で、Value プロパティが未定義のインスタンス。 その規定値は、null 許容値型の “null” 値とも呼ばれる
C# 型の既定値 (C# リファレンス) | Microsoft

ローカル変数には、既定値式を使えばエラーにならない

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