質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

5回答

447閲覧

C#のガーベジコレクションについて

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2018/05/27 01:42

Unity + C#でアプリを作成しているのですが、以下のソースの記述だとガーベジコレクションを頻発させてしまうのでしょうか?

C#

1 Dictionary<string, string> dic = new Dictionary<string, string>();//なんかのDictionary 2 3 void SetParam(string key) 4 { 5 string val = dic[key]; 6 SetName(val);//valを使う何かしらの処理 7 }

ここで訊きたいのは一時変数を用意することとガーベジコレクションが関係あるかです

C#

1 void SetParam(string key) 2 { 3 string val = dic[key]; 4 SetName(val);//valを使う何かしらの処理 5 }

C#

1 void SetParam(string key) 2 { 3 SetName(dic[key]); 4 }

ではガーベジコレクションに関係あるのでしょうか。
個人的には一時変数を用意した方が好きなのですが。
(単純に見た目が)

ご回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ここで訊きたいのは一時変数を用意することとガーベジコレクションが関係あるかです

関係ありません。C#コンパイラーの最適化機能により、無駄(と判断した)変数への代入は適当に省略してくれるからです。ご質問のコード例でいえば、最適化オプションを付けてコンパイルすれば、2番目と3番目のソースはまったく同じバイナリコードが出力されます。
ですので、あまり気にすることはありません。

私は一時変数はよく作ります。その方がデバッグしやすいからです。

投稿2018/05/27 06:09

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/27 10:36

回答ありがとうございます。 一つ質問ああるのですが、今回は一時変数の型がstring型でしたがこれがクラス型(インスタンス)の場合も同じでしょうか。 HogeInfo info = HogeDic[key]; SetHoge(info); のような感じの時です。
catsforepaw

2018/05/27 10:48

その場合も同様です。最適化によって変数infoへの代入は省かれて、SetHogeメソッドに直接渡すようなコードが出力されます。
guest

0

新たにオブジェクトが生まれてないので、ガベージコレクションには関係ないと思います。

ガーベジコレクション

今まで自分では「ガベージ」と書いてきましたが、発音を調べると「ガーベジ」の方が近そうですね。「ガービジ」とは書きづらい。

投稿2018/05/27 13:16

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/27 14:04

回答ありがとうございます。 ガベージの方が言いやすいですよねw 自分はもうガーベジで慣れてしまいましたが最初はガベージって言ってました。
guest

0

初心者のうちは、ガーベージコレクションがどーのというのは気にする必要はありません。
そういう些末のことを気にしなくて済むように、プログラマが意図しないところでよろしくやってくれるように、それが導入されてますから。

それよりも、ガベージコレクションで回収されるものと、そうでもないものの見分けをしっかりやる必要がありますねー

投稿2018/05/27 04:57

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/27 10:37

ご回答ありがとうございます。
guest

0

個人的には、一時変数作らない方が好きですが、どちらにしても大差無い気がします。

正確なところは、コンパイラとライブラリの実装によりますが、
C#の場合、見た目、newしなくても内部で newはありと思われます。
また、無理して newしないと言っても、ライブラリ内部で newされていたら、意味がありません。ここがボトルネックになっていれば、別ですが、そうでなければ、見易い方、メンテしやすい方を選択されるべきと思います。

投稿2018/05/27 03:10

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

原則としてGCの原因となるものはnewで獲得したインスタンスです。これによりヒープからメモリが獲得され、その量が増えてくるとGCのキッカケの1つとなります。
ご提示のコードはどちらとも明示的にはnewしていないのでGCを頻発させるコードではないと思います。
ただし、string型はちょっと特殊ですので要注意です。

でも、C#の場合、あまり頑張ってnewしない作りにはしない方が良いかも知れません。参照型インスタンスと値型インスタンスの見た目が変わらないので、参照型のnewを極力避けようとすると思わぬバグを生みやすくなります。

投稿2018/05/27 03:01

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問