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

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

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

Re[2]: using を使用した場合の記述方法


(過去ログ 24 を表示中)

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

■10438 / inTopicNo.1)  using を使用した場合の記述方法
  
□投稿者/ KENSIN (1回)-(2007/11/18(Sun) 01:59:54)

分類:[C#] 

2007/11/18(Sun) 02:01:52 編集(投稿者)

こんにちは、はじめて投稿させて頂きます。

簡単なサンプルで申し訳ありませんが、下記のようなコードで変数を介さずに直接 クラス B 内のメソッド C を呼び出していました。

class A {
  static void Main() {
    new B().C();
  }
}

class B {
  public void C() {
    // 実処理
  }
}

しかしながら、クラス B 内で、Dispose をしなくてはならない事になりコードを以下のように書き換えました。

class A {
  static void Main() {
    using(B X = new B()){
      X.C();
    }
  }
}

class B : IDisposable{
  public void C() {
    // 実処理
  }

  public void Dispose() {
    // 開放処理とか
  }
}

実行には問題ないのですが、今まで変数を使用せずにメソッド C を呼び出していたのが、変数を介さなくてはならなくなってしまいました。
何かもうちょっと良い記述方法は無いものでしょうか?

よろしくお願いします。

引用返信 編集キー/
■10446 / inTopicNo.2)  Re[1]: using を使用した場合の記述方法
□投稿者/ Tesla (15回)-(2007/11/18(Sun) 09:58:45)
2007/11/18(Sun) 10:11:57 編集(投稿者)
素直に変数を介すことをお勧めします。

どうしてもと言うならメソッドCの戻り値でB自身を返却すればできますが、こんなことは止めた方がいいです。

using (new B().C())
{
}

class B : IDisposable
{
    public B C()
    {
        return this;
    }

    public void Dispose()
    {
    }
}

引用返信 編集キー/
■10449 / inTopicNo.3)  Re[2]: using を使用した場合の記述方法
□投稿者/ KENSIN (3回)-(2007/11/18(Sun) 12:18:20)
No10446 (Tesla さん) に返信
ご返答有難う御座います。
ご指摘の通り素直に変数を介す事にします。

C++を使用していた時にはこの書き方でメソッド実行後に確実にデストラクタを呼び出してくれていたので、その様な記述が出来ないものかと思いましたが、一長一短ですね。

ありがとうございました。

> 2007/11/18(Sun) 10:11:57 編集(投稿者)
>
> 素直に変数を介すことをお勧めします。
>
> どうしてもと言うならメソッドCの戻り値でB自身を返却すればできますが、こんなことは止めた方がいいです。
>
> using (new B().C())
> {
> }
>
> class B : IDisposable
> {
> public B C()
> {
> return this;
> }
>
> public void Dispose()
> {
> }
> }
解決済み
引用返信 編集キー/
■10450 / inTopicNo.4)  Re[1]: using を使用した場合の記述方法
□投稿者/ よねKEN (88回)-(2007/11/18(Sun) 12:23:47)
> 実行には問題ないのですが、今まで変数を使用せずにメソッド C を呼び出していたのが、
> 変数を介さなくてはならなくなってしまいました。

変数を介さずにインスタンスメソッドを呼び出すというのは
使用方法を間違っているか、そのメソッド(あるいはクラス)の設計をミスっているかどちらかの気がします。

> 何かもうちょっと良い記述方法は無いものでしょうか?

そもそもの話として、メソッドCはインスタンスメソッドでなければならないのでしょうか?

>>new B().C();

こういう使い方しか想定されないなら、このメソッドCがインスタンスメソッドである
必要性がないですよね。



引用返信 編集キー/
■10464 / inTopicNo.5)  Re[2]: using を使用した場合の記述方法
□投稿者/ がる (6回)-(2007/11/18(Sun) 18:41:40)
C++ではインスタンスの有効期間とDisposeの呼び出しが一致し、
C#では一致しないというのはおっしゃるとおりです。

呼び出しを一致させたいならばデストラクタを使ったらいかがでしょう?
デストラクタはC#でもインスタンスの破棄で必ず実行されます。
つまりクラスBに

B~
{
  Dispose();
}

とかです。
とりあえず鵜呑みにせず色々確認の上で理解して使用ください。
引用返信 編集キー/
■10467 / inTopicNo.6)  Re[3]: using を使用した場合の記述方法
□投稿者/ 囚人 (237回)-(2007/11/18(Sun) 22:21:56)
>デストラクタはC#でもインスタンスの破棄で必ず実行されます。

確かにそのとおりですが、デストラクタが呼び出れるタイミングが不定です。
引用返信 編集キー/
■10506 / inTopicNo.7)  Re[1]: using を使用した場合の記述方法
□投稿者/ Jitta (429回)-(2007/11/19(Mon) 22:34:36)
Jitta さんの Web サイト
No10446 (Tesla さん) に返信
> 今まで変数を使用せずにメソッド C を呼び出していたのが、変数を介さなくてはならなくなってしまいました。

 この書き方が、引っかかりました。
これは、「new B().C();」のことですか?そうであるなら、変数を書いていないだけで、使用していますよ?


> クラス B 内で、Dispose をしなくてはならない事になりコードを以下のように書き換えました。

 この書き方も、気になりますね。クラス B の中で Dispose する、って、どういうこと?
「クラス B のインスタンスは、Dispose しなければならなくなりました。」
なら、まだわかるけど。
 B.C メソッドで Dispose しなければならないなら、B.C メソッドの中で Dispose すれば済む話ですよね?
 B のインスタンスが、インスタンス生存中にアンマネージ リソースを使うから、そのリソースを解放する必要が有るわけですよね?B.C メソッドで閉じてしまえば、B をインスタンス化する必要も、B のインスタンスで Dispose する必要もありません。

引用返信 編集キー/
■10511 / inTopicNo.8)  Re[2]: using を使用した場合の記述方法
□投稿者/ がる (7回)-(2007/11/20(Tue) 00:42:37)
No10506 (Jitta さん) に返信
> ■No10446 (Tesla さん) に返信
>>今まで変数を使用せずにメソッド C を呼び出していたのが、変数を介さなくてはならなくなってしまいました。
>
>  この書き方が、引っかかりました。
> これは、「new B().C();」のことですか?そうであるなら、変数を書いていないだけで、使用していますよ?

あげ足を取りたいのはわかりますが、
「識別子を増やしたくない」と脳内変換してあげてください。
それが上級者というものではないのですか?m(_)m

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -