C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[29]: コントロール・フォントスタイル変更時のFont解放について


(過去ログ 78 を表示中)

[トピック内 64 記事 (1 - 20 表示)]  << 0 | 1 | 2 | 3 >>

■45896 / inTopicNo.1)  コントロール・フォントスタイル変更時のFont解放について
  
□投稿者/ かおりQ (1回)-(2010/01/21(Thu) 17:40:37)

分類:[.NET 全般] 

VS2008・C#で、Windowsアプリケーションを作成しています。
コントロールのフォントスタイル変更について質問です。

ラジオボタンが2つ(radioButtonA,radioButtonB)フォームにあって、
チェックが入っているほうのラジオボタンのテキストを「太字かつ下線」にして、
チェックなしは「標準テキスト」にしたいです。
CheckedChangedイベントに、以下のように記述しています。

/// <summary>
/// ラジオボタンA,BのCheckedが変更された場合に発生するイベント
/// </summary>
private void radioButtonAB_CheckedChanged(object sender, EventArgs e)
{
     if (sender.Equals(radioButtonA))
     {
         // 色を変更して、下線
         radioButtonA.ForeColor = Color.Red;
         radioButtonB.ForeColor = SystemColors.ControlText;

         radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Bold | FontStyle.Underline);
         radioButtonB.Font = new Font(radioButtonB.Font, FontStyle.Regular);
      }
      else if (sender.Equals(radioButtonB))
      {
          radioButtonA.ForeColor = SystemColors.ControlText;
          radioButtonB.ForeColor = Color.Red;

          radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Regular);
          radioButtonB.Font = new Font(radioButtonB.Font, FontStyle.Bold | FontStyle.Underline);
       }
}

radioButtonB.Font = new Font(radioButtonB.Font, FontStyle.Regular)のように、
フォントスタイルの変更のためにはFontをnewする必要があると思いますが、
「Fontはnewしたら解放するものだ」と覚えているので、このままで良いのかなと、
ちょっと違和感が残ります...。

解放に関して知識が足りないので、これで問題ないのか分かりません...。
宜しくお願い致します。

引用返信 編集キー/
■45899 / inTopicNo.2)  Re[1]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ ぽぴ王子 (479回)-(2010/01/21(Thu) 18:00:55)
ぽぴ王子 さんの Web サイト
No45896 (かおりQ さん) に返信

> radioButtonB.Font = new Font(radioButtonB.Font, FontStyle.Regular)のように、
> フォントスタイルの変更のためにはFontをnewする必要があると思いますが、
> 「Fontはnewしたら解放するものだ」と覚えているので、このままで良いのかなと、
> ちょっと違和感が残ります...。

この場合の Font オブジェクトは radioButtonA radioButtonB のプロパティとして代入されるもの
ですよね。
であれば、radioButtonA radioButtonB のコントロールが不要にならない限りは解放する必要は
ないのではないかと思います。
逆に解放してしまうと、radioButtonA radioButtonB がどのフォントを使用していいかわからなく
なるので、解放してはいけないかと。
引用返信 編集キー/
■45910 / inTopicNo.3)  Re[2]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ ななし (5回)-(2010/01/21(Thu) 19:31:21)
No45896 (かおりQ さん) に返信

チェックの変更を繰り返すと結果的に次のコードが繰り返されることになるので、本来は解放が必要で、現状では開放がGC任せになっています。

radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Bold | FontStyle.Underline);
radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Regular);

解放をGC任せにしない場合は、

var oldFont = radioButtonA.Font;
radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Bold | FontStyle.Underline);
oldFont.Dispose();

を行うことになりますが、oldFont は本当に自分が new したものかわかりません(少なくとも初回は違う)し、他で共有しているフォントである可能性もあるので、機械的に常に上記のように解放するのも危険です。

じゃあ、どうすれば?と私も思ったことがあって、まずはどんな問題が発生するかを確認するために、フォントをどれぐらい new するとリソース不足になるのか実験したことがあります。最悪の状況を想定してGCの対象にならないように、作成したフォントはすべてリストに保持しました。
しかし、予想に反して、相当多く作成してもエラーは発生しなかったように思います。(試したのはずいぶん前なので、詳細は忘れました。)

ということで、次の2点の理由から、とくに気にされる必要はないと思います。
・自分で解放しなくても、GCがしてくれるかもしれない。
・たとえGCされなくても、実用上は問題にならないかもしれない。

それでも気持ちが悪い場合は、変更の都度 new するんじゃなくて、Load イベントなどで事前に4つのフォントを作成しておき、それらを使って切り替えればよいと思います。

引用返信 編集キー/
■45932 / inTopicNo.4)  Re[3]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (334回)-(2010/01/22(Fri) 00:12:54)
No45910 (ななし さん) に返信
> ■No45896 (かおりQ さん) に返信
>
> チェックの変更を繰り返すと結果的に次のコードが繰り返されることになるので、本来は解放が必要で、現状では開放がGC任せになっています。
>
> radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Bold | FontStyle.Underline);
> radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Regular);

気になってたから調べてみたけど、

radioButtonA.Font = new Font(...)

の前に

radioButtonA.Font.Dispose();
radioButtonA.Font = null;
radioButtonA.Font = new Font(...)

としておけばOK。

全てのコントロールを調べてはないから明言はできないけど、上記のコードでFontプロパティはDisposeしてNullを代入されても、Nullを設定された時点で自身のコンテナ(フォームに貼り付けられているならフォーム)のFontで再設定してるみたい。

まぁ、Fontプロパティがnull参照だと親コンテナのフォントを返すように作ってるのか、nullされた時点で再設定してるのかはわからないけどGCに解放をまかせたくない場合は上記の書き方をしておけば大丈夫だと思う。
引用返信 編集キー/
■45933 / inTopicNo.5)  Re[4]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ よねKEN (435回)-(2010/01/22(Fri) 00:37:09)
2010/01/22(Fri) 10:34:55 編集(投稿者)
2010/01/22(Fri) 00:39:10 編集(投稿者)

そもそも毎回newしてFontを作成する必要がないのではないでしょうか?
たぶんradioButtonAとradioButtonBのフォントは標準/太字/下線の違いを除いて同じフォント、サイズなんですよね?
以下のような方法もあります。

//--------------
//★フォームのインスタンス変数で以下を宣言
private Font uncheckedFont;
private Font checkedFont;

//--------------
//★フォームのLoadイベントあたりで初期化
checkedFont= new Font(元になるフォント, FontStyle.Regular); ' または、フォント名、サイズ、スタイルを指定するコンストラクタでもOK
selectedFont = new Font(checkedFont, FontStyle.Bold | FontStyle.Underline);

//--------------
//★radioButtonAB_CheckedChangedイベントで
//一例としてradioButtonAが選択されたときは以下のように設定
radioButtonA.Font = checkedFont;
radioButtonB.Font = uncheckedFont;

このような方法なら、必要最低限しかフォントを作りませんので、
Disposeするかどうかを特に気にする必要もないでしょう。

<追記>
ななしさんの回答の後半をちゃんと読んでませんでしたm(_ _)m

> それでも気持ちが悪い場合は、変更の都度 new するんじゃなくて、
> Load イベントなどで事前に4つのフォントを作成しておき、
> それらを使って切り替えればよいと思います。

と既に指摘されてましたねorz
</追記>
<修正>
checkedFontと記載するべきところでnormalFontという変数名になっている
箇所があったため修正しましたm(_ _)m
</修正>

引用返信 編集キー/
■45936 / inTopicNo.6)  Re[5]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ かおりQ (3回)-(2010/01/22(Fri) 01:07:23)
なるほど。
解放しなくても特に問題はないけれど、
・Fontをnewする前にDisposeすればOK.
だし、
・「チェック時フォント」と「通常フォント」を用意しておいて、切り替える
のもすっきりしますね!
よねKENさんのコードから、以下のようにしました。
// --------------------------------------------------------------------------------
private Font selectFont;   // チェック時フォント
private Font regularFont;  // 通常フォント

private void Form1_Load(object sender, EventArgs e)
{
    selectFont = new Font("MS UI Gothic", 9.0f, FontStyle.Bold | FontStyle.Underline);
    regularFont = new Font("MS UI Gothic", 9.0f, FontStyle.Regular);
}

private void radioButtonAB_CheckedChanged(object sender, EventArgs e)
{
    if (sender.Equals(radioButtonA))
    {
        radioButtonA.Font = selectFont;
        radioButtonB.Font = regularFont;
    }
    else if (sender.Equals(radioButtonB))
    {
        radioButtonA.Font = regularFont;
        radioButtonB.Font = selectFont;
    }
}
// --------------------------------------------------------------------------------

とても助かりました!
皆様、ありがとうございました!

解決済み
引用返信 編集キー/
■45938 / inTopicNo.7)  Re[6]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (360回)-(2010/01/22(Fri) 01:35:32)
>radioButtonA.Font = new Font(...)

>の前に

>radioButtonA.Font.Dispose();
>radioButtonA.Font = null;
>radioButtonA.Font = new Font(...)

>としておけばOK。

自分で完全にフォントのインスタンスを管理できているならいいですが、
そうでない場合もありうるので危険というのが

>var oldFont = radioButtonA.Font;
>radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Bold | FontStyle.Underline);
>oldFont.Dispose();

>を行うことになりますが、oldFont は本当に自分が new したものかわかりません(少なくとも初回は違う)し、他で共有し>ているフォントである可能性もあるので、機械的に常に上記のように解放するのも危険です。

という話では?

ところで
>radioButtonA.Font = null;
これはどういう意味があるんでしょう?
※ない場合と比較して何の効果(意味)を期待したものでしょう?

解決済み
引用返信 編集キー/
■45950 / inTopicNo.8)  Re[7]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (335回)-(2010/01/22(Fri) 09:45:32)
No45938 (なちゃ さん) に返信
> 自分で完全にフォントのインスタンスを管理できているならいいですが、
> そうでない場合もありうるので危険というのが
>
> >var oldFont = radioButtonA.Font;
> >radioButtonA.Font = new Font(radioButtonA.Font, FontStyle.Bold | FontStyle.Underline);
> >oldFont.Dispose();
> >
> >を行うことになりますが、oldFont は本当に自分が new したものかわかりません(少なくとも初回は違う)し、他で共有し>ているフォントである可能性もあるので、機械的に常に上記のように解放するのも危険です。
>
> という話では?

すくなくとも自分でプログラム組んでいる場合は管理できるんじゃないだろうか?

> ところで
> >radioButtonA.Font = null;
> これはどういう意味があるんでしょう?
> ※ない場合と比較して何の効果(意味)を期待したものでしょう?

これは検証するためにDisposeとnullを代入してるだけです。null代入時の動作も調べておきたかったんで気にしないでください。

Disposeは、Disposeメソッド。
null代入はプロパティのsetアクセッサなので、別物なので調べただけでした。

ところで、変数の参照カウンタってDisposeのタイミングなの?
参照カウンタがデクリメントされるタイミングは参照が無くなった時点だと思ってたけど。(この前見たらnull代入の時点で参照カウンタ(公式の資料が見当たらないので参照カウンタっぽい領域だけど)がデクリメントされてたような気がしてたので。)
引用返信 編集キー/
■45970 / inTopicNo.9)  Re[8]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ ななし (7回)-(2010/01/22(Fri) 14:54:54)
No45950 (たくボン さん) に返信

> すくなくとも自分でプログラム組んでいる場合は管理できるんじゃないだろうか?

その前提が常に当てはまるかわかりませんし、
ソースの他の部分に制約を課すようなコードはなるべく書かないよう心がけることが大切だって私は思います。
将来、別のところに、自分もしくは他の人が
radioButtonA.Font = this.Font;
と書くだけでおかしくなるかもしれませんが、書いた人はその時???ってなると思います。

> ところで、変数の参照カウンタってDisposeのタイミングなの?

参照カウンタというもの自体、なかったと思います。
こちらのコラムに、ためになるリンクがまとまってました。
http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld06/directxworld06_01.html
間違っていたらすみません。

(たくぼんさんが外された解決済みマーク、いちおう戻しておきます)
解決済み
引用返信 編集キー/
■45972 / inTopicNo.10)  Re[8]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ Asell (3回)-(2010/01/22(Fri) 15:08:26)
No45936 (かおりQ さん) に返信
>private void radioButtonAB_CheckedChanged(object sender, EventArgs e)
>{
>    if (sender.Equals(radioButtonA))
>    {
>        radioButtonA.Font = selectFont;
>        radioButtonB.Font = regularFont;
>    }
>    else if (sender.Equals(radioButtonB))
>    {
>        radioButtonA.Font = regularFont;
>        radioButtonB.Font = selectFont;
>    }
>}

フォントの開放とは別の所で気になったのだが
同じグループボックス内にradioButtonA と radioButtonB
があった場合、両方からイベント通知されてきますよね?

radioButtonBが選択されている状態で、radioButtonAを選択した場合、
radioButtonB Checked = false になる
radioButtonA Checked = true  になる
イベント通知される順番って保障されてるのかしら。。。

選択されているラジオボタンのフォントを変えるだけなら以下のほうがよいかも

private void radioButtonAB_CheckedChanged(object sender, EventArgs e)
{
    if (((RadioButton)sender).Checked)
    {
        ((RadioButton)sender).Font = selectFont;
    }
    else
    {
        ((RadioButton)sender).Font = regularFont;
    }
}

--



解決済み
引用返信 編集キー/
■45980 / inTopicNo.11)  Re[9]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ かおりQ (4回)-(2010/01/22(Fri) 16:25:41)
No45972 (Asell さん) に返信
> フォントの開放とは別の所で気になったのだが
> 同じグループボックス内にradioButtonA と radioButtonB
> があった場合、両方からイベント通知されてきますよね?

あっ、その通りですね!
チェック切り替えたときに、処理が2回呼び出されていました..。
チェックの状態も調べないとですね。

こちら、利用させていただきました。
> private void radioButtonAB_CheckedChanged(object sender, EventArgs e)
> {
> if (((RadioButton)sender).Checked)
> {
> ((RadioButton)sender).Font = selectFont;
> }
> else
> {
> ((RadioButton)sender).Font = regularFont;
> }
> }

ありがとうございます!
解決済み
引用返信 編集キー/
■45986 / inTopicNo.12)  Re[9]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (337回)-(2010/01/22(Fri) 17:42:43)
2010/01/22(Fri) 17:43:24 編集(投稿者)

No45970 (ななし さん) に返信
> ■No45950 (たくボン さん) に返信
>
>>すくなくとも自分でプログラム組んでいる場合は管理できるんじゃないだろうか?
>
> その前提が常に当てはまるかわかりませんし、
> ソースの他の部分に制約を課すようなコードはなるべく書かないよう心がけることが大切だって私は思います。
> 将来、別のところに、自分もしくは他の人が
> radioButtonA.Font = this.Font;
> と書くだけでおかしくなるかもしれませんが、書いた人はその時???ってなると思います。

だから「すくなくとも」と書いたんですけどね。

>>ところで、変数の参照カウンタってDisposeのタイミングなの?
>
> 参照カウンタというもの自体、なかったと思います。

参照カウンタって言う表現は良くなかったかも。GCのコレクト時のFinalize用のビットフラグ(SuppressFinalizeでリーチャブルキューに移動するかどうかの判定に使用されるビット)とかに使用されているフラグ。なんと言えばいいんだろう?この辺のメモリ配置の資料あんまり見ないんだけど、どっかにないのかな?

fixed使ってたときに見てたメモリ空間だったと思うから、その時はデバッガがヒープを管理してたかも?(もしかしたらグローバルヒープを使ってたかも)isJITOptimiserDisabledとかは使ってなかったと思うし、時間あったらまた調べてみます。

# 解決済みつけてなかった。
解決済み
引用返信 編集キー/
■46005 / inTopicNo.13)  Re[10]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (362回)-(2010/01/22(Fri) 23:46:29)
>GCのコレクト時のFinalize用のビットフラグ(SuppressFinalizeでリーチャブルキューに移動するかどうかの判定に使用されるビット)とかに使用されているフラグ。

それはFontクラス自身がDisposeでSuppressFinalizeを呼び出してるからでしょう。

引用返信 編集キー/
■46011 / inTopicNo.14)  Re[11]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (338回)-(2010/01/23(Sat) 09:07:02)
No46005 (なちゃ さん) に返信
> >GCのコレクト時のFinalize用のビットフラグ(SuppressFinalizeでリーチャブルキューに移動するかどうかの判定に使用されるビット)とかに使用されているフラグ。
>
> それはFontクラス自身がDisposeでSuppressFinalizeを呼び出してるからでしょう。

あぁ、そういう意味じゃなくて。
GCの解説や動作は解説してるサイトあるけど、実際のGCが管理する場合のメモリ構造とか配置、そういう情報って少ないから。国内は特に少ない。

個人的には不透明な部分って気持ち悪いし、GCってどうも好きになれない(楽だけど。ジェネレーションの概念も高速化するためのやっつけ仕事の感がいなめなくもないし)

どこにいるかわからないけどピンチの時ひょっこり現れるウルトラマンより、近所ののび太の方が好き(世話焼けるけど)
解決済み
引用返信 編集キー/
■46013 / inTopicNo.15)  Re[12]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (364回)-(2010/01/23(Sat) 10:57:45)
No46011 (たくボン さん) に返信
> ■No46005 (なちゃ さん) に返信
>>>GCのコレクト時のFinalize用のビットフラグ(SuppressFinalizeでリーチャブルキューに移動するかどうかの判定に使用されるビット)とかに使用されているフラグ。
>>
>>それはFontクラス自身がDisposeでSuppressFinalizeを呼び出してるからでしょう。
>
> あぁ、そういう意味じゃなくて。
> GCの解説や動作は解説してるサイトあるけど、実際のGCが管理する場合のメモリ構造とか配置、そういう情報って少ないから。国内は特に少ない。

私は、
>ところで、変数の参照カウンタってDisposeのタイミングなの?
からの、「参照カウンタ」とか「GCのコレクト時のFinalize用のビットフラグ」とかの記述に関して、
「その動き(メモリの変化)は単にFontクラスがそう実装されているからってだけでしょう。」
と言いたかっただけです。
※参照カウンタ云々からの話(GCに関する話)はちょっとおかしいので。
※別にそういうことを調べようとするのがおかしいと思ってるのではありません。

参照カウンタとかSuppressFinalizeとか、GCに関する記述が混乱を招きそうだったので。

解決済み
引用返信 編集キー/
■46014 / inTopicNo.16)  Re[13]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (365回)-(2010/01/23(Sat) 11:05:47)
元々の話の、

>ところで、変数の参照カウンタってDisposeのタイミングなの?
>参照カウンタがデクリメントされるタイミングは参照が無くなった時点だと思ってたけど。(この前見たらnull代入の時点で参照カウンタ(公式の資料が見当たらないので参照カウンタっぽい領域だけど)がデクリメントされてたような気がしてたので。)

ここに関して、
CLRのGCでは、参照カウンタはもともとありません。
(後で書かれている内容によると)その領域が変化したのは、
「Fontクラス自体が、Disposeでそこが変化するような実装されてるから」
です。
ということです。
※なんというか、GC側からの動きではなくて、Fontクラスの実装による動き。

解決済み
引用返信 編集キー/
■46016 / inTopicNo.17)  Re[8]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (366回)-(2010/01/23(Sat) 11:24:05)
No45950 (たくボン さん) に返信
> すくなくとも自分でプログラム組んでいる場合は管理できるんじゃないだろうか?

Fontプロパティにnullを設定すると、Form(コンテナ)の値で初期化されるとかの話を書かれてますよね?
この動作は、アンビエントプロパティという仕組みによるもので、一部のプロパティがこういう動作をします。

これらのプロパティをコントロールに設定する時、デザイナで、コンテナと同じフォントを選択した場合は
別のインスタンスが設定されて、コンテナのプロパティ値とは個別のインスタンスになったりしますが、
プロパティを「リセット」すると、コンテナと同一のインスタンスになったりします。
※リセットした場合はDisposeしてはだめですし、同じフォントを設定した場合はDisposeする必要があることになります。

このように自分でプログラムを作成している時でも、この辺りのプロパティのインスタンスがどうなっているかは
結構分かりにくかったり、予想と違う動作をしていたりもしますので、はっきりいってあまりきちんと管理できて
いないことの方が多いように思います。

解決済み
引用返信 編集キー/
■46041 / inTopicNo.18)  Re[9]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ たくボン (339回)-(2010/01/23(Sat) 21:32:24)
No46016 (なちゃ さん) に返信
> ■No45950 (たくボン さん) に返信
> プロパティを「リセット」すると、コンテナと同一のインスタンスになったりします。
> ※リセットした場合はDisposeしてはだめですし、同じフォントを設定した場合はDisposeする必要があることになります。

http://msdn.microsoft.com/ja-jp/magazine/bb985010.aspx
http://msdn.microsoft.com/ja-jp/library/b1yfkh5e(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.drawing.font.dispose(VS.80).aspx
フォントのリソースが解放されるタイミングはいつかな?

>radioButtonA.Font.Dispose();
>radioButtonA.Font = null;
をするのとしない時のGCの動作の違いは?
引用返信 編集キー/
■46042 / inTopicNo.19)  Re[10]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ (368回)-(2010/01/23(Sat) 21:58:46)
No46041 (たくボン さん) に返信
> ■No46016 (なちゃ さん) に返信
>>■No45950 (たくボン さん) に返信
>>プロパティを「リセット」すると、コンテナと同一のインスタンスになったりします。
>>※リセットした場合はDisposeしてはだめですし、同じフォントを設定した場合はDisposeする必要があることになります。
>
> http://msdn.microsoft.com/ja-jp/magazine/bb985010.aspx
> http://msdn.microsoft.com/ja-jp/library/b1yfkh5e(VS.80).aspx
> http://msdn.microsoft.com/ja-jp/library/system.drawing.font.dispose(VS.80).aspx
> フォントのリソースが解放されるタイミングはいつかな?

いまいち何が言いたいのか意図がよく分かりません。
私が書いたことのどの部分に対して、何を言いたいのかはっきり書いてもらえないでしょうか?

私が書いた
>>※リセットした場合はDisposeしてはだめですし、同じフォントを設定した場合はDisposeする必要があることになります。
は、
もしデザイナ上でリセットした場合はコンテナと同一のFormインスタンスが設定されているので、コントロール側で不要になっても勝手にDisposeなんか実行してはいけないし(コンテナ側ではまだ使用中)、
リセットではなく同じフォントを設定したのなら、別インスタンスなのでコントロール側で不要になったらDisposeを実行しないといけない(コンテナ側では使用していない)、
でもこんな風にデザイナでの操作で変わってしまうような動きなので、自分で作るプログラムでもきちんと管理できていないことが多いだろう、
だから、フォントを変える時に(必要な場合のみ)Disposeを呼ぶというやり方は現実的にあまり安全ではないだろう
ということです。


> >radioButtonA.Font.Dispose();
> >radioButtonA.Font = null;
> をするのとしない時のGCの動作の違いは?

これは質問ですか?
nullの代入は実質的には動作に影響はない(動作は変わりますが最終結果は変わらない)のでおいとくとして、
Disposeを呼べば、その時点でradioButtonAに設定されていたFontの(ネイティブな)リソースが解放されて、そのうえでSuppressFinalizeによりFinalize対象から外されます。
※もし、FontのインスタンスがコンテナのFontと同一のものなら、後で問題が発生する危険があるでしょう。

Disposeを呼ばなければ、そのあとの別のフォントの代入によって参照が外れますので、その時点でGC「対象」になるでしょう。
次のGC時にファイナライズ対象になり、そのうちファイナライざスレッドでリソースが解放され、さらにその次のGC時にメモリ回収されるでしょう。
※もし、FontのインスタンスがコンテナのFontと同一のものなら、何もしないのと実質変わりません(コンテナからの参照が生きているため、GC対象にはならない)。


あるいは何か別のことが言いたかった(聞きたかった)でしょうか?

引用返信 編集キー/
■46043 / inTopicNo.20)  Re[11]: コントロール・フォントスタイル変更時のFont解放について
 
□投稿者/ なちゃ (369回)-(2010/01/23(Sat) 22:01:38)
ちょっと訂正。

No46042 (なちゃ さん) に返信
> もしデザイナ上でリセットした場合はコンテナと同一のFormインスタンスが設定されているので、コントロール側で不要になっても勝手にDisposeなんか実行してはいけないし(コンテナ側ではまだ使用中)、

上の「Formインスタンス」は「Fontインスタンス」の書き間違いです。
書き間違いということは分かるとは思いますが、文脈上おかしな意味にも取れてしまうので、念のためはっきり訂正しておきます。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 >>

管理者用

- Child Tree -