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

解決


なまちゃ  2009-11-20 23:00:22  No: 146562

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

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

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


ガッ  2009-11-20 23:06:34  No: 146563

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


魔界の仮面弁士  2009-11-21 03:42:14  No: 146564

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


なまちゃ  2009-11-24 19:30:45  No: 146565

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

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

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

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


特攻隊長まるるう  2009-11-24 20:14:38  No: 146566

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

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 22:34:55  No: 146567

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

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

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

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


特攻隊長まるるう  2009-11-25 00:44:13  No: 146568

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

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

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


なまちゃ  2009-11-25 02:53:03  No: 146569

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加