
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();
}
}
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
> 昔ローカル変数を戻り値に使うと良くないという
初耳の流儀です。
C/C++において,「ローカル変数へのポインタや参照」を戻り値に使うな,というのはありますが。
# あと,C++では内部実装へのポインタや参照を返さないという流儀もありますね。内部の実装に依存させないために。
> 以下の方法は正しくないでしょうか?
正しいです。
C#においても,戻り値はC/C++と変わらず式の値 (変数単体なら変数の値) を返します。
このとき,C/C++では上記の「ローカル変数へのポインタや参照」を返すことができ,
その場合には関数から出たあとにポインタや参照が無効である,というのはあります。
しかし,C#ではそのような事は普通はできませんしやりません (unsafe使えばできてしまいますが……)。
このため,提示された方法で問題が起きる事はありません。
参照型と値型の違いですが,関係しそうなところだと
・変数
参照型の変数は常にオブジェクトへの参照かnullを格納する
値型の変数は常にオブジェクトを格納する (newを使ったとしても)
・式の値
参照型の式の値は常にオブジェクトへの参照かnullになる
値型の式の値は常にオブジェクトになる
・オブジェクトの位置
参照型のオブジェクトはヒープ上に存在する
値型のオブジェクトは他のオブジェクトの一部であればそのオブジェクトの存在する場所に,そうでなければスタック上に存在する
・代入
参照型の変数への参照型の式の代入は,オブジェクトへの参照またはnullの代入になる
値型の変数への値型の式の代入は,オブジェクトの浅いコピーになる
・戻り値の型に使った場合の扱い
戻り値としてオブジェクトへの参照またはnullが返る
戻り値としてオブジェクトの浅いコピーが返る
・メモリの回収
参照型のオブジェクトはGCが回収する
値型のオブジェクトは,他のオブジェクトの一部であればそのオブジェクトが破棄されたタイミングで回収される。そうでなければ,メソッドから抜けた時点で回収される。
といったものでしょうか。
# 上記は正確ではないとは思いますが,利用に影響するような間違いはないと思います。
No.1
- 回答日時:
その昔聞いた話はC++での場合ではないでしょうか?
あやふやな記憶ですが、C++ではクラスを戻り値で返すと、コピーが作成され、それが呼び出したものに代入される時にローカルのものが破棄されるのでその時にディストラクタが走って、そこで内部的に持っている物を破棄してしまうという事があったと思います。
しかしC#では、メモリを破棄するかどうかはその変数やメンバが1か所からでも参照されいてれば破棄されることはないので、そういった心配がなくなったと思いましたが。
少々日本語がおかしいかもしれませんが、どなたかヘルプを。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
テキストボックス中の文字列の...
-
エクセルのVBAの標準モジュール...
-
VBAで Set wb = Sheets(1).Cop...
-
オブジェクト変数の取得について
-
ExcelVBAでのNZ関数について
-
Excelでフィルタをかけると警告...
-
EXCEL VBA オートシェイプナン...
-
findメソッドの変数について
-
【VB】【エクセル操作】 SaveAs...
-
エクセルマクロエラー「'Cells'...
-
上下の位置揃えについて
-
AccessVBAで「dim dbs as datab...
-
VBA オブジェクトが空かどうか...
-
オブジェクト変数またはWITHブ...
-
Excelオブジェクトの操作
-
アクセスにてオブジェクト名変...
-
ある文字列が全て数字であるか...
-
エクセル エラー438
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
Excelでフィルタをかけると警告...
-
実行時エラー 3265「要求された...
-
VBAで既に開いている別アプリケ...
-
テキストボックス中の文字列の...
-
ExcelVBAでのNZ関数について
-
[VBA]CDOメッセージ送信エラー
-
EXCEL VBA オートシェイプナン...
-
VBAで Set wb = Sheets(1).Cop...
-
エクセルマクロエラー「'Cells'...
-
AccessVBAで「dim dbs as datab...
-
Excel VBAでWordの複数ファイル...
-
オブジェクトが見つかりません
-
CreateObjectとGetObjectの違い
-
エクセルVBAで配列内に空白デー...
-
オブジェクト変数またはWITHブ...
-
VBScriptからDLL参照設定したい
-
エクセルVBAでcode128のバー...
おすすめ情報