2020年11月04日
川俣晶の縁側ソフトウェアC# コーディング How To total 1002 count

【入門級】値を参照できるが代入できない名前を定義する3つの方法

Written By: 川俣 晶連絡先

 サンプルソースのクラスのメンバーN1,N2.N3はいずれも値を持っていますが代入できません。

 しかし、機能に細かい違いがあります。

 N1はconstを利用した例です。constを使って値を定義すると絶対に変更できません。ですから、常にstatic扱いで型名を経由して使います。

 N2はreadonlyを利用した例です。例外的にコンストラクタでのみ書き換えられます。オブジェクト作成時に値が確定する使い方ができます。

 N3はgetのみのプロパティを使用した例です。この場合、値は値を取得する時点で確定します。N3への代入はできませんが、N3の値は可変にできます。

罠の数々 §

  • C#9からは、【初期化の場合のみ書き込みができるプロパティ】も定義可能になる。これはnew C(){N3=xxx}のような書式で値を設定でき、かつそのあとは代入できないプロパティを宣言可能とする
  • constを使った方法はいくら利用してもメモリ消費量は増えない (数値の定数を書いた場合とメモリ消費量は同じ)
  • readonlyを使った方法は基本的に変数宣言なので、変数宣言と同じペースでメモリを消費する
  • プロパティを使った方法がどれぐらいのメモリを使うのかはget節の実装内容次第

参考リンク §

const (C# リファレンス)

readonly (C# リファレンス)

get (C# リファレンス)

 constとreadonlyの違いを把握することは重要だ。上記のconstとreadonlyのリンクの先でも、constとreadonlyの違いは説明されている。上記のリンクを辿って確認してみよう。

リポジトリ §

https://github.com/autumn009/cshowto

Const §

using System;

class Program

{

    class C

    {

        public const int N1 = 123;

        public readonly int N2;

        public int N3 { get => N1 + N2; }

        public C()

        {

            N2 = 456;

        }

    }

    static void Main()

    {

        var obj = new C();

        Console.WriteLine($"N1={C.N1}");

        Console.WriteLine($"N2={obj.N2}");

        Console.WriteLine($"N3={obj.N3}");

    }

}

実行結果

N1=123

N2=456

N3=579

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?