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

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

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

Re[4]: デザイナで作成されるFontのDisposeについて


(過去ログ 135 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■79487 / inTopicNo.1)  デザイナで作成されるFontのDisposeについて
  
□投稿者/ C#見習い (1回)-(2016/04/07(Thu) 18:21:16)

分類:[.NET 全般] 

Win7、C#.NET 2015、C#.NET暦1ヶ月、VB.NET暦2年、C暦1年くらいです。

何かしらのフォント、たとえばフォームのフォントを適当に変更するとForm1.Designer.csに

this.Font = new System.Drawing.Font("MS ゴシック", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));

というのが自動的にできますよね。
FontはDisposeが必要と聞いたのですが自分でこれをDisposeする必要はありますでしょうか?

業務アプリでフォントを変えたコントロールなんて画面上にごまんとできますし、
それをDisposeしている例を見かけたことがありません。

しかし、先日、画像イメージを作成するリアルタイム制御系のプロジェクトで、
フォントをDisposeしていたのを見かけました。

一応、Dispose、Fontでググったのですが、下記のようにあまり理解できませんでした。
・アセンブラレベルの話をしておられた → ついていけなかった
・「フォントハンドル」というアンマネージドリソースを解放しなくてはならない → やはり必要?という印象を受けた
・分からなければとりあえずDisposeを呼んでおくべし → デザイナでnewされたフォントまでいるのかを疑問に思った

たぶん、普通の業務系の画面上の分はいらないと踏んでおり、
リアルタイム系などシビアな環境で
「重くなる等問題が出たら・出そうならDisposeして様子を見る」くらいに思っているのですが、
なにぶん心配性なもので、ご助言を頂きたく思いました。よろしくお願いいたします。
引用返信 編集キー/
■79488 / inTopicNo.2)  Re[1]: デザイナで作成されるFontのDisposeについて
□投稿者/ daive (98回)-(2016/04/07(Thu) 19:19:52)
デザイナのコードを見たのであれば、(VS2015/C#の例)

		/// <summary>
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.IContainer components = null;

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
		protected override void Dispose ( bool disposing )
		{
			if ( disposing && ( components != null ) )
			{
				components.Dispose( );
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code

		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent ( )
		{

こんな感じになっているのに、気が付きませんでしたか?
私は、支障が無い限り、デザイナがやる事には介在しません。
極まれに、デザイナのコードを弄ったりしますが、必要があってで、普段はお任せコースです。

引用返信 編集キー/
■79489 / inTopicNo.3)  Re[2]: デザイナで作成されるFontのDisposeについて
□投稿者/ furu (56回)-(2016/04/07(Thu) 20:25:15)
悩ましい問題ですね。

わからないのですが、私もdaiveさんのように、
「デザイナがやる事には介在しません」です。

ただ、FormにDispose()があるからといって
FontをDisposeしてるとは思えないです。

Fontはnewされ、代入されているので
FormのDisposeは、Fontが自分のだけのものかどうか
判断つかないからです。

例えば

Form2.Font = Form1.Font;
Form3.Font = Form1.Font;
Form1.Dispose();

の時、
Form1.Dispose()でForm1.FontがDisposeされたら、困る。
でもForm2やForm3の元のFontのDisposeは誰がやるの?

Fontはdisposableだけど
普通の使用では積極的にDisposeしなくていいのかなと
思っています。

ownerがいればいいんだけど
引用返信 編集キー/
■79490 / inTopicNo.4)  Re[3]: デザイナで作成されるFontのDisposeについて
□投稿者/ C#見習い (2回)-(2016/04/07(Thu) 20:54:11)
To:daiveさん

Disposeもデザイナが生成していたのですね、気付きませんでした。
確かに、こういう事を自動で行っているのなら、
余計なことはしない方が良いのかもと思いました。

To:furuさん

悩ましいと思われている方もいらっしゃるのですね。
Form2やForm3など他のオブジェクトからも参照された時のケースや、
FormがFontをDisposeしているのか等、難しそうです。

とりあえず、
・デザイナに任せる分はDisposeしない
・そうでない分はDisposeする(Disposeがあるなら必ず呼ぶべし、の法則)
という方針でやっていこうかと思います。
他の方のご意見が聞けて、不安が和らぎました。ありがとうございました。
解決済み
引用返信 編集キー/
■79492 / inTopicNo.5)  Re[4]: デザイナで作成されるFontのDisposeについて
□投稿者/ WebSurfer (886回)-(2016/04/07(Thu) 23:00:49)
No79490 (C#見習い さん) に返信

解決済みマークが付いているのに今さらですが・・・

以前、

SqlCommand の Dispose は呼ぶべきか?
http://surferonwww.info/BlogEngine/post/2013/04/23/whether-to-call-dispose-method-for-sqlcommand-object.aspx

でいろいろ考えたことがあります。

基本的には「IDisposable インターフェイスを継承して Dispose メソッドを実装し
ているクラスは、そのオブジェクトが使用されなくなった時点で Dispose メソッド
を呼び出すべき」と自分は思っています。

ただ、マネージリソースのみを使用する型は、ガベージコレクターによって自動的
にクリアされるため、Dispose メソッドを実装しても、パフォーマンス上の利点は
ないとのことです。

しかし、Dispose メソッドに GC.SuppressFinalize メソッドを実装することにより、
冗長なファイナライザーの呼び出しを防ぐことができるという利点があるそうです。

でも、クラスによってはコンストラクタに GC.SuppressFinalize メソッドが実装さ
れいるものがあって、冗長な Finalize メソッドの呼び出しを防ぐという意味では
Dispose() メソッドを呼ぶ意味はないものもあります。

結局どうすればいいんだという話ですが、やっぱり最初に戻って、IDisposable を
継承するクラスは Dispose() を呼ぶべきというのが基本と思っています。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -