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

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

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

Re[4]: using文(Disposeメソッド)の使用


(過去ログ 118 を表示中)

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

■69310 / inTopicNo.1)  using文(Disposeメソッド)の使用
  
□投稿者/ fullhappy (7回)-(2013/12/16(Mon) 11:03:05)

分類:[.NET 全般] 

vs2010 c#4.0です。

using文(Disposeメソッド)に関して、日々悶々としていることが多いので
みなさんのご意見を伺いたいです。

1.using文(Disposeメソッド)は絶対に書きますか?

  私は、ファイルアクセスやデータベースアクセスなど
  直感で困りそうなものだけです。

  例1.
    テンプレートで作成された
    Application.Run(new Form1());
    も書き換えるか?
    Application.RunがInvalidOperationExceptionの例外となった場合、
    Form1のDisposeは呼び出されないようです。

  例2.
    印刷のPrintPageイベントで使用するFontをFormのメンバー変数とし、
    コンストラクタやLoadイベントでnewした場合、FormのDisposeに
    Font.Disposeを書くか?

2.IDisposableインターフェースを実装してるかどうかをどう調べていますか?

    ・ヘルプ
    ・using文やDisposeメソッドを書いてみて
    ・経験と勘(←私)

3.絶対に書く方は、using文(Disposeメソッド)忘れをどうやって見つけていますか?
  ツールやなどありますか?
  ビルドの警告があるとうれしいのですが。

4.バージョンアップでクラスにIDisposableインターフェースが実装されることはありますか?
  例えば、StringBuilderにIDisposableインターフェースが実装されたら困ります。

よろしくお願いします。
引用返信 編集キー/
■69312 / inTopicNo.2)  Re[1]: using文(Disposeメソッド)の使用
□投稿者/ WebSurfer (131回)-(2013/12/16(Mon) 12:37:54)
No69310 (fullhappy さん) に返信
> vs2010 c#4.0です。
>
> using文(Disposeメソッド)に関して、日々悶々としていることが多いので
> みなさんのご意見を伺いたいです。

.NET のライブラリの話(自分で作成するクラスの話ではなくて)と理解して、1
と 2 のみレスします。

> 1.using文(Disposeメソッド)は絶対に書きますか?

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

自分のブログで恐縮ですが、何故そう思うかの詳細は以下のページに書きましたの
で、よろしければ見てください。

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

Dispose するのに using を使うのがいいのか、明示的に Dispose メソッドを呼び
出すのがいいのかは、ケースバイケースもしくは好みの問題と思います。


> 2.IDisposableインターフェースを実装してるかどうかをどう調べていますか?

MSDN ライブラリを見ます。

引用返信 編集キー/
■69321 / inTopicNo.3)  Re[1]: using文(Disposeメソッド)の使用
□投稿者/ みきぬ (1回)-(2013/12/16(Mon) 21:33:27)
自分は絶対に書くか? と言われると自信はないです。

> 2.IDisposableインターフェースを実装してるかどうかをどう調べていますか?

あがっているほかには、
・「定義へ移動」でたどって調べる
・オブジェクトブラウザで見る(うろ覚え)

> 3.絶対に書く方は、using文(Disposeメソッド)忘れをどうやって見つけていますか?
>   ツールやなどありますか?
>   ビルドの警告があるとうれしいのですが。

コード分析にかける。(※Visual Studio Premium 以上が必要)
http://msdn.microsoft.com/ja-jp/library/ms182289(v=vs.100).aspx

> 4.バージョンアップでクラスにIDisposableインターフェースが実装されることはありますか?
>   例えば、StringBuilderにIDisposableインターフェースが実装されたら困ります。

どういうときに IDisposable を追加するか? というと、
・ほんとは必要だったけど、実装を忘れた
・クラスにアンマネージリソースを追加する必要ができた
例えばこんなところで、.NET Framework のクラスライブラリならまず心配しなくてよいのではないかと。

逆にクラスライブラリを作っている立場で、既存のクラスに IDisposable を追加しようとするのは
利用している側のコードに思いっきり影響がありますので、注意が必要です。
(それがホントに必要なら、周りにゴメンナサイして追加するわけですが…)
引用返信 編集キー/
■69322 / inTopicNo.4)  Re[1]: using文(Disposeメソッド)の使用
□投稿者/ Jitta (122回)-(2013/12/16(Mon) 22:04:33)
Jitta さんの Web サイト
No69310 (fullhappy さん) に返信

>   例1.
>     テンプレートで作成された
>     Application.Run(new Form1());
>     も書き換えるか?
>     Application.RunがInvalidOperationExceptionの例外となった場合、
>     Form1のDisposeは呼び出されないようです。
>
>   例2.
>     印刷のPrintPageイベントで使用するFontをFormのメンバー変数とし、
>     コンストラクタやLoadイベントでnewした場合、FormのDisposeに
>     Font.Disposeを書くか?

 アプリケーションのライフサイクルの最後まで必要なら、書きません。
アプリケーションが終了されるときにファイナライザから呼ばれますから。
終了するときなので、パフォーマンスも気にする必要ないでしょう。


> 2.IDisposableインターフェースを実装してるかどうかをどう調べていますか?

 ドキュメントを確認します。
あるいは、「.dis」と入力して、あるかどうか確認します。


> 3.絶対に書く方は、using文(Disposeメソッド)忘れをどうやって見つけていますか?
>   ツールやなどありますか?
>   ビルドの警告があるとうれしいのですが。

 コードを書くときに、先に書きます。

Stream stream = new TextStream(...);
stream.Dispose();

と書いてから(というか、using ブロックに書き直してから)、間に埋めていきます。


> 4.バージョンアップでクラスにIDisposableインターフェースが実装されることはありますか?
>   例えば、StringBuilderにIDisposableインターフェースが実装されたら困ります。

 おそらく、勘違いされていると思います。
WebSurferさんのブログに引用されていますが、
IDisposable インタフェースを実装するのは、GC が管理しないリソースを扱うときです。
それは、設計の段階で分かっているはずです。
機能拡張で IDisposable が必要になったのなら、別のクラスにするべきです。

引用返信 編集キー/
■69324 / inTopicNo.5)  Re[2]: using文(Disposeメソッド)の使用
□投稿者/ Hongliang (141回)-(2013/12/16(Mon) 22:10:03)
System.Net.Mail.SmtpClientは.NET 4でIDisposableが増えましたねぇ……(遠い目)。
引用返信 編集キー/
■69356 / inTopicNo.6)  Re[3]: using文(Disposeメソッド)の使用
□投稿者/ Jitta (125回)-(2013/12/18(Wed) 22:01:49)
No69324 (Hongliang さん) に返信
> System.Net.Mail.SmtpClientは.NET 4でIDisposableが増えましたねぇ……(遠い目)。
確認しました。
反則だと思います(-_-;)
引用返信 編集キー/
■69358 / inTopicNo.7)  Re[4]: using文(Disposeメソッド)の使用
□投稿者/ WebSurfer (137回)-(2013/12/19(Thu) 09:35:33)
No69356 (Jitta さん) に返信
> ■No69324 (Hongliang さん) に返信
>>System.Net.Mail.SmtpClientは.NET 4でIDisposableが増えましたねぇ……(遠い目)。
> 確認しました。
> 反則だと思います(-_-;)

スレッドの表題から外れている SmtpClient についてレスするのも何ですが、
SmtpClient は問題が多くて、ちょっとひどすぎと思うので一言。

自分のような素人でも、↓ こんなに多くの問題に遭遇してます。

Encoding が iso-2022-jp の場合、(1) 直接 Subject プロパティに日本語
を代入すると Q エンコードになる。.NET 4.5 で実装が変わってさらにお
かしなことになっている。(2) 本文に Body を使用すると Content-Transfer-
Encoding は 8bit エンコードになってしまう。(3) 添付ファイル名(Content-
Type の name)は、どのよう設定にしても UTF-8 の B エンコードになっ
てしまう。

AUTH SMTP は LOGIN しかサポートしていない。LOGIN 認証の方法は標準化
されていないそうなのでやむを得ないのかもしれないが、SmtpClient の実
装では SMTP サーバによってはうまく行かない。(.NET 4 以降は未確認)

.NET 4 の SmtpClient で、添付ファイルに長い日本語のファイル名を使う
と文字化けする。(.NET 3.5 以前では問題なし。.NET 4.5 で修正したか
どうかは未確認・・・修正するという話ではあったが)

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -