- PR -

static変数について

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-03-02 09:15
おはようございます、じゃんぬねっと です。

引用:

VB.NETだとstaticに該当するキーワードはShared(=共用の)です。



そういえば、そうですね。
旧 VB の「Static」とは意味合いが違うので
「Shared」なるキーワードになったのでしょうね。
_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-03-02 09:40
るぱんです。

staticとそうでない変数の区別はどこでつけるか?

static・・・・インスタンス化しないでも使用できる変数
それ以外・・・インスタンス化しないと使用できない変数

ってところでどうでしょう?
staticメソッドの方がわかりやすいと思います。
調べてみてください。

メモリ内部にクラスを読み込んだ時に、
同じクラス(型)を使用する変数すべてが共有できる領域・・・と言う感じで理解しています。
Fujiwo
常連さん
会議室デビュー日: 2002/02/19
投稿数: 20
投稿日時: 2005-03-02 11:07
>static変数(静的変数) ・・変更不可
>インスタンス変数     ・・読み取り・書き込みできる

は全く違います。そのような意味はありません。

static フィールド  ― クラスのフィールド (インスタンスを必要としない)
インスタンス フィールド ― インスタンスのフィールド

static メソッド  ― クラスのメソッド (なので、当然インスタンスを必要としないし、直接インスタンス フィールドやインスタンス メソッドには触れない)
インスタンス メソッド ― インスタンスのメソッド

# 後は、入門書をしっかり読み直して、実際に試してみることだと思います。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-03-02 11:20
それぞれのキーワードについてちょっとまとめましょうか。
まずstaticですが、これが付いたメンバ(メソッド・フィード・プロパティ等)はnewしたインスタンスのメンバではなくクラスそのもののメンバになります。
例えば
コード:
public class C
{
  public void  F(){}
  public static void  SF(){}
}


というクラスがあった場合
コード:
C instance=new C();

instance.F();
//instance.SF(); エラー(インスタンス参照で静的メンバにアクセスできません)

//C.F(); エラー(静的でないメソッドで、オブジェクト参照が必要です)
C.SF();


となります。
SF()はインスタンスのメンバではないのでinstanceの機能としてアクセスできませんし、F()はインスタンスのメンバなのでCの機能としてアクセスできません。
良く使うような物としてはMessageBox.Show()やDBNull.Valueなんてのがありますね。
MessageBoxクラスをnewしたり、DBNullクラスをnewしたりしなくてもこれらの機能が使えますよね。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-03-02 11:20
次にreadonlyですが、これはそのフィールドが属するオブジェクト(とりあえずインスタンスと考えてもらって構いません)の生成が完了した時点で値の変更が出来なくなるフィールドです。
"生成が完了した時点"というのはつまりコンストラクタの実行が終了した時点です。
値を設定する方法としてはフィールドの宣言で初期値を指定する(以下参照)
public readonly string s="abcde";
かコンストラクタ内での代入になります。
ちなみに、宣言で初期値を指定した場合に初期化されるタイミングはコンストラクタが実行される前ですのでコンストラクタ内で値を見ることができます。

readonlyは別にインスタンスのフィールドにしか付けられないわけではありません。つまりstaticキーワードの付いたクラスのフィールドにも付ける事ができます。
上でわざわざ"オブジェクト"と書いたのはこのせいです。
staticとreadonlyが両方付いたフィールドも、その属するオブジェクト(クラス)の生成が完了した時点で値の変更が出来なくなることには変わりありません。
値を設定する方法は宣言で初期値を指定するかコンストラクタで値を代入するかになります。コンストラクタというのはもちろんクラスのコンストラクタです。
コード:
public class C

{
static C(){} //クラスのコンストラクタ

public C(){} //インスタンスのコンストラクタ
}



[ メッセージ編集済み 編集者: 一郎 編集日時 2005-03-02 11:27 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-03-02 11:21
最後にconstですが、これは定数です。コンストラクタ内でも値の変更はできません。
コンストラクタ内でも値の変更ができない以外はstatic readonlyと2つのキーワードを付けたフィールドと似ていますね。

コンパイルした時に、ソース中のその定数を参照している部分をその値で置き換えてコンパイルしてくれますので、static readonlyのフィールドを参照(つまり実行時に参照)するよりは少しだけ動作が速いかもしれません。
その代わり、以前の書き込みでも書きましたが一旦定数を参照している状態でコンパイルすると、その後その定数を含むアセンブリを差し替えても、参照している側を再コンパイルしないと定数の値は変わりません。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-03-02 11:53
ぼのぼのです。
「寿命」とか「数」という重要なキーワードが出てこないのでちょっとだけ補足。

寿命
static・・・・アプリケーションの開始から終了まで
それ以外・・・インスタンスの開始から終了まで


static・・・・アプリケーション内で1つ
それ以外・・・インスタンスの数だけ(1個も生成してなければ0)

上記の規約は、全てこれに起因します。
ちなみにconstもアプリケーション内で1つになりますが、これは「絶対変わらないものなんだからメモリを無駄使いすることないじゃん」という後付け的なもので、キーワード本来の意味合いはあくまで「固定であること」です。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-03-02 12:09
引用:
「寿命」とか「数」という重要なキーワードが出てこないのでちょっとだけ補足。


ちゃんと何の言語について説明しているのか書いたほうがいいですよ。もと質問者が C# と表明してからは、みなさん C# の static について説明してくれています。

で、「アプリケーション内で1つ」というのは、どの言語での話ですか?

--
あー、もしかして Java と違って C# はクラスの遅延ロードやアンロードができないとか? それで、実質アプリケーションの生存期間と一致するということなら納得です。

[ メッセージ編集済み 編集者: 未記入 編集日時 2005-03-02 12:16 ]

スキルアップ/キャリアアップ(JOB@IT)