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

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

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

Re[4]: newについて


(過去ログ 53 を表示中)

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

■29905 / inTopicNo.1)  newについて
  
□投稿者/ T.K (1回)-(2008/12/16(Tue) 14:09:08)

分類:[C#] 

Visual Studio 2008 C#をはじめて1ヶ月の初心者です。

現在、Form画面に表示されている文字を多国語対応にする為に、
日本語と他国語の対応ファイルを作成し、そのファイルから文字列をコレクション配列に読込み、
画面の文字を置き換えるクラスを作成しました。(Dispクラス)

このクラスをそれぞれのForm.Load()でNewし、画面の文字を置き換えていますが、
Newのたびにメモリーが確保されているとしたら、無駄だなーと思い質問させていただきました。

そこで、質問です。
1.上記の場合、Newするたびに、ファイルを必ず読み出しているのでしょうか?
(キャッシュなどに入っていて必ずしもアクセスは行っていないのでしょうか?)
(HDのLEDを見ていると、必ず光っているわけではありませんでした。)

2.親Form→子Form→孫FormとFormを開く毎にメモリー空間を占有していっているのでしょうか?
(タスクマネージャーで確認しても、必ずメモリー空間を占有しているようには見えませんでした。)

3.どのタイミングでDispクラスで占有してるメモリー空間は開放されるのでしょうか?
(タスクマネージャーではいつ開放されるタイミングが一定ではなく、よくわかりませんでした。)

4.このような場合、どのように対応していくのがC#としてベストな方法なのでしょうか?
 (グローバル変数で対応するのは、オブジェクト指向ぽっくないような気がするし、
 かといって、毎回Newするのも速度やメモリースペース的に、ベストではないような気もします。)

是非教えてください。
宜しくお願いします。

 

引用返信 編集キー/
■29907 / inTopicNo.2)  Re[1]: newについて
□投稿者/ .SHO (422回)-(2008/12/16(Tue) 14:16:42)
No29905 (T.K さん) に返信

少なくとも、メモリの確保とファイル読み込みのキャッシュは別物ですよね。
引用返信 編集キー/
■29910 / inTopicNo.3)  Re[2]: newについて
□投稿者/ T.K (2回)-(2008/12/16(Tue) 14:29:35)
No29907 (.SHO さん) に返信
> ■No29905 (T.K さん) に返信
>
> 少なくとも、メモリの確保とファイル読み込みのキャッシュは別物ですよね。

申し訳ありません、もう少し、違いを教えてください。


引用返信 編集キー/
■29911 / inTopicNo.4)  Re[3]: newについて
□投稿者/ .SHO (423回)-(2008/12/16(Tue) 14:36:59)
No29910 (T.K さん) に返信

> 申し訳ありません、もう少し、違いを教えてください。

いや、逆に何が同じなんですか?
キャッシュも所詮はメモリに確保されるということですか?
引用返信 編集キー/
■29912 / inTopicNo.5)  Re[1]: newについて
□投稿者/ たくボン (102回)-(2008/12/16(Tue) 14:44:11)
No29905 (T.K さん) に返信
> Visual Studio 2008 C#をはじめて1ヶ月の初心者です。
> 1.上記の場合、Newするたびに、ファイルを必ず読み出しているのでしょうか?
> (キャッシュなどに入っていて必ずしもアクセスは行っていないのでしょうか?)
> (HDのLEDを見ていると、必ず光っているわけではありませんでした。)

どこでファイルの読込を行っているかですね。コンストラクタ内でファイルを開いているなら、newするたびに読込されます。


> 2.親Form→子Form→孫FormとFormを開く毎にメモリー空間を占有していっているのでしょうか?
> (タスクマネージャーで確認しても、必ずメモリー空間を占有しているようには見えませんでした。)

何がメモリを消費していると思っていますか?画面?それとも日本・他国用に用意した文字列コレクション?
タスクマネージャーの何を見てそう判断されたのかわかりませんが、不安ならデータサイズを計測してみては?
おそらく、TKさんが思っているほどメモリは使ってないと思いますよ。

> 3.どのタイミングでDispクラスで占有してるメモリー空間は開放されるのでしょうか?
> (タスクマネージャーではいつ開放されるタイミングが一定ではなく、よくわかりませんでした。)

GCで管理するDispクラスのインスタンスへの参照カウンタが0になった後、決められたタイミングで解放されます。
GCの動作を知りたいなら書籍を探せばありますよ。

本来、.NETではプログラマがメモリ管理を意識しないでも作成できるのが特徴なので、プログラマが意識する必要はありません。(ただし、勉強したいというなら別です。しっかり勉強してください)


> 4.このような場合、どのように対応していくのがC#としてベストな方法なのでしょうか?
>  (グローバル変数で対応するのは、オブジェクト指向ぽっくないような気がするし、
>  かといって、毎回Newするのも速度やメモリースペース的に、ベストではないような気もします。)

うんうん。こうやって色々考えてる姿はいいですね。
カルチャとリソース、【多国】語対応で検索してみては?きっと望んでいる機能がありますよ:-)
引用返信 編集キー/
■29913 / inTopicNo.6)  Re[4]: newについて
□投稿者/ たくボン (103回)-(2008/12/16(Tue) 14:46:34)
No29911 (.SHO さん) に返信
> ■No29910 (T.K さん) に返信
>
>>申し訳ありません、もう少し、違いを教えてください。
>
> いや、逆に何が同じなんですか?
> キャッシュも所詮はメモリに確保されるということですか?

ごめん、俺もよくわからないので教えてください。
引用返信 編集キー/
■29915 / inTopicNo.7)  Re[4]: newについて
□投稿者/ T.K (3回)-(2008/12/16(Tue) 14:53:33)
No29911 (.SHO さん) に返信
> ■No29910 (T.K さん) に返信

> いや、逆に何が同じなんですか?
> キャッシュも所詮はメモリに確保されるということですか?

同じとは思っていませんよ。ただ、私が勘違いしていると、いけないので、説明を受けたかっただけです。

キャッシュはハードディスクアクセスを高速に行う為に、OSがメモリー上に、データをおいておくものだと思っていました。
今回、Newする毎に、HDのLEDランプが必ず光るとは限らない為、キャッシュに入っているものから取り出しているのかなーと思ったしだいです。
引用返信 編集キー/
■29917 / inTopicNo.8)  Re[5]: newについて
□投稿者/ .SHO (424回)-(2008/12/16(Tue) 15:02:59)
No29915 (T.K さん) に返信

> キャッシュはハードディスクアクセスを高速に行う為に、OSがメモリー上に、データをおいておくものだと思っていました。
> 今回、Newする毎に、HDのLEDランプが必ず光るとは限らない為、キャッシュに入っているものから取り出しているのかなーと思ったしだいです。

ディスクキャッシュはHDなど周辺機器に搭載されている場合もあるし
メインメモリの一部を使用する場合もあるし、その両方を併用する場合もあります。

メインメモリのキャッシュを使用した場合は、HDのLEDランプは光らないでしょう。
(言われているとおりです。)

いずれにしても、newするたびにメモリが確保されているかどうかと、ファイルアクセスで
キャッシュを使用しているかどうかは別物だということです。

もっと平たく言えば、HDのLEDランプを見ても、Newするたびにファイルを必ず読み出している
かどうかはわからないということです。
引用返信 編集キー/
■29918 / inTopicNo.9)  Re[2]: newについて
□投稿者/ T.K (4回)-(2008/12/16(Tue) 15:08:28)
No29912 (たくボン さん) に返信
> ■No29905 (T.K さん) に返信

ご返事ありがとうございます。

>>1.上記の場合、Newするたびに、ファイルを必ず読み出しているのでしょうか?
> どこでファイルの読込を行っているかですね。コンストラクタ内でファイルを開いているなら、newするたびに読込されます。
言葉尻を捕まえて質問するようで申し訳ないのですが、とても気になっている部分なので、質問させてください。
コンストラクター以外の所でnewすれば、読込みは行われないと思っていいのでしょうか?
たとえば、各画面の.Load()のところでnewしていれば読込みは行わないと思っていいのでしょうか?

>>2.親Form→子Form→孫FormとFormを開く毎にメモリー空間を占有していっているのでしょうか?
>>(タスクマネージャーで確認しても、必ずメモリー空間を占有しているようには見えませんでした。)
> 何がメモリを消費していると思っていますか?画面?それとも日本・他国用に用意した文字列コレクション?
> タスクマネージャーの何を見てそう判断されたのかわかりませんが、不安ならデータサイズを計測してみては?
> おそらく、TKさんが思っているほどメモリは使ってないと思いますよ。
日本語・他国語用に用意した文字列コレクションが、親Formに1つ、子Formに1つ、孫Formに1つと増えていくことを恐れています。

>>3.どのタイミングでDispクラスで占有してるメモリー空間は開放されるのでしょうか?
>>(タスクマネージャーではいつ開放されるタイミングが一定ではなく、よくわかりませんでした。)
>
> GCで管理するDispクラスのインスタンスへの参照カウンタが0になった後、決められたタイミングで解放されます。
> GCの動作を知りたいなら書籍を探せばありますよ。
ありがとうございます。調べてみます。

> 本来、.NETではプログラマがメモリ管理を意識しないでも作成できるのが特徴なので、プログラマが意識する必要はありません。(ただし、勉強したいというなら別です。しっかり勉強してください)

>>4.このような場合、どのように対応していくのがC#としてベストな方法なのでしょうか?
>> (グローバル変数で対応するのは、オブジェクト指向ぽっくないような気がするし、
>> かといって、毎回Newするのも速度やメモリースペース的に、ベストではないような気もします。)
>
> うんうん。こうやって色々考えてる姿はいいですね。
> カルチャとリソース、【多国】語対応で検索してみては?きっと望んでいる機能がありますよ:-)
アドバイスありがとうございます。

引用返信 編集キー/
■29919 / inTopicNo.10)  Re[3]: newについて
□投稿者/ 倉田 有大 (402回)-(2008/12/16(Tue) 15:13:59)
No29918 (T.K さん) に返信
> ■No29912 (たくボン さん) に返信
>>■No29905 (T.K さん) に返信
>
> ご返事ありがとうございます。
>
> >>1.上記の場合、Newするたびに、ファイルを必ず読み出しているのでしょうか?
>>どこでファイルの読込を行っているかですね。コンストラクタ内でファイルを開いているなら、newするたびに読込されます。
> 言葉尻を捕まえて質問するようで申し訳ないのですが、とても気になっている部分なので、質問させてください。
> コンストラクター以外の所でnewすれば、読込みは行われないと思っていいのでしょうか?
> たとえば、各画面の.Load()のところでnewしていれば読込みは行わないと思っていいのでしょうか?
>
> >>2.親Form→子Form→孫FormとFormを開く毎にメモリー空間を占有していっているのでしょうか?
> >>(タスクマネージャーで確認しても、必ずメモリー空間を占有しているようには見えませんでした。)
>>何がメモリを消費していると思っていますか?画面?それとも日本・他国用に用意した文字列コレクション?
>>タスクマネージャーの何を見てそう判断されたのかわかりませんが、不安ならデータサイズを計測してみては?
>>おそらく、TKさんが思っているほどメモリは使ってないと思いますよ。
> 日本語・他国語用に用意した文字列コレクションが、親Formに1つ、子Formに1つ、孫Formに1つと増えていくことを恐れています。
>
> >>3.どのタイミングでDispクラスで占有してるメモリー空間は開放されるのでしょうか?
> >>(タスクマネージャーではいつ開放されるタイミングが一定ではなく、よくわかりませんでした。)
>>
>>GCで管理するDispクラスのインスタンスへの参照カウンタが0になった後、決められたタイミングで解放されます。
>>GCの動作を知りたいなら書籍を探せばありますよ。
> ありがとうございます。調べてみます。
>
>>本来、.NETではプログラマがメモリ管理を意識しないでも作成できるのが特徴なので、プログラマが意識する必要はありません。(ただし、勉強したいというなら別です。しっかり勉強してください)
>
> >>4.このような場合、どのように対応していくのがC#としてベストな方法なのでしょうか?
> >> (グローバル変数で対応するのは、オブジェクト指向ぽっくないような気がするし、
> >> かといって、毎回Newするのも速度やメモリースペース的に、ベストではないような気もします。)
>>
>>うんうん。こうやって色々考えてる姿はいいですね。
>>カルチャとリソース、【多国】語対応で検索してみては?きっと望んでいる機能がありますよ:-)
> アドバイスありがとうございます。

実行中一度しか読み込まないのであればMainメソッドでファイルをよみこませて、フォームに渡してあげればどうでしょうか。
引用返信 編集キー/
■29920 / inTopicNo.11)  Re[6]: newについて
□投稿者/ T.K (5回)-(2008/12/16(Tue) 15:17:29)
No29917 (.SHO さん) に返信
> ■No29915 (T.K さん) に返信
>
>>キャッシュはハードディスクアクセスを高速に行う為に、OSがメモリー上に、データをおいておくものだと思っていました。
>>今回、Newする毎に、HDのLEDランプが必ず光るとは限らない為、キャッシュに入っているものから取り出しているのかなーと思ったしだいです。
>
> ディスクキャッシュはHDなど周辺機器に搭載されている場合もあるし
> メインメモリの一部を使用する場合もあるし、その両方を併用する場合もあります。
>
> メインメモリのキャッシュを使用した場合は、HDのLEDランプは光らないでしょう。
> (言われているとおりです。)
>
> いずれにしても、newするたびにメモリが確保されているかどうかと、ファイルアクセスで
> キャッシュを使用しているかどうかは別物だということです。
>
> もっと平たく言えば、HDのLEDランプを見ても、Newするたびにファイルを必ず読み出している
> かどうかはわからないということです。

返信ありがとうございます。
私の理解が、大きく誤っていなくて安心しました。

引用返信 編集キー/
■29921 / inTopicNo.12)  Re[4]: newについて
□投稿者/ T.K (6回)-(2008/12/16(Tue) 15:23:43)
No29919 (倉田 有大 さん) に返信
> ■No29918 (T.K さん) に返信
>>■No29912 (たくボン さん) に返信
> >>■No29905 (T.K さん) に返信
>>
>>ご返事ありがとうございます。
>>
>>>>1.上記の場合、Newするたびに、ファイルを必ず読み出しているのでしょうか?
> >>どこでファイルの読込を行っているかですね。コンストラクタ内でファイルを開いているなら、newするたびに読込されます。
>>言葉尻を捕まえて質問するようで申し訳ないのですが、とても気になっている部分なので、質問させてください。
>>コンストラクター以外の所でnewすれば、読込みは行われないと思っていいのでしょうか?
>>たとえば、各画面の.Load()のところでnewしていれば読込みは行わないと思っていいのでしょうか?
>>
>>>>2.親Form→子Form→孫FormとFormを開く毎にメモリー空間を占有していっているのでしょうか?
>>>>(タスクマネージャーで確認しても、必ずメモリー空間を占有しているようには見えませんでした。)
> >>何がメモリを消費していると思っていますか?画面?それとも日本・他国用に用意した文字列コレクション?
> >>タスクマネージャーの何を見てそう判断されたのかわかりませんが、不安ならデータサイズを計測してみては?
> >>おそらく、TKさんが思っているほどメモリは使ってないと思いますよ。
>>日本語・他国語用に用意した文字列コレクションが、親Formに1つ、子Formに1つ、孫Formに1つと増えていくことを恐れています。
>>
>>>>3.どのタイミングでDispクラスで占有してるメモリー空間は開放されるのでしょうか?
>>>>(タスクマネージャーではいつ開放されるタイミングが一定ではなく、よくわかりませんでした。)
> >>
> >>GCで管理するDispクラスのインスタンスへの参照カウンタが0になった後、決められたタイミングで解放されます。
> >>GCの動作を知りたいなら書籍を探せばありますよ。
>>ありがとうございます。調べてみます。
>>
> >>本来、.NETではプログラマがメモリ管理を意識しないでも作成できるのが特徴なので、プログラマが意識する必要はありません。(ただし、勉強したいというなら別です。しっかり勉強してください)
>>
>>>>4.このような場合、どのように対応していくのがC#としてベストな方法なのでしょうか?
>>>> (グローバル変数で対応するのは、オブジェクト指向ぽっくないような気がするし、
>>>> かといって、毎回Newするのも速度やメモリースペース的に、ベストではないような気もします。)
> >>
> >>うんうん。こうやって色々考えてる姿はいいですね。
> >>カルチャとリソース、【多国】語対応で検索してみては?きっと望んでいる機能がありますよ:-)
>>アドバイスありがとうございます。
>
> 実行中一度しか読み込まないのであればMainメソッドでファイルをよみこませて、フォームに渡してあげればどうでしょうか。

うおーーー。そうですね。フォームへデータを渡せばいいんですよね。
C#をはじめたばかりなもので、クラスばかりに気をとられていました。
様々なアドバイス、ありがとうございました。

解決済み
引用返信 編集キー/
■29924 / inTopicNo.13)  Re[3]: newについて
□投稿者/ たくボン (104回)-(2008/12/16(Tue) 15:47:54)
No29918 (T.K さん) に返信

解決済みだけど、回答ッス。

>>どこでファイルの読込を行っているかですね。コンストラクタ内でファイルを開いているなら、newするたびに読込されます。
> 言葉尻を捕まえて質問するようで申し訳ないのですが、とても気になっている部分なので、質問させてください。
> コンストラクター以外の所でnewすれば、読込みは行われないと思っていいのでしょうか?
> たとえば、各画面の.Load()のところでnewしていれば読込みは行わないと思っていいのでしょうか?

書き方がまずかったですね。Dispクラスがどのタイミングでファイルから読込を行っているかって意味でした。


> 日本語・他国語用に用意した文字列コレクションが、親Formに1つ、子Formに1つ、孫Formに1つと増えていくことを恐れています。

もう解決したみたいだから余計なお世話かもしれないけど、独自の言語ファイルを用意して、複数のフォームからアクセスするならsingletonでいいと思う。理屈さえわかれば難しくないし、既存のコードの修正も少なくて済むだろうし。

singletonならインスタンスは必ず1つなので、悩まなくてもいいですね:-)
解決済み
引用返信 編集キー/
■29925 / inTopicNo.14)  Re[4]: newについて
□投稿者/ 倉田 有大 (403回)-(2008/12/16(Tue) 15:51:40)
No29924 (たくボン さん) に返信
> ■No29918 (T.K さん) に返信
>
> 解決済みだけど、回答ッス。
>
> >>どこでファイルの読込を行っているかですね。コンストラクタ内でファイルを開いているなら、newするたびに読込されます。
>>言葉尻を捕まえて質問するようで申し訳ないのですが、とても気になっている部分なので、質問させてください。
>>コンストラクター以外の所でnewすれば、読込みは行われないと思っていいのでしょうか?
>>たとえば、各画面の.Load()のところでnewしていれば読込みは行わないと思っていいのでしょうか?
>
> 書き方がまずかったですね。Dispクラスがどのタイミングでファイルから読込を行っているかって意味でした。
>
>
>>日本語・他国語用に用意した文字列コレクションが、親Formに1つ、子Formに1つ、孫Formに1つと増えていくことを恐れています。
>
> もう解決したみたいだから余計なお世話かもしれないけど、独自の言語ファイルを用意して、複数のフォームからアクセスするならsingletonでいいと思う。理屈さえわかれば難しくないし、既存のコードの修正も少なくて済むだろうし。
>
> singletonならインスタンスは必ず1つなので、悩まなくてもいいですね:-)

ぐぐってみました。
おお、この手法はしらなかった。メモメモ。
解決済み
引用返信 編集キー/
■29927 / inTopicNo.15)  Re[4]: newについて
□投稿者/ T.K (7回)-(2008/12/16(Tue) 16:03:32)
No29924 (たくボン さん) に返信
> ■No29918 (T.K さん) に返信
>
> 解決済みだけど、回答ッス。
>
> >>どこでファイルの読込を行っているかですね。コンストラクタ内でファイルを開いているなら、newするたびに読込されます。
>>言葉尻を捕まえて質問するようで申し訳ないのですが、とても気になっている部分なので、質問させてください。
>>コンストラクター以外の所でnewすれば、読込みは行われないと思っていいのでしょうか?
>>たとえば、各画面の.Load()のところでnewしていれば読込みは行わないと思っていいのでしょうか?
>
> 書き方がまずかったですね。Dispクラスがどのタイミングでファイルから読込を行っているかって意味でした。
>
>
>>日本語・他国語用に用意した文字列コレクションが、親Formに1つ、子Formに1つ、孫Formに1つと増えていくことを恐れています。
>
> もう解決したみたいだから余計なお世話かもしれないけど、独自の言語ファイルを用意して、複数のフォームからアクセスするならsingletonでいいと思う。理屈さえわかれば難しくないし、既存のコードの修正も少なくて済むだろうし。
>
> singletonならインスタンスは必ず1つなので、悩まなくてもいいですね:-)

倉田さんのアドバイスで、嬉しくなり、思わず解決済をチェックしてしまいました。
質問していたのに、大変失礼しました。

GoFのデザインパターンに出てくるsingletonですね。
勉強することがいっぱいありそうです。
ありがとうございます。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -