C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 関数の戻り値に構造体を返す


(過去ログ 49 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■26629 / inTopicNo.1)  関数の戻り値に構造体を返す
  
□投稿者/ FSX (1回)-(2008/10/16(Thu) 08:24:22)

分類:[C#] 

関数の戻り値として構造体を返したいのですが

  public struct StructK
  {
    public int a;
    public int b;
  }
  
  public StructK GetStruct()
  {
    StructK Temp;
    Temp.a = 123;
    Temp.b = 456;
    return (Temp);
  }
  
  public void Test()
  {
    StructK Kouzou;
    Kouzou = GetStruct();
  }

  このコーディングで構造体 Kouzou に目的の値が取得できていますが、
  関数の戻り値として構造体を返したいような場合はこのようなコーディング
 で良いのでしょうか?
  関数 GetStruct 内で宣言された Temp を返した場合呼び出し元に返って
 きた時に Temp が既に消滅してしまっているケースがあるのでしょうか?
 よろしくお願いします。





引用返信 編集キー/
■26631 / inTopicNo.2)  Re[1]: 関数の戻り値に構造体を返す
□投稿者/ 渋木宏明(ひどり) (917回)-(2008/10/16(Thu) 09:18:26)
渋木宏明(ひどり) さんの Web サイト
2008/10/16(Thu) 09:38:06 編集(投稿者)

> 関数の戻り値として構造体を返したいような場合はこのようなコーディング
>  で良いのでしょうか?

よいです。

> 関数 GetStruct 内で宣言された Temp を返した場合呼び出し元に返って
>  きた時に Temp が既に消滅してしまっているケースがあるのでしょうか?

あります。てか、この場合はGCに関係なく消滅しています。

ですが、戻り値の破壊とかそういうことを心配する必要はありません。
構造体は値型なので、return で返されるのは Temp に割り当てられた領域の参照ではなく、Temp が保持していた値のコピーです。

>return (Temp);

return はメソッド/関数ではなく文なので、() は必須ではありません。

引用返信 編集キー/
■26632 / inTopicNo.3)  Re[2]: 関数の戻り値に構造体を返す
□投稿者/ FSX (2回)-(2008/10/16(Thu) 09:51:21)
渋木宏明(ひどり)さん ありがとうございます。

昔のMS−Cなんかはローカル変数はスタック領域に確保され、今回のような
コーディングでは呼び元に戻る際にスタック領域が開放され、ゴミ?として残るものの
割り込み処理等でスタック領域が上書きで利用されるために結果として破壊されてしまう
ことがあったように記憶しています。

C#では(他の.NETもそうなのかも知れませんが)ローカル変数等はスタック領域に
確保されるのではなくオブジェクトとして管理され、寿命が尽きた際にはガベージコレクタ
によって処分される。
更に return によって返されるのは確保した Temp ではなくそのコピーであるため、万が一
コピー元の Temp が処分されてもそのコピーは残っている。
ということですよね。

納得できました。ありがとうございました。

解決済み
引用返信 編集キー/
■26634 / inTopicNo.4)  Re[3]: 関数の戻り値に構造体を返す
□投稿者/ 渋木宏明(ひどり) (918回)-(2008/10/16(Thu) 10:44:13)
渋木宏明(ひどり) さんの Web サイト
> C#では(他の.NETもそうなのかも知れませんが)ローカル変数等はスタック領域に
> 確保されるのではなくオブジェクトとして管理され、寿命が尽きた際にはガベージコレクタ
> によって処分される。

というのは「参照型」に当てはまる原則です。



> 更に return によって返されるのは確保した Temp ではなくそのコピーであるため、万が一
> コピー元の Temp が処分されてもそのコピーは残っている。
> ということですよね。

は「値型」に当てはまる原則です。

「値型」と「参照型」は異なる挙動を示すので、ヘルプなどで確認してみてください。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -