VB.NET2003からVB2005への移行を初体験中なのですが
「割り当て前の変数の使用」について質問させて下さい。
Dim s As String
となっている変数に対してこの警告が出た場合は、
Dim s As String = ""
としたところ警告は解除されました。
Dim s() As String
と「配列」に対してこの警告が出た場合は、
上記の = "" の部分についてどのように
記述すれば良いか教えて頂けないでしょうか?
とりあえず参照型や配列型はNothingにすればいいのでは.
編集 削除案1) 「割り当て前に使用しない」ようにする。
案2) 「Dim s(-1) As String」
案3) 「Dim s() As String = {}」
案4) 「Dim s() As String = Nothing」
ガッさん、魔界の仮面弁士さん、回答ありがとうございます。
「とりあえずNothing」としたところ警告は解除されました。
ちなみに
> とりあえず参照型や配列型は
との事ですが、逆にどんな型でもNothingで統一しても大丈夫でしょうか?
Dim i As Integer = Nothing (= 0 と同じ?)
Dim s As String = Nothing (= "" と同じ?)
などですが、Nothingの取り扱い(使いどころ、使い分け)についての
認識が、まだ曖昧でよく分かっていないもので…
本題は解決しましたので十分ですが
もしよろしければ助言お願いします。
コードを見て分からないから質問しているのだと思いますが、
だからこそ、例え結果が大丈夫でも、コードを見て分かる表現を
使用すべきでしょう。
これはコーディング規約レベルの話です。
Nothing のコードを選択したまま[F1]キーでヘルプ(MSDN)が
表示されます。
http://msdn.microsoft.com/ja-jp/library/0x9tb07z.aspx
>任意のデータ型の既定値を表します。
と書かれています。値型の変数の規定値に対して解説されて
います。
ただし、データベースを扱うと、必ず NULL という表現が
出てきますし、「未設定」と「0」が違う意味を持つ場面は
多々出てきます。
値型は、値を明示した初期化コードを書いておくことをお勧めします。
また、文字列型は、値型のように見える部分もあるでしょうが、参照型
です。(C言語を勉強すれば参照型であることがはっきり理解できるかも
しれません)
http://msdn.microsoft.com/ja-jp/library/dd314344.aspx
Nothing 指定では参照エラーが出る事に注意してください。
Dim s As String
s = String.Empty
Debug.WriteLine(s.Length)
s = Nothing
Debug.WriteLine(s.Length)
>Dim i As Integer = Nothing (= 0 と同じ?)
同じです。
>Dim s As String = Nothing (= "" と同じ?)
違います。
特攻隊長まるるうさん、回答ありがとうございます。
> コードを見て分からないから質問しているのだと思いますが、
= "" でなく = Nothing
Return "" でなく Return Nothing
何箇所かですが、このようなコードを見つけ
違いはなに?どっちも同じ?といった疑問が出た次第です。
> これはコーディング規約レベルの話です。
仰る通りだと思います。何箇所かだけでしたので
いい機会(移行)なんで、この機にきちんと整理しようと思います。
ご丁寧な説明でとても参考になりました。ありがとうございました。
> Return "" でなく Return Nothing
単純に統一できるなら良いんですけど、VB.NET2003でエラーが
出てないなら、違う値と分かった上でフラグとして使っている
ことがあるかも。
※VB.NET2003で
s = Nothing
Debug.WriteLine(s.Length)
の参照エラーが出るか確かめてみてください。
出ないなら、Nothing 設定しても "" と同等に扱われている
ので単純に置き換えていいと思いますが、エラーが出るなら
分かった上で使い分けている可能性が高いです。
正常終了(システムエラーが発生しないで該当データ無し)で
""を使って、
異常終了(システムエラー発生時)で Nothing を返す。
呼び出し側で、Nothing が返ってきた時と "" が返って
来たときで処理を変更するわけです。
バグを生みやすいので、戻り値は Boolean とかにして
文字列は "" で統一(余裕があるなら String.Empty で)
とかも考える必要があるのかも?
特攻隊長まるるうさん、回答ありがとうございます。
> 参照エラーが出るか確かめてみてください。
確認しましたが、仰る通り下記エラーが発生しました。
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
ちなみに String.Empty の場合は "0" でした。
> 分かった上で使い分けている可能性が高いです。
敢えてこうしているのか?呼び出し側ではどう処理されているか?
きちんと整理してシステムの仕様等に問題がないようであれば
助言頂いたのように String.Empty 等で統一してみたいと思います。
度々のアドバイスありがとうございました。