2011-08-05 11 views
2

私は次のコードを書いています。FileInfoでのキーワードの使用

 static void Main(string[] args) 
     { 
      FileInfo fiobj = new FileInfo(@"e:\mohan.txt"); 
      Console.Write("Name of file:"+ fiobj.Name); 

      using(StreamWriter sw = fiobj.AppendText()) 
      { 
       sw.WriteLine("mohan!"); 
      } 
     } 

    // code not working 

    static void Main(string[] args) 
     { 
      FileInfo fiobj = new FileInfo(@"e:\mohan.txt"); 
      Console.Write("Name of file:"+ fiobj.Name); 

      StreamWriter sw = fiobj.AppendText();    
      sw.WriteLine("mohan!");    
     } 

私は「使用して(){}」私は、ファイルに書き込むことができていますブロックが、ときに私は、私はSoが操作を行うことができないのです(){}ブロックを使用せずに同じコードを書いたを使用します なぜそうですか? 私が知っている限り、(){}ブロックはオブジェクトの有効期間を指定します。 using(){}は、データをファイルに書き込むことを可能にするために、ここで何か面白いことをブロックしますか?

+1

「私はそうすることができません」と定義してください。何が起こるのですか? 'using'はファイルを閉じる' Dispose() 'を呼び出しますが、* after *を何もしないので、ここでは目立つ違いはありません('使用する 'バージョンがより正確です。注) –

+0

'using'ブロックなしではどんなエラーが出ますか?ファイルがまだアプリケーションの以前の実行からロックされている可能性はありますか(たとえば、最初に動作しますか?) – stevehipwell

+0

@Marc彼が何度もプログラムを実行すると、プロセスの1つがロックされている可能性があります –

答えて

5

usingは、範囲がusingブロックの外になると、オブジェクトが正しくDisposedであることを正しく示すための略語です。

StreamWriter sw = fiobj.AppendText(); 
try 
{ 
    sw.WriteLine("mohan!"); 
} 
finally 
{ 
    if (sw != null) 
    { 
     ((IDisposable)sw).Dispose(); 
    } 
} 

このコードを正しく閉じてのStreamWriterの処分:

あなたのコードは同等です。それがなければ、それはロックされたままです。

Source

6

usingの文がなければ、あなたはStreamWriterを閉じていません。
したがって、StreamWriterは開いたままで、ファイルはロックされたままです。

+0

"NETがマネージドコードを提供するのは、StreamWriterを閉じるCLRの責任ではないのですか? –

+1

@Mohan:はい、GCは非決定的です。 'IDisposable'オブジェクトは、できるだけ早く' using'ブロックに明示的に配置する必要があります。 – SLaks

関連する問題