- ベストアンサー
newの使いどころ
こんにちは、vb.netを勉強しているのですが、 定義で使用するnewに関しまして、どのような場面で使いのが望ましいのでしょうか。 dim test as string dim test as new string どちらも使える。 また、メモリの開放?の際にnothingを行うのはforの内と外どちらがよいのでしょうか。 for i=1 to 10 dim test as new string test ="abc" test=nothing ←こっちか next test=nothing ←こっちか
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> String.Empty をお勧めします ""の方がよいという説もあり。 http://blogs.wankuma.com/shuujin/archive/2008/04/21/134497.aspx
その他の回答 (4)
- MARU4812
- ベストアンサー率43% (196/452)
> String型でNew String 型は「値型のように扱える参照型」 なので特殊ですね。New は極力使わないように してください。 (書く必要がある場面もあります^^; ややこしいですが、高度な使い方なので 「使わない」と覚えておいて良いと思います) Nothing による参照解除からの使用メモリ 領域の解放は VB6 時代の仕組みで、先の回答 にあるように VB.NET では「意味が無い」 どころか「Nothing を入れても解放されない」 が常識になっていますので、New が必要な オブジェクトを扱う場合はそのオブジェクト のマニュアルを読んで、指定された解放手順 を実行する必要があります。 。。。それは長くなるので割愛します。 String の話に戻りますが、 メモリ上では文字の配列のような処理を するので長さが可変にでき、それすなわち 参照型でないと都合が悪くなるのですが、 VB のコード上では、数値型の固定エリアに 値を入れるのと同等に見えます。つまり 値型のように扱えるように工夫されています。 VB は裏で色々な事を自動でやってくれる のです。初心者でもなんとなく動くコード が書けますが、上級者にとってはありがた 迷惑となる事も。。。 >dim test as string >dim test as new string >どちらも使える。 VB2008 で見ましたが、後者は文法エラーですね。 前者は変数宣言しただけですので、参照型の特徴 が出て、中身は Noting です。 後者は中身に何か入れる必要がありますので、 引数で指定する形になります。 Dim test As String = "あああ" Dim test As New String("あああ") であれば同じ意味だと思います。 Option Strict On にすれば警告が出ると 思いますが、 Dim test As New String("あああ") は Dim test As New String(New Char() {"あ"c, "あ"c, "あ"c}) と解釈されます。 これが New を書く必要がある場面の1つですが。。。 Dim test As String = "あああ" と書いて下さい。 これは、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1127027911 ↑こちらの回答にあるように Dim s1 As String Dim s2 As String s1 = "あああ" s2 = s1 s2 = "いいい" としても、s1 は "あああ" のままです。 値型かのように振舞うように作られてしまってますので、 New は使わず、値型のように宣言するということです。 ただし、先の説明通り >dim test as string では中身が空っぽですので Debug.WriteLine(test.Length) としただけでエラーになってしまいます。 Nothing と空文字(長さ0の文字列)は 違います。 Dim test As String = String.Empty としておきます。これで Debug.WriteLine(test.Length) の結果は0になります。 Dim test As String = "" と同じ意味に見えるでしょうが、これは新規の リテラルを用意しますので、今から覚えるなら String.Empty をお勧めします。VB が用意して あるリテラルを参照しますので、ほんのわずか ですが早いということになります。 結論、String には基本的に New がいらない。 Nothing による参照解放はメモリの解放とは 結びつかない。つまり「変数での参照をやめました」 という意味で使って下さい。(String では値型の ように振舞う仕組みがあるので必要ありません。) 初期値を String.Empty などで指定しておく。 です。 String 型が特殊なので、一般的な New の使い方とは 別です。 C# の説明しか見つからなかったのですが http://www.atmarkit.co.jp/fdotnet/dotnettips/261arrayinit/arrayinit.html 参考にして下さい。
- todo36
- ベストアンサー率58% (728/1234)
For i As Integer = 1 To 10 Dim test As String = "abc" Next 変数のスコープはなるべく狭い範囲で宣言するべし。 スコープを抜けると参照が切れるので、Nothingを代入する必要はない。 String型でNewする理由が分からない。
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 #1さんの回答ですべてですが・・・、 個人的にループ内でnewしなくてもいいと思いますが・・・? 場合によりますが、提示されているような単純な用途なら、ループの前にnewしておいて、代入し直せばいいだけのような・・・。 その場合はループの外でnothingすればいいですね。 (当たり前ですが・・・) ただ、nothingが必要かどうかは・・・微妙。 別に要らんような気がする。
- D-Matsu
- ベストアンサー率45% (1080/2394)
前者は、端的に言うとobjectから派生する参照型のインスタンスを作成する際に必要です。 この辺をじっくり読んでください。 http://msdn.microsoft.com/ja-jp/library/dd314344.aspx 後者は、そもそも論としてforループ内のtestはループ外からはアクセス不能です。 ですから外に書いても文法エラーではじかれます。 更にそもそも論を展開すると、nothingを入れたところで即座に解放される訳ではないし、変数testの有効期間はforループのループ一回分だけで有効期間を過ぎたら消滅し、その結果test以外では参照されていないオブジェクトは解放対象に入る、はず。 何が言いたいかというと、このケースにおいては「nothingを入れる」という行為そのものが不要ってことですが。