• 締切済み

ローカル変数を戻り値に使うと良くない C#

C#2008で以下のように、Dumpメソッドを使った場合、 return sb.ToString();としていますが、 昔ローカル変数を戻り値に使うと良くないという 記憶があったのですが、正確なことはすっかり忘れてしまい 確か値型なら問題ないと思ったのですが、 以下の方法は正しくないでしょうか? 戻り値にこだわったのは、使えれば便利かなという程度です。 namespace Modorichi { public struct Test { public int a; public PlayInfo(string dummy) { a = -1; } public string Dump() { StringBuilder sb = new StringBuilder(); sb.Append(String.Format("a=[{0}]\n", this.a)); return sb.ToString(); } } }

みんなの回答

回答No.2

> 昔ローカル変数を戻り値に使うと良くないという 初耳の流儀です。 C/C++において,「ローカル変数へのポインタや参照」を戻り値に使うな,というのはありますが。 # あと,C++では内部実装へのポインタや参照を返さないという流儀もありますね。内部の実装に依存させないために。 > 以下の方法は正しくないでしょうか? 正しいです。 C#においても,戻り値はC/C++と変わらず式の値 (変数単体なら変数の値) を返します。 このとき,C/C++では上記の「ローカル変数へのポインタや参照」を返すことができ, その場合には関数から出たあとにポインタや参照が無効である,というのはあります。 しかし,C#ではそのような事は普通はできませんしやりません (unsafe使えばできてしまいますが……)。 このため,提示された方法で問題が起きる事はありません。 参照型と値型の違いですが,関係しそうなところだと ・変数  参照型の変数は常にオブジェクトへの参照かnullを格納する  値型の変数は常にオブジェクトを格納する (newを使ったとしても) ・式の値  参照型の式の値は常にオブジェクトへの参照かnullになる  値型の式の値は常にオブジェクトになる ・オブジェクトの位置  参照型のオブジェクトはヒープ上に存在する  値型のオブジェクトは他のオブジェクトの一部であればそのオブジェクトの存在する場所に,そうでなければスタック上に存在する ・代入  参照型の変数への参照型の式の代入は,オブジェクトへの参照またはnullの代入になる  値型の変数への値型の式の代入は,オブジェクトの浅いコピーになる ・戻り値の型に使った場合の扱い  戻り値としてオブジェクトへの参照またはnullが返る  戻り値としてオブジェクトの浅いコピーが返る ・メモリの回収  参照型のオブジェクトはGCが回収する  値型のオブジェクトは,他のオブジェクトの一部であればそのオブジェクトが破棄されたタイミングで回収される。そうでなければ,メソッドから抜けた時点で回収される。 といったものでしょうか。 # 上記は正確ではないとは思いますが,利用に影響するような間違いはないと思います。

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

その昔聞いた話はC++での場合ではないでしょうか? あやふやな記憶ですが、C++ではクラスを戻り値で返すと、コピーが作成され、それが呼び出したものに代入される時にローカルのものが破棄されるのでその時にディストラクタが走って、そこで内部的に持っている物を破棄してしまうという事があったと思います。 しかしC#では、メモリを破棄するかどうかはその変数やメンバが1か所からでも参照されいてれば破棄されることはないので、そういった心配がなくなったと思いましたが。 少々日本語がおかしいかもしれませんが、どなたかヘルプを。

関連するQ&A