ふらっと C#,C♯,C#(初心者用) Part137at TECH
ふらっと C#,C♯,C#(初心者用) Part137 - 暇つぶし2ch1011:デフォルトの名無しさん
18/06/05 10:35:58.82 l/0/VM/ma.net
状態をGUIだけに持たせておくのはおかしいといつか思うはず

1012:デフォルトの名無しさん
18/06/05 12:11:20.04 vCTdp4Eha.net
>>984
class FrameReceivedEventArgs:EventArgs
{
  public byte[] Frame{get; private set;}
  ....
}
class CommunicationPort
{
  public even EventHandler<FrameReceivedEventArgs> FrameReceived;
  ....
}
class FrameDecoder
{
  public FrameDecoder(CommunicationPort c}
  {
    c.FrameReceived +


1013:= CommunicationPort_FrameReceived;   }   private void CommunicationPort_FrameReceived((object sender, FrameReceivedEventArgs e)   {     ....   }   .... }



1014:デフォルトの名無しさん
18/06/05 12:44:05.86 eGZjT6RJM.net
>>990
引数に渡されたものを弄るのは行儀の悪い設計
IReceiverインターフェイスみたいなのを用意してport.AddReceiver(decoder)とするか、
>>984の言葉通りにいったん双方のクラスの外でイベントハンドラで受けて仲介したほうがいい

1015:デフォルトの名無しさん
18/06/05 12:51:41.81 eGZjT6RJM.net
>>990がなぜ行儀が悪いか補足しておこうか
普通、オブジェクトを別のクラスのコンストラクタに渡すとき、プログラマは 受け取った側→引数側 の向きの参照ができることを期待する
ところが、>>990だとそれが逆なんだよ
new FrameDecoder(this.port) としただけで、portがGCされないかぎり作り捨てたはずのFrameDecoderがGCされないという、非直感的なコードになるわけ

1016:デフォルトの名無しさん
18/06/05 12:55:30.14 vCTdp4Eha.net
何言ってるのかさっぱりわからん
よくわからん思考回路だな...

1017:デフォルトの名無しさん
18/06/05 13:09:28.12 GjVlFAo70.net
言い回しがようわからんが
>>990みたいなのするのが解放されないオブジェクトを量産するっていうのはなんとなくわかる

1018:デフォルトの名無しさん
18/06/05 13:11:38.32 vyKZFDS5a.net
>>993
分からないならイベントというものを正しく理解してないんじゃないかな
ボタンのクリックイベントをフォームが受け取れるのは、ボタンがフォームへの参照を(実際には間にデリゲートが入るので間接的にだが)持ってるから
基本的に、引数に渡ってきたものに自分自身を登録するのは避けたほうがいい
オブジェクトのライフタイムが非常に分かりにくくなるから

1019:デフォルトの名無しさん
18/06/05 13:53:28.61 UBCugO63M.net
reactive extensionsって.NET発祥なのに使う人少ないよね

1020:デフォルトの名無しさん
18/06/05 15:23:49.06 n583dJR10.net
>>974
ちょまど神って???状態でしたので調べてみました。
一つ知識が増えました。ありがとうございます。

1021:デフォルトの名無しさん
18/06/05 15:24:19.24 n583dJR10.net
>>975
そうなんですか。。。
NET Coreっての調べてみます。どうも有難う御座います。
ちょど昨日 GUI って何だ??って検索したばかりでした。
3日前からプログラムの勉強をはじめたばかりで。。。

1022:デフォルトの名無しさん
18/06/05 15:24:34.93 n583dJR10.net
>>980
ありがとうございます。TRYしてみます。
この掲示板すごーい!!皆様に感謝です。

1023:デフォルトの名無しさん
18/06/05 16:15:32.44 vCTdp4Eha.net
>>994
ないないw
イベントの購読解除はリークの原因になるのはその通りだけど、
それは>>991が主張するように、イベントを発生するオブジェクトを引数で受け取ったかどうかと無関係。
>>995
俺は理解してないのは君の方だと思うよw
その君のいう俺様ルール、何が悪いのかさっぱり分からない
そもそも今はそんな話をしてるんじゃないw
単に質問者の参考になるかもしれんコードの骨組みを示しただけw

1024:デフォルトの名無しさん
18/06/05 16:16:25.51 vCTdp4Eha.net
あ、
× イベントの購読解除
〇 イベントの購読解除忘れ

1025:デフォルトの名無しさん
18/06/05 19:31:17.11 70UTtyrn0.net
次スレたててみる

1026:デフォルトの名無しさん
18/06/05 19:33:22.39 70UTtyrn0.net
ふらっと C#,C♯,C#(初心者用) Part138
スレリンク(tech板)
たった
議論は他のところでよろしく

1027:デフォルトの名無しさん
18/06/06 00:18:56.95 +J9HGVUKa.net
>>1000
想像力のない人だなあ
>>990だと、イベントハンドラの登録を解除しない限り、FrameDecoderが不要になっても
登録先のCommunicationPortよりも先にGCされることは絶対にない。
じゃあ不要になったらイベントハンドラを登録解除できるようにしよう。いつ解除する?
それはFrameDecoder自身には分からない。知


1028:っているとしたら、それは>>981のいうメインクラスだろう。 登録解除するにはFrameDecoderクラスのDisposeメソッドを呼べ、という仕様にするか? 結局、985のFrameDecoderを正しく扱うには、メインクラス側がそういうクラス外から見ただけでは想像できないFrameDecoderの気難しい仕様を理解した上で、 必要に応じて明示的な解放を行わなくてはならない。 そんなことをするくらいならメインクラス側で明示的に登録・登録解除をやったほうが遥かに素直で分かりやすい。



1029:デフォルトの名無しさん
18/06/06 00:26:33.34 D75pa1n0a.net
質問いいですか?

1030:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 60日 6時間 46分 14秒

1031:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch