掲示板
  .NET開発  > アドバンスド.NET  > C#でのstatic初期化  
 
 
 投稿者 スレッド: C#でのstatic初期化
nonbero はオフラインです。最後に活動した時刻: 2004/10/01 21:30:37 nonbero
参加日: 2004-6-8
投稿数: 8
 
C#でのstatic初期化
投稿日時: 2004-6-8 午前 2:44
お分かりの方がいましたら教えてください

Java だとこんな感じの static な初期化をC#で実装したいのですが
  static {
    try {
     処理
    } catch (Exception e) {
     e.printStackTrace();
    }
  }
どのように書けばよろしいのでしょうか?
hidori はオフラインです。最後に活動した時刻: 2006/03/19 15:18:28 hidori
Top 25 Poster
参加日: 2003-5-7
投稿数: 1103
 
Re: C#でのstatic初期化
投稿日時: 2004-6-8 午前 7:18
静的コンストラクタでは駄目ですか?
nonbero はオフラインです。最後に活動した時刻: 2004/10/01 21:30:37 nonbero
参加日: 2004-6-8
投稿数: 8
 
Re: C#でのstatic初期化
投稿日時: 2004-6-8 午前 9:57
ありがとうございます

静的コンストラクタでいけそうです
そこで疑問なのですが
デフォルトコンストラクタと静的コンストラクタでは
静的コンストラクタの方が先に必ず先に起動されると考えてよいのでしょうか?
Shinichi Aoyagi はオフラインです。最後に活動した時刻: 2006/01/10 10:21:05 Shinichi Aoyagi
Top 25 Poster
参加日: 2003-1-6
投稿数: 384
 
Re: C#でのstatic初期化
投稿日時: 2004-6-8 午前 10:44
青柳です。

> 静的コンストラクタの方が先に必ず先に起動されると考えてよいのでしょうか?

いいんじゃないでしょうか?
(静的でない)コンストラクタが実行されるのはインスタンスが生成された後でしょうから。
詳しくは↓を。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/csspec/html/vclrfcsharpspec_10_11.asp
nonbero はオフラインです。最後に活動した時刻: 2004/10/01 21:30:37 nonbero
参加日: 2004-6-8
投稿数: 8
 
Re: C#でのstatic初期化
投稿日時: 2004-6-8 午後 1:53
ありがとうございました
解決しました

こんな感じ

private static string str; // シングルトン的な動的文字列

static HogeHoge() // 静的コンストラクタ
{
 StringBuilder sb = new StringBuilder();

 foreach (string boo in ALL_BAR)
 {
  sb.Append(boo);
 }

 str = sb.ToString();
}

Kazuhiko Kikuchi はオフラインです。最後に活動した時刻: 2005/11/27 12:49:22 Kazuhiko Kikuchi
Top 50 Poster
参加日: 2003-7-6
投稿数: 148
 
Re: C#でのstatic初期化
投稿日時: 2004-6-8 午後 2:03
参考までに

クラスのスタティックコンストラクタとスタティックイニシャライザ


 イニシャライザと組み合わせるときはご注意を。
nonbero はオフラインです。最後に活動した時刻: 2004/10/01 21:30:37 nonbero
参加日: 2004-6-8
投稿数: 8
 
Re: C#でのstatic初期化
投稿日時: 2004-6-13 午前 1:05
なるほどなるほど

また疑問がわいたのですが

private static HogeClass instance;

// 静的コンストラクタ
static ThisClass()
{
 instance = new HogeClass();
}

とした場合
この instance はしばらくすると GC の対象になり
参照した場合例外が発生する可能性はあるのでしょうか?
なちゃ はオフラインです。最後に活動した時刻: 2006/03/11 8:01:37 なちゃ
Top 25 Poster
参加日: 2003-7-3
投稿数: 341
 
Re: C#でのstatic初期化
投稿日時: 2004-6-13 午前 1:18
> この instance はしばらくすると GC の対象になり
> 参照した場合例外が発生する可能性はあるのでしょうか?

結論から言えば明示的に instance 変数に何か別の物を代入でもしない限りGCの対象にはなりません。
これは、staticがルート参照として扱われる(これは当然、そうじゃなければ困ります)からです。
が、なぜGC の対象になるかもしれないと思ったんでしょうか?
nonbero はオフラインです。最後に活動した時刻: 2004/10/01 21:30:37 nonbero
参加日: 2004-6-8
投稿数: 8
 
Re: C#でのstatic初期化
投稿日時: 2004-6-13 午後 12:43
ありがとうございます

>なぜGC の対象になるかもしれないと思ったんでしょうか?

私がルート参照を理解していないため
誤った認識をしているみたいです

以下の認識でいました
1.他のクラス(AnotherClass)でこのクラス(ThisClass)のインスタンスを生成
2.スタティックコンストラクタにより instance が生成
3.AnotherClass のインスタンスの寿命が終わる
4.ThisClass のインスタンスの参照がCLR内のどこにも無くなる
5.ThisClass のインスタンスがGCの対象になり instance もGCの対象になる
6.また別のクラスでこのクラスのインスタンスを生成
7.インスタンスコンストラクタで instance を参照しているところで Null参照例外が発生する

おそらく5.のあたりが間違っているような気がします
ルート参照を勉強してみます
なちゃ はオフラインです。最後に活動した時刻: 2006/03/11 8:01:37 なちゃ
Top 25 Poster
参加日: 2003-7-3
投稿数: 341
 
Re: C#でのstatic初期化
投稿日時: 2004-6-13 午後 2:28
えーと、想定しているクラスがどんなのかちょっと分からないので微妙ですが、
なんとなく複雑に考えすぎているような気がします。

> 1.他のクラス(AnotherClass)でこのクラス(ThisClass)のインスタンスを生成
> 2.スタティックコンストラクタにより instance が生成
> 3.AnotherClass のインスタンスの寿命が終わる
> 4.ThisClass のインスタンスの参照がCLR内のどこにも無くなる

1.作成したインスタンス(AnotherClass内?で作成したインスタンス)は、特に何もしていなければ
少なくともこの時点で参照がなくなるでしょうが、staticなメンバある instance 変数は消えてませんよね?

> 5.ThisClass のインスタンスがGCの対象になり instance もGCの対象になる

というわけで、1.で作成したインスタンスはGCの対象になりますが、instanceにはなんら関係ありません。

> 6.また別のクラスでこのクラスのインスタンスを生成
> 7.インスタンスコンストラクタで instance を参照しているところで Null参照例外が発生する

実際intance変数にnullを代入するなどして、instance変数の参照を明示的に差し替えない限り
元のオブジェクトは残ってますから、勝手に消えることはありえません。
逆に勝手に消えたとしてもinstance変数には誰もnullを代入などしていませんから、
Null参照も起こらないはず(正しく動くはずもないですが)ですが、現実には起こりえないことですので…

staticなメンバは一度作成されると、環境が生きている(微妙な表現)間は存在しつづけます。
誰かが参照を差し替えない限り。
nonbero はオフラインです。最後に活動した時刻: 2004/10/01 21:30:37 nonbero
参加日: 2004-6-8
投稿数: 8
 
Re: C#でのstatic初期化
投稿日時: 2004-6-16 午前 12:57
ありがとうございます
確かに複雑に考えすぎていました

>staticなメンバは一度作成されると、環境が生きている(微妙な表現)間は存在しつづけます。
>誰かが参照を差し替えない限り

で単純に納得です
 
Page 1 of 1
 
GotDotNet Japan 掲示板  > .NET開発  > アドバンスド.NET  > C#でのstatic初期化