クラス -static なメンバ-

ホームC#プログラミング応用講義 > static なメンバ

目次

生成必要なし

static というキーワードがしばしば見られます。これを詳しく解説します。
まず、このキーワードを解説するのに最もわかりやすいのが「生成必要なし」という説明です。

クラスの中に定義されたメンバにアクセスするには「オブジェクトの生成」が必要です。
new ClassName()
これがクラスという設計図からオブジェクトという実態を作り出す重要なコードです。

クラスは設計図ですからそのメンバにアクセスするのにオブジェクト生成を省くことはできません。車からハンドルをはずすことはできても、車の設計図からハ ンドルをはずすことはできません。とにもかくにも、車を作る必要があります。

しかし、車を作るにはかなりの労力が要ります。同じようにオブジェクトを生成するにはメモリを消費することになります。
普通のオブジェクトを利用するなら、多少のメモリを消費しても単体でサクサク動くので「資源の無駄遣い」 と悪口を言われることはないのですが、いろいろな ところで利用される変数などは、その変数を利用するために逐次オブジェクトを生成する必要があります。
class A
{
string str;
:
}

class B
{
A a = new A();
A.str = "・・・";
:
}

class C
{
A a = new A();
A.str = "・・・";
:
}
上に述べた説明の例です。
A クラスの str 変数を他のクラス B ,C で利用しようとすると、str 以外のメンバも含む A クラスのオブジェクトをいちいち生成し なければなりません。
しかし実際には str 以外のメンバは利用しません。これは明らかに「天然資源の無駄遣い」と言われてもおかしくないことです。

ここで「生成必要なし」を思い出します。生成の必要さえなければ、生成するこ となく str にアクセスできれば全く無駄がないことになります。
この機能を実装してくれるのが
static
キーワードです。

static は上のような例だけでなく、Main() にも何気なく付いています。
これは Main() がプログラムの1番始めに呼び出されるため、オブジェクトを生成してから呼び出すこ とはできません
このような場合にも static を利用することができます。

他にも
System.Math クラス
には数多くの static メンバが定義されています。これにより、円周率πを取得するプロパティや、xのy乗を求めるメソッドなどのためにオブジェクトを生成する必要がないので す。
(Math.PI  /  Math.Pow(x, y)  とアクセス可能)

利用法

using System;

class Circle
{
public static double pi = 3.14159265358979323846;
}

class Sample
{
public static void Main(string[] args)
{
double r = 12.3;

double s = Math.Pow(r,2) * Circle.pi;
Console.WriteLine("半径{0}の円の面積は{1}です",r,s);
}
}
始めに言いますが、このプログラムは推奨されないプログラムです。
Circle クラスで円周率πの限りなく精巧な値を変数 pi に代入していますが、 実際のプログラムでは
System.Math.PI
というプロパティにこれと同じ値が入っているのでこちらを利用したほうがいいです。

このプログラムでは2つの static メンバを利用しています。1つは自分で定義した pi で、もう1つは Math クラスに定義された Pow() メソッドです。
前回 static の効用に関しては説明しているので、注意点だけ説明しておきましょう。

public
このキーワードのつけ忘れには注意すべきでしょう。public/private と static はどちらもクラスメンバ修飾子です。2つつけることももちろん可能であるため、public は必ずつけなければなりません。

static は外部から呼び出すことを前提としているため、 public は必ずつけます。static を付けたらもういいだろと思わず、きちんとつけてください。

Math.Pow()  /  Circle.pi
からもわかるように、クラス名にドット演算子をつけて呼び出します。オブジェクトを生成する必要がないことを改めて確認してください。

このプログラムにはクラスが2つ定義されているのに、new キーワードは1度も登場していません。
このようなオブジェクトを生成しなくてもいいというのは例外ですから、余り乱用してはいけません。

Math クラスのメンバなど、static にすることでメモリ消費を抑えることができ、オブジェクトのメンバ同士で関連性が余りなくいろいろなところから呼び 出す場合に利用します。
円周率πはその最もいい例です。

忘れていましたが、上のプログラムにもう1つ static がありました。Main() メソッドです。
あまりに何気ないコードだったので忘れていましたが、Main() に static が付いている理由は 覚えておくべきでしょう。

[ ステップアップC# ] [ C#プログラミング応用講義 ]