『スラスラわかるC#』第4章 読書メモ

スラスラわかるC# (Beginner’s Best Guide to Programmin)

パーシャルクラス

C# 2.0以上では、クラス定義時にpartialというキーワードを付けることで、クラス定義を複数に分割できる。それぞれのクラス定義は別ファイルにあってもよいが、全ての分割された定義にpartialキーワードを付けなければならない。

using System;

namespace Sample
{
    partial class Complex
    {
        public double re;
        public double im;
    }

    partial class Complex
    {
        public double Abs()
        {
            return Math.Sqrt(re * re + im * im);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Complex c = new Complex();
            c.re = 3;
            c.im = 4;
            Console.WriteLine("{0}", c.Abs()); // 5
        }
    }
}

パーシャルメソッド

C# 3.0以上では、パーシャルクラス内でメソッドの宣言時にpartialキーワードを付けることで、メソッドの宣言と定義を分けることができる(パーシャルメソッド)。制限は以下のとおり。

  • privateであること
  • 戻り値はvoidであること
using System;

namespace Sample
{
    partial class Program
    {
        static void Main(string[] args)
        {
            OnBegin();
            OnEnd();
        }

        static private void OnBegin();
        static private void OnEnd();
    }
}

パーシャルメソッドは、宣言のみで実装が与えられていない場合、コンパイル後の実行ファイルからは、呼び出し自体が削除される。そのため、同様の機能をイベントなどを使って実装するのに比べて、パフォーマンスに優れている。

クラスと構造体

様々な種類の値を格納する複合型としては、クラスと構造体の2種類がある。複合型としては、原則としてクラスを使うべき。構造体を使うのは、以下の条件が満たされる場合に限られる。

  • データのサイズが小さい(目安は16バイト以下)
  • 絶対に継承しないと分かっている
  • 変数への代入がコピーを生むというのが許容できる

constとreadonly

const readonly
ローカル変数にも使える クラスのフィールドのみ
常に静的メンバー扱い staticの有無を変えられる
宣言時にのみ初期化可能 コンストラクター内で値を書き換え可能
コンパイル結果はリテラルと同等 コンパイル結果は変数と同等
インスタンスをnewで生成するようなものには使えない newで生成可能

円周率のように絶対に値が変わらない値以外は、public constなメンバー変数にすべきではない。変更の可能性があるpublicな定数は、constではなくreadonlyを使うか、getのみをもつ静的プロパティとして定義すべき。

コンストラクター

C#では、クラス名と同じ名前のメソッドがコンストラクターになる。

初期化子

クラスのフィールドに初期値を与えるには、変数初期化子を用いるやり方と、コンストラクター初期化子を用いるやり方がある。コンストラクター初期化子を使うことで、あるコンストラクターから別のコンストラクターを呼ぶことができる。

using System;

namespace Sample
{
    class Person
    {
        // 変数初期化子
        public string name = "var";
        public byte age = 0;

        // コンストラクター初期化子
        public Person()
            : this("con", 1)
        {
        }

        public Person(string name, byte age)
        {
            this.name = name;
            this.age = age;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var p = new Person();
            Console.WriteLine(p.name);
        }
    }
}

デストラクター

C#では、クラス名に「~(チルダ)」をつけたメソッドがデストラクターになる。デストラクターはインスタンスが破棄されるタイミングで実行されるが、いつインスタンスが破棄されるかは分からない。いつ実行されるか分からないという性質の扱いづらさから、デストラクターはあまり利用されない。

アクセシビリティ

C#には以下のアクセシビリティがある。

アクセシビリティ 説明
public どこからでもアクセス可能
protected クラス内部と、派生クラスの内部からのみアクセス可能
internal 同一プロジェクト内のクラスからのみアクセス可能
protected internal 同一プロジェクト内のクラス内部、または派生クラスの内部からのみアクセス可能
private クラス内部からのみアクセス可能

プロパティ

C#では、外部からはフィールドのように見え、内部ではメソッドとして実装されている「プロパティ」を定義できる。

using System;

namespace Sample
{
    class Person
    {
        private string name;

        public string Name
        {
            set { this.name = value; }
            get { return this.name; }
        }

        // プロパティの自動実装(機能は上で定義したnameプロパティと同じ)
        public byte Age { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var p = new Person();
            p.Name = "john";
            p.Age = 20;
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Age);
        }
    }
}

静的コンストラクター

通常のコンストラクターは、クラスのインスタンスが生成されるたびに実行されるが、staticをつけて静的コンストラクターとして宣言すると、そのインスタンスが最初に参照されたときに1回だけ実行される。

静的クラス

クラス定義時にstaticをつけることで、静的メンバーのみをもつ静的クラスを定義できる。

コメントを残す

コメントを残す