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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■77098  Re[1]: IDisposableの実装について
□投稿者/ Azulean -(2015/09/11(Fri) 07:14:45)
    2015/09/11(Fri) 07:39:16 編集(投稿者)

    No77096 (日曜プログラマー さん) に返信
    > ただIDisposableはリソースを開放するためのインターフェイスだと理解していますが、
    > 今回のサンプルや追々実装したい内容ではリソースの開放は行いません。

    本来の意図・理想を重視するとその通りです。
    それに反することに違和感を覚える方もいらっしゃるので、そのチーム次第かと思います。

    > 変な質問ですが、この実装はアリですか?ナシですか?
    > 理由やそういう結論に達する考え方も教えてほしいです。
    > また、他に楽に書ける方法などあればご教授いただきたいです。

    私は「あり」だと考えています。
    try-finally を重ねていくとインデントが深くなる、実装ミスのリスクが増えるので、かんたんに書ける using スコープを使うテクニックの方を推しています。

    実際、Rx(Reactive Extentions) には「Dispose が呼ばれたら任意の Action を実行する」オブジェクトを作ることができる、Disposable.Create というメソッドもあるので、
    そういった文化もあると考えています。
    https://msdn.microsoft.com/en-us/library/system.reactive.disposables.disposable.create



    あとは、BeginUpdate, EndUpdate, Try-Finally を書いたユーティリティメソッドを用意しておいて、そいつに更新用のアクションを渡すことでしょうか。
    C# で申し訳ないですが、イメージとして。

    void InUpdateAction(ComboBox combo, Action action)
    {
    combo.BeginUpdate();
    try
    {
    action();
    }
    finally
    {
    combo.EndUpdate();
    }
    }

    // 例
    InUpdateAction(_comboTest, () => { _comboTest.Items.Clear(); /* BeginUpdate と EndUpdate の間にやりたい処理を詰める */ });
記事No.77096 のレス /過去ログ130より / 関連記事表示
削除チェック/

■88895  C#におけるModule
□投稿者/ あら汁 -(2018/10/11(Thu) 13:40:10)

    分類:[.NET 全般] 

    現在、VB.NETのコードをC#に移植しています。VBにおけるModuleと同様に、C#にもModuleを使いたいです。
    どの様にすれば良いのでしょうか?
親記事 /過去ログ153より / 関連記事表示
削除チェック/

■92328  Re[6]: スレッドをタスクで書くには
□投稿者/ TanuTanu -(2019/09/10(Tue) 18:55:17)
    魔界の仮面弁士 さん

    ありがとうございました。

    別クラスでShared使っていたので、これを止めてForm1渡せば上手くいきました。

    一つ伺ってもいいでしょうか。

    ただまだ解っていないところがありまして、Timer1_Tickを使っているのですが

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    DIM _他クラス AS NEW 他クラス(Form1)

    _他クラス=NOTHING

    End Sub

    のような使い方は、_他クラス=NOTHINGをしないと
    _他クラスのインスタンスが増殖してしまうと思っていいのでしょうか?

記事No.92298 のレス /過去ログ159より / 関連記事表示
削除チェック/

■92329  Re[7]: スレッドをタスクで書くには
□投稿者/ 魔界の仮面弁士 -(2019/09/10(Tue) 20:36:13)
    2019/09/10(Tue) 21:05:58 編集(投稿者)

    No92328 (TanuTanu さん) に返信
    > 別クラスでShared使っていたので、これを止めてForm1渡せば上手くいきました。

    Shared やフィールド変数は、スレッド間で無闇に共有しないほうが良いのですけれどね。

    で… Form1 はスレッドセーフなオブジェクトではありません。
    DataSet は、読み取りに関してのみスレッドセーフが保証されていますが、
    Form のメンバーは、たとえ読み取りのみであってもスレッドセーフではありませんので、
    Form1 を非 UI スレッドに渡さないようにしてください。



    > ただまだ解っていないところがありまして、Timer1_Tickを使っているのですが
    > Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    > DIM _他クラス AS NEW 他クラス(Form1)

    念のためにお聞きしますが、「他クラス」の中でワーカースレッドを起動して、
    その中で、引数の Form1 インスタンスを利用していたりはしないですよね?


    それはさておき、「New 他クラス(Form1)」と呼び出した場合の Form1 は、
    データ型としての Form1 クラスのことではなく、
    VB 固有の My.Forms.Form1 プロパティ相当の意味になりますよね。

    いわゆる「既定のフォーム インスタンス」などと呼ばれる機能ですが、
    この方式での Form へのアクセスは避けることを強くお奨めします。
    マルチスレッドでの開発を手がけようというのであれば。


    > のような使い方は、_他クラス=NOTHINGをしないと
    > _他クラスのインスタンスが増殖してしまうと思っていいのでしょうか?

    Nothing 代入は不要です。
    使用している変数 `_他クラス` はローカル変数なので、
    何もせずとも、End Sub 到達時点で自動的に処分されます。

    解放前に適切な終了処理が必要なもの(たとえば IDisposable など)の場合は、
    Finally 等を併用するべきですが、そうでないなら作りっぱなしで構いません。

    もし仮に、すべてのクラスが Nothing 代入を必要とするのだとしたら、
    As String な変数一つ一つにも Nothing しなければならないという事になってしまいます。


    ただ、そもそも「他クラス」のインスタンスを Tick イベントのたびに New しなおす必要が
    あるかどうかも検討してみてください。処理内容によっては、「他クラス」のインスタンスを
    フィールド変数などとして保持しておき、イベント側ではそれを使いまわすだけで十分かもしれません。
記事No.92298 のレス /過去ログ159より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -