初めてのクラス実装

プログラミングC# 第6版 3.2


ようやくクラスの話に来ました。

まずはシンプルなクラスを定義してみます。

using System;

class CSample {
    public string str {
        get;
        set;
    }
}

class Program {
    static void Main () {
        CSample obj = new CSample();
        obj.str = "hello";
        
        Console.WriteLine(obj.str);
    }
}
$ main
hello

さてひとつずつ見ていきましょう。C++と比較しながら見ると理解が深まりそうですね。

まずC++でメンバ変数と呼んでいたものはC#ではプロパティと呼ぶそうです。strがそれですね。

そしてプロパティはデフォルトではprivateになってしまうので宣言の前にpublicと付けると外部に公開できる状態になります。

次にget,setですが、これはstrプロパティへの読み込み(get)と書き込み(set)を許可させるためのもののようです。

これらをgetアクセサ、setアクセサと呼ぶそうです。そしてこれは省略が可能とのことらしいです。

実際に試してみます。

using System;

class CSample {
    public string str;
}

上記のように書いてもちゃんとコンパイルが通りました。これだけ見るとほぼC++と変わらないですね。

get,setアクセサを明示的に書く利点として、個別にアクセス制限をかけることが可能らしいです。

これも試してみます。

using System;

class CSample {
    public string str {
        get;
        private set; // 個別にprivateしてみる
    }
}

class Program {
    static void Main () {
        CSample obj = new CSample();
        obj.str = "hello"; // ここで書き換えてみると・・・
        
        Console.WriteLine(obj.str);
    }
}
$ csc main.cs
Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.1
for Microsoft (R) .NET Framework version 3.5
Copyright (C) Microsoft Corporation. All rights reserved.

main.cs(13,3): error CS0272: set アクセサにアクセスできないため、プロパティまたはインデクサ 'CSample.str' はこのコンテキストでは使用できません。

見事コンパイルエラーになりました。

これは便利ですね。C++の場合はいちいちGetStrのような関数を定義しないといけなかったのでこのプロパティへのアクセサ機能は便利だと言わざるを得ません。


最後にひとつ気になったんですが、CSampleをnewしているのにdelete?でメモリの開放をしていませんね。

これが本の冒頭で書いていたガベージコレクションというやつなんでしょうか。

とりあえずC#ではnewで確保したものを開放(を意識)する必要は無い、ということで先を進めていきます。