C#のusingについて

このQ&Aのポイント
  • C#のusing文は、オブジェクトを使用した後に自動的に解放するための構文です。
  • using文を使用すると、例外が発生してもオブジェクトが確実に解放されます。
  • 使用中のリソースを適切に解放することで、メモリーリークやリソースの不足を防ぐことができます。
回答を見る
  • ベストアンサー

C# の using について

お世話になっております。 C#の using について不明な点がありますので、よろしければご教示願います。 以下のようなサンプルがあったとします。 while の中で、using にてSoapClientに対してコネクションをはって、その後 continue にて途中で抜け出して再度ループを繰り返した場合でも、しっかりと close (Dispose) してくれるのでしょうか。 while (true) {  using (SoapClient client = new SoapClient())  {   client.xxxxx();   continue;  } } using の動作について、はっきりと把握できていないためコードに自信が持てない状態です。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

問題ないです。 using (T obj) { // code } は, T obj; try { // code } finally { if (obj != null) { ((IDisposable)obj).Dispose(); } } と同義です。

hatimiti
質問者

お礼

すばやいご回答ありがとうございます。 using の実装についても理解いたしました。 ありがとうございました。

関連するQ&A

  • C# で using

    C# で、IDisposable インタフェースを実装したクラスを利用するとき、 SomeClass a = new SomeClass(); (処理) a.Dispose(); のかわりに、 using (SomeClass a = new SomeClass()) {   (処理) } と書くのだと理解しているのですが、例えば SomeClass a = new SomeClass(); SomeClass b = a.SomeMethod(); a.Dispose(); (処理) b.Dispose(); のようなコードを using を用いて書き直すとどのようになるのでしょうか? a, b が、完全なネストになっていないので、こういう場合は無理でしょうか?

  • ClientBase<TChannel> クラスの Dispose() メソッドについて

    お世話になっております。 http://oshiete1.goo.ne.jp/qa5572673.html に引き続き、 Dispose() メソッドの実装について不明な点があるので、よろしければご教示願います。 環境は、Visual C# 2008 Express Edition です。 .NET 3.5 まず、公開されているWebサービスに対して、 ソリューションエクスプローラより、サービス参照の追加で、Clientクラスを自動生成いたしました。 その自動生成されたクラス(仮に XSoapClient)が、System.ServiceModel.ClientBase<TChannel> クラスを継承しています。 ClientBase クラスは、IDisposable インタフェースを実装しているのですが、XSoapClient にも ClientBase にも、Dispose() メソッドの実装が見当たりません。 (自動生成のため、別の場所に作成されているのかもしれません。) using (XSoapClient client = new XSoapClient()) {  // ここにコード } とした場合に、client の Dispose() の実装がわからないため、 しっかりとコネクションが切れているのかが不明です。 Dispose() メソッド内では、Close() メソッドが呼ばれているのが普通なのでしょうか。 以上、よろしくお願いいたします。

  • while(!b) の使い方について

    こんにちは。ある書籍のサンプルコードの一部に、 boolean b=false; while(!b){ b=IsPrime(++current); } といった箇所があったのですが、このwhile文のループ条件がよくわかりません。IsPrime()の返す値がfalseでない間、つまりbがtrueである間、ループを繰り返すように見えましたが、実際はIsPrime()がtrueを返したとき、ループから抜けていました。 IsPrime()の返す値が逆になったときループを抜けるとか、いろいろ考えてみましたがどうもしっくりしませんしよくわかりませんでしたので、どなたがご説明の方よろしくお願いします。

  • using文の使い方について

    visual C# 2010 Express を使用しています。 MySqlConnectionのデータベースのコネクション部分だけを次のようなメソッドとして、 そのオブジェクトだけを得たいと思いまして、次のような感じにしたのですが、 class Program { static void Main(string[] args) { MySqlConnection conn = GetConnection(); using (MySqlCommand cmd = new MySqlCommand("SELECT * FROM tbl where id = '1'", conn)) { conn.Open(); MySqlDataReader reader = null; reader = cmd.ExecuteReader(); reader.Read(); int i = reader.GetInt32(reader.GetOrdinal("id")); Console.WriteLine(i.ToString()); Console.ReadLine(); conn.Close(); } } static MySqlConnection GetConnection() { string connStr = "server=localhost;Database=test;Uid=root;Pwd="; using (MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connStr)) { return conn; } } } 一応これで表示できたのですが、 これで生成したMySqlConnectionはちゃんと開放(消滅)されているのでしょうか? このようなやり方でデータを取得しているのを見たことがないで 大丈夫なのかな?と思いました。。

  • C#で派生クラスから描画処理を行う

    C#を勉強しているのですが、GUIを作り初めて描画処理で分からない所があり、質問させて頂きます。 基本クラスの方で「Hello, world!」という文字列をDrawStringで表示させる事は出来たのですが、それを基本クラスを継承した派生クラスのメソッドで行うと何も表示されないんです。 以下が試したコードです。 //基本クラスSample1 using System; using System.Drawing; using System.Windows.Forms; public class Sample1 : Form {   protected Bitmap image; protected Graphics g; protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); Sample2 s = new Sample2(); s.helloworld(); e.Graphics.DrawImage(image, 0, 0); } public Sample1() { SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true); image = new Bitmap(600, 400); g = Graphics.FromImage(image); } static void Main() { Form form = new Sample1(); form.Text = "sample"; form.ClientSize = new Size(600, 400); form.BackColor = Color.FromArgb(0xff, 0xff, 0xff); Application.Run(form); } } //派生クラスSample2 using System; using System.Drawing; using System.Windows.Forms; public class Sample2 : Sample1 { Brush brush = new SolidBrush(Color.Black); public void helloworld() { g.DrawString("Hello, world!", this.Font, brush, 10, 10); } } なぜ表示されないのか分かる方いらしたら、ご教授願えないでしょうか。是非お願いします。

  • C# StreamReader,StreamWriter による文字化

    C# StreamReader,StreamWriter による文字化け お世話になります。 文字化けで悩んでいます。 Visual Studio 2008 C# にて、テキストファイルからデータを読んで別のテキストファイルに そのまま書き出す(もちろん実際の運用では加工するわけですが)処理で文字化けが起こります。 そのテキストファイル自身を C# で作れば問題はないのですが、メモ帳を使って書き込んだファイルでは 文字化けが起こります。 対処方法があれば教えてください。 以下はその実験に使ったコードです。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { // これは正常に書き込みできました StreamWriter sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw.WriteLine("これはてすとです。"); sw.WriteLine("This is test."); sw.Close(); // これも正常に読み込め、書き込みもできました StreamReader sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest.txt"); while (!sr.EndOfStream) { sw.WriteLine(sr.ReadLine()); } sr.Close(); sw.Close(); // 次はあらかじめメモ帳で作ったファイルを読んで、別のファイルに書き出します // これが文字化けします sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test2.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest2.txt"); while (!sr.EndOfStream) { string dat = sr.ReadLine(); sw.WriteLine(dat); Console.WriteLine(dat); } sr.Close(); sw.Close(); } } }

  • ソケットとそれに基づくストリームは1対1でしょうか。

    ソケット通信で、接続してきた クライアント(TcpClient tempclient)から、 NetworkStream,StreamReader,StreamWriterなどを 作っています。 Class A while(true){ tcpclient=server.AcceptClient(); networkstream=tcpclient.getStream(); streamreder=new StreamReader(networkstream...); mythread=new Mythread(tcpclient); // networkstream.close() streamreader.close() //これらを加えると、下の、/* */でエラーになります。 } MyThread B { Public Mythread(TcpCLient tcpclient){ /* ns=tcpclient.Getstream sr=... */ } このクライアントを、別のスレッドで使うため、 mythread=new MyThread(tcpclient)などとして、 別のクラスにもっていき、 そこでも、新たに、NetworkStream,StreamReaderを 作ったとします。 この場合、1つのクライアントにつき、2つの ストリームができるのでしょうか。 経験上、ストリームを作成するコードは 問題なく動きます。 しかし、新たにストリームを得たので、古いのを クローズすると、エラーになります。 新たに作ったストリームは、実は、古いストリームを、 使いまわしていることになるのでしょうか。 少し、分かりづらいかもしれませんが、 何か分かる人がいましたら、よろしくお願いします。

  • continueやbreakの後の数字について コード読んでください。

    continueやbreakの後の数字について良くわからないのですが、教えてください。具体的には下記のコードになります。いったいどこをどのように数えているのかまったくわかりません。2ってどこから2なのか1234ってどこで決まっているのかまったく意味がわかりません。よろしくお願いします。 $I = 0; WHILE(1) { $I++; ECHO "2番ループ:$I<BR>"; WHILE(1) { ECHO "1番ループ<BR>";    IF ($I < 5) { CONTINUE 2; } ELSE { BREAK 2; } ECHO "ここにはこないです";    } }

    • ベストアンサー
    • PHP
  • PHPのZipArchiveでzipが作成できない

    PHPでzipファイルを作ろうと思い、以下の手順で作成しました。 $zip = new ZipArchive(); if($zip->open('./'.$zip_file, ZipArchive::CREATE | ZIPARCHIVE::OVERWRITE) === true){ while($row = $stmt->fetch()){ // いろいろと処理 $zip->addFile($file); } $zip->close(); } すると、ループ内で行っているaddFileは返り値すべてtrueなのに対して、最後のcloseでfalseが返ってきてしまいます。 ループ処理内では画像を追加しているのですが、結構数が多いので容量の問題とかあるのでしょうか。

    • ベストアンサー
    • PHP
  • C#での時間制限のプログラム

    C#初心者です。Visual studioでプログラムを書いてます。 ラベルに制限時間を表示させ、起動して30秒経つと 「もういちどやりますか?」というメッセージボックスが出て、 「はい」でもう一度開始、「いいえ」でプログラムを終了させるような 処理をさせたいのですが、「はい」を押しても同じメッセージボックスが出てループしてしまい、もう一度開始させることができません…。 解決する方法を教えていただきたいです。よろしくお願いします。 以下、書いたコードです。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace timelimit { public partial class Form1 : Form { public Form1() { InitializeComponent(); } DateTime StartTime; TimeSpan TimeLimit; private void Form1_Load(object sender, EventArgs e) { timer1.Enabled = true; StartTime = DateTime.Now; TimeLimit = new TimeSpan(0,0,30); } private void timer1_Tick(object sender, EventArgs e) { TimeSpan tm = DateTime.Now - StartTime; if(tm > TimeLimit) { TimeLimit = new TimeSpan(0, 0, 30); timer1.Enabled = false; DialogResult result = MessageBox.Show ("時間終了!もういちどやりますか?","終了処理",MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { timer1.Enabled = true; } else if (result == DialogResult.No) { Close(); } }else{ label1.Text = (TimeLimit - tm).ToString(); } }

専門家に質問してみよう