「割り当て前の変数の使用」を解除するには?

解決


なまちゃ  2009-11-20 14:00:22  No: 146562  IP: [192.*.*.*]

VB.NET2003からVB2005への移行を初体験中なのですが
「割り当て前の変数の使用」について質問させて下さい。

Dim s As String
となっている変数に対してこの警告が出た場合は、
Dim s As String = ""
としたところ警告は解除されました。

Dim s() As String
と「配列」に対してこの警告が出た場合は、
上記の = "" の部分についてどのように
記述すれば良いか教えて頂けないでしょうか?

編集 削除
ガッ  2009-11-20 14:06:34  No: 146563  IP: [192.*.*.*]

とりあえず参照型や配列型はNothingにすればいいのでは.

編集 削除
魔界の仮面弁士  2009-11-20 18:42:14  No: 146564  IP: [192.*.*.*]

案1) 「割り当て前に使用しない」ようにする。
案2) 「Dim s(-1) As String」
案3) 「Dim s() As String = {}」
案4) 「Dim s() As String = Nothing」

編集 削除
なまちゃ  2009-11-24 10:30:45  No: 146565  IP: [192.*.*.*]

ガッさん、魔界の仮面弁士さん、回答ありがとうございます。
「とりあえずNothing」としたところ警告は解除されました。

ちなみに
> とりあえず参照型や配列型は
との事ですが、逆にどんな型でもNothingで統一しても大丈夫でしょうか?

Dim i As Integer = Nothing (= 0 と同じ?)
Dim s As String = Nothing (= "" と同じ?)
などですが、Nothingの取り扱い(使いどころ、使い分け)についての
認識が、まだ曖昧でよく分かっていないもので…

本題は解決しましたので十分ですが
もしよろしければ助言お願いします。

編集 削除
特攻隊長まるるう  2009-11-24 11:14:38  No: 146566  IP: [192.*.*.*]

コードを見て分からないから質問しているのだと思いますが、
だからこそ、例え結果が大丈夫でも、コードを見て分かる表現を
使用すべきでしょう。
これはコーディング規約レベルの話です。

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 (= "" と同じ?)
違います。

編集 削除
なまちゃ  2009-11-24 13:34:55  No: 146567  IP: [192.*.*.*]

特攻隊長まるるうさん、回答ありがとうございます。

> コードを見て分からないから質問しているのだと思いますが、
= "" でなく = Nothing
Return "" でなく Return Nothing
何箇所かですが、このようなコードを見つけ
違いはなに?どっちも同じ?といった疑問が出た次第です。

> これはコーディング規約レベルの話です。
仰る通りだと思います。何箇所かだけでしたので
いい機会(移行)なんで、この機にきちんと整理しようと思います。

ご丁寧な説明でとても参考になりました。ありがとうございました。

編集 削除
特攻隊長まるるう  2009-11-24 15:44:13  No: 146568  IP: [192.*.*.*]

> Return "" でなく Return Nothing
単純に統一できるなら良いんですけど、VB.NET2003でエラーが
出てないなら、違う値と分かった上でフラグとして使っている
ことがあるかも。
※VB.NET2003で
        s = Nothing
        Debug.WriteLine(s.Length)
の参照エラーが出るか確かめてみてください。
出ないなら、Nothing 設定しても "" と同等に扱われている
ので単純に置き換えていいと思いますが、エラーが出るなら
分かった上で使い分けている可能性が高いです。

正常終了(システムエラーが発生しないで該当データ無し)で
""を使って、
異常終了(システムエラー発生時)で Nothing を返す。

呼び出し側で、Nothing が返ってきた時と "" が返って
来たときで処理を変更するわけです。
バグを生みやすいので、戻り値は Boolean とかにして
文字列は "" で統一(余裕があるなら String.Empty で)
とかも考える必要があるのかも?

編集 削除
なまちゃ  2009-11-24 17:53:03  No: 146569  IP: [192.*.*.*]

特攻隊長まるるうさん、回答ありがとうございます。

> 参照エラーが出るか確かめてみてください。
確認しましたが、仰る通り下記エラーが発生しました。
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
ちなみに String.Empty の場合は "0" でした。

> 分かった上で使い分けている可能性が高いです。
敢えてこうしているのか?呼び出し側ではどう処理されているか?
きちんと整理してシステムの仕様等に問題がないようであれば
助言頂いたのように String.Empty 等で統一してみたいと思います。

度々のアドバイスありがとうございました。

編集 削除