|
C#でのstatic初期化 投稿日時: 2004-6-8 午前 2:44 |
お分かりの方がいましたら教えてください
Java だとこんな感じの static な初期化をC#で実装したいのですが static { try { 処理 } catch (Exception e) { e.printStackTrace(); } } どのように書けばよろしいのでしょうか?
|
|
|
hidori
|
 |
 |
| 参加日: 2003-5-7 |
| 投稿数: 1103 |
| |
|
Re: C#でのstatic初期化 投稿日時: 2004-6-8 午前 7:18 |
静的コンストラクタでは駄目ですか?
|
|
|
|
Re: C#でのstatic初期化 投稿日時: 2004-6-8 午前 9:57 |
ありがとうございます
静的コンストラクタでいけそうです そこで疑問なのですが デフォルトコンストラクタと静的コンストラクタでは 静的コンストラクタの方が先に必ず先に起動されると考えてよいのでしょうか? |
|
|
| |
|
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(); }
|
|
|
| |
|
Re: C#でのstatic初期化 投稿日時: 2004-6-13 午前 1:05 |
なるほどなるほど
また疑問がわいたのですが
private static HogeClass instance;
// 静的コンストラクタ static ThisClass() { instance = new HogeClass(); }
とした場合 この instance はしばらくすると GC の対象になり 参照した場合例外が発生する可能性はあるのでしょうか? |
|
|
なちゃ
|
 |
| 参加日: 2003-7-3 |
| 投稿数: 341 |
| |
|
Re: C#でのstatic初期化 投稿日時: 2004-6-13 午前 1:18 |
> この instance はしばらくすると GC の対象になり > 参照した場合例外が発生する可能性はあるのでしょうか?
結論から言えば明示的に instance 変数に何か別の物を代入でもしない限りGCの対象にはなりません。 これは、staticがルート参照として扱われる(これは当然、そうじゃなければ困ります)からです。 が、なぜGC の対象になるかもしれないと思ったんでしょうか?
|
|
|
|
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.のあたりが間違っているような気がします ルート参照を勉強してみます
|
|
|
なちゃ
|
 |
| 参加日: 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なメンバは一度作成されると、環境が生きている(微妙な表現)間は存在しつづけます。 誰かが参照を差し替えない限り。 |
|
|
|
Re: C#でのstatic初期化 投稿日時: 2004-6-16 午前 12:57 |
ありがとうございます 確かに複雑に考えすぎていました
>staticなメンバは一度作成されると、環境が生きている(微妙な表現)間は存在しつづけます。 >誰かが参照を差し替えない限り
で単純に納得です |
|
|