DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FileStreamの初期化について

環境/言語:[XP]
分類:[.NET]

お世話になります

   Dim fs As FileStream

 Try
   fs = New FileStream(fileName, FileMode.Open, FileAccess.Read)

  Catch ex As Exception
      Throw ex
  Finally
    If IsNothing(fs) = False Then ←*
        '閉じる
         fs.Close()
         End If

      End Try

*の部分で警告文がでます。
警告 変数 'fs' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。

この警告文を消す方法を教えてください。
初期化すればいいかと思ったのですが、

 Dim fs As New FileStream

とすると、
エラー    1    この引数の数を受け付ける 'New' がないため、オーバーロードの解決に失敗しました。    

とでます。どうすればいいのでしょうか?

よろしくお願いします。
Tryの中がそれだけなら、開くときにエラーが発生しているわけで
Finalyの中で閉じる必要もないのでは?
■No22848に返信(KGさんの記事)
> Tryの中がそれだけなら、開くときにエラーが発生しているわけで
> Finalyの中で閉じる必要もないのでは?

そうなのですか?
必ず閉じる必要があると思いました。
ありがとうございました。
解決済み!
■No22849に返信(ryuさんの記事)
> ■No22848に返信(KGさんの記事)
>>Tryの中がそれだけなら、開くときにエラーが発生しているわけで
>>Finalyの中で閉じる必要もないのでは?
>
> そうなのですか?
> 必ず閉じる必要があると思いました。
> ありがとうございました。

解決済みにはなっていますが、VB2005以上であればUsingステートメント使って
みるのも手かもしれませんね。
■No22850に返信(KGさんの記事)
> ■No22849に返信(ryuさんの記事)
>>■No22848に返信(KGさんの記事)
> >>Tryの中がそれだけなら、開くときにエラーが発生しているわけで
> >>Finalyの中で閉じる必要もないのでは?
>>
>>そうなのですか?
>>必ず閉じる必要があると思いました。
>>ありがとうございました。
>
> 解決済みにはなっていますが、VB2005以上であればUsingステートメント使って
> みるのも手かもしれませんね。

すいません。
方法を教えてくださいませんか?
よろしくお願いします。
■No22851に返信(ryuさんの記事)
> ■No22850に返信(KGさんの記事)
>>■No22849に返信(ryuさんの記事)
> >>■No22848に返信(KGさんの記事)
>>>>Tryの中がそれだけなら、開くときにエラーが発生しているわけで
>>>>Finalyの中で閉じる必要もないのでは?
> >>
> >>そうなのですか?
> >>必ず閉じる必要があると思いました。
> >>ありがとうございました。
>>
>>解決済みにはなっていますが、VB2005以上であればUsingステートメント使って
>>みるのも手かもしれませんね。
>
以下の方法でやってみましたが、明示的な初期化がいるといわれ、
初期化をすると警告になりました・・

Using fs As New FileStream

エラー 72 この引数の数を受け付ける 'New' がないため、オーバーロードの解決に失敗しました。

できないのでしょうか?
この辺とかどうですか。

http://dobon.net/vb/dotnet/vb2cs/csusing.html
http://park5.wakwak.com/~weblab/refUsing.html
> 以下の方法でやってみましたが、明示的な初期化がいるといわれ、
> 初期化をすると警告になりました・・
>
> Using fs As New FileStream

それはTryの中でやっているNew FileStreamと違うからですよ。
引数のないNew(コンストラクタ)はFileStreamにはありません。
■No22855に返信(Azuleanさんの記事)
> この辺とかどうですか。
>
> http://dobon.net/vb/dotnet/vb2cs/csusing.html
> http://park5.wakwak.com/~weblab/refUsing.html

これを参考にやってみたのですが、
警告文がでてきました。。
■No22856に返信(Azuleanさんの記事)
>>以下の方法でやってみましたが、明示的な初期化がいるといわれ、
>>初期化をすると警告になりました・・
>>
>> Using fs As New FileStream
>
> それはTryの中でやっているNew FileStreamと違うからですよ。
> 引数のないNew(コンストラクタ)はFileStreamにはありません。

filestreamにはないということは、
先ほどのサンプルではできないということでしょうか?
何か方法が間違っているのでしょうか?

ちなみに、filestreamはコンストラクタNEWの部分で使用しています。
初回にXMLファイルから取得したかったので。
ryuさん
> ■No22856に返信(Azuleanさんの記事)
> >>以下の方法でやってみましたが、明示的な初期化がいるといわれ、
> >>初期化をすると警告になりました・・
> >>
> >> Using fs As New FileStream

ryuさんがかかれた最初のコード
> Dim fs As FileStream
>    fs = New FileStream(fileName, FileMode.Open, FileAccess.Read)
この2行が、宣言と、FileStreamの初期化ですよね。

Dim fs As FileStream= New FileStream(fileName, FileMode.Open, FileAccess.Read)
とか、
Dim fs As New FileStream(fileName, FileMode.Open, FileAccess.Read)
と宣言+初期化を一緒に出来る事はご存知でしょうか?

using の場合、宣言+初期化を一緒にしないといけません。
2008/08/29(Fri) 13:22:31 編集(投稿者)

#Usingの案ではなく、元の質問内容に対するコメントです

> Dim fs As FileStream

変数の宣言を書いたブロックと

>  Try
>    fs = New FileStream(fileName, FileMode.Open, FileAccess.Read)

実際に初期化しているブロックと

> Catch ex As Exception
> Throw ex
> Finally
>   If IsNothing(fs) = False Then ←*

fsを参照しているブロックとが異なる場所になっている関係で、

> '閉じる
> fs.Close()
> End If
>
> End Try
>
> *の部分で警告文がでます。
> 警告 変数 'fs' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。

この警告がでますが、上記のコードのパターンに関しては、
この警告は個人的には余計なお世話なんですよね。
人が見ると変数fsは初期化漏れをしているわけではないことが明らかなのですが、
コンパイラにはそれが判断できないため、どうしても警告がでてしまいます。

> この警告文を消す方法を教えてください。
> 初期化すればいいかと思ったのですが、
>
> Dim fs As New FileStream

Dim fs As FileStream = Nothing
というようにNothingで明示的に初期化してやれば警告はでません。

このコードの場合に関しては、警告されないためにこのようにするのがよいと思います。
一般論としては、無闇にNothingで初期化しておけばよいというわけではありませんので、その点はご留意ください。

[余談]
この警告は本来、以下の説明用コードのようなミスを防ぐためにあります。
説明用コードでは、変数Aは条件によって初期化されずに使われる
可能性があるので、ロジックの考慮漏れによるバグの可能性が高く、
これをコンパイラが警告します。

Dim i As Integer
Dim 変数A As あるクラス

i = 数値を取得する関数()
If i = 10 Then
  変数A = New あるクラス()  ' 変数Aが初期化されるのはここだけ
  '何かの処理
Else
  '何かの処理
End If

変数A.あるクラスのメソッド1()  ' iが10でなかったら、変数Aが未初期化の状態のため例外が起きる
■No22869に返信(よねKENさんの記事)
> 2008/08/29(Fri) 13:22:31 編集(投稿者)
>
> #Usingの案ではなく、元の質問内容に対するコメントです
>
>> Dim fs As FileStream
>
> 変数の宣言を書いたブロックと
>
>> Try
>>   fs = New FileStream(fileName, FileMode.Open, FileAccess.Read)
>
> 実際に初期化しているブロックと
>
>> Catch ex As Exception
>> Throw ex
>> Finally
>>  If IsNothing(fs) = False Then ←*
>
> fsを参照しているブロックとが異なる場所になっている関係で、
>
>> '閉じる
>> fs.Close()
>> End If
>>
>> End Try
>>
>>*の部分で警告文がでます。
>>警告 変数 'fs' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。
>
> この警告がでますが、上記のコードのパターンに関しては、
> この警告は個人的には余計なお世話なんですよね。
> 人が見ると変数fsは初期化漏れをしているわけではないことが明らかなのですが、
> コンパイラにはそれが判断できないため、どうしても警告がでてしまいます。
>
>>この警告文を消す方法を教えてください。
>>初期化すればいいかと思ったのですが、
>>
>> Dim fs As New FileStream
>
> Dim fs As FileStream = Nothing
> というようにNothingで明示的に初期化してやれば警告はでません。
>
> このコードの場合に関しては、警告されないためにこのようにするのがよいと思います。
> 一般論としては、無闇にNothingで初期化しておけばよいというわけではありませんので、その点はご留意ください。
>
> [余談]
> この警告は本来、以下の説明用コードのようなミスを防ぐためにあります。
> 説明用コードでは、変数Aは条件によって初期化されずに使われる
> 可能性があるので、ロジックの考慮漏れによるバグの可能性が高く、
> これをコンパイラが警告します。
>
> Dim i As Integer
> Dim 変数A As あるクラス
>
> i = 数値を取得する関数()
> If i = 10 Then
>   変数A = New あるクラス()  ' 変数Aが初期化されるのはここだけ
>   '何かの処理
> Else
>   '何かの処理
> End If
>
> 変数A.あるクラスのメソッド1()  ' iが10でなかったら、変数Aが未初期化の状態のため例外が起きる
>

ありがとうございました。
今回のfilestreamに関しては何か出てるなーというにしか
考えていませんでした。
勉強になりました。
解決済み!
■No22864に返信(きいよさんの記事)
> ryuさん
>>■No22856に返信(Azuleanさんの記事)
>>>>以下の方法でやってみましたが、明示的な初期化がいるといわれ、
>>>>初期化をすると警告になりました・・
>>>>
>>>> Using fs As New FileStream
>
> ryuさんがかかれた最初のコード
>>Dim fs As FileStream
>>   fs = New FileStream(fileName, FileMode.Open, FileAccess.Read)
> この2行が、宣言と、FileStreamの初期化ですよね。
>
> Dim fs As FileStream= New FileStream(fileName, FileMode.Open, FileAccess.Read)
> とか、
> Dim fs As New FileStream(fileName, FileMode.Open, FileAccess.Read)
> と宣言+初期化を一緒に出来る事はご存知でしょうか?
>
> using の場合、宣言+初期化を一緒にしないといけません。
>
>
なるほど。ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板