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

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

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

全過去ログを検索

<< 0 >>
■28367  Re[11]: ガベージコレクションについて
□投稿者/ 渋木宏明(ひどり) -(2008/11/25(Tue) 12:55:23)
>
    >>であっても、何かを証明したことにはならないでよね。
    >
    > 完全な証明でないことはわかってますが、1時間も動かせば必要十分な証明だと思います。
    > 100秒、200秒の世界の話をしているわけですから。

    「証明するはずだったこと」が証明されてないと思います。

    System.Threading.Timer がユーザコード上で参照を失っても生存し続けているのは CLR がどうにかしてくれているわけではなく、System.Threading.Timer に固有の実装(の工夫う?)によるものだという話です。

    「System.Threading.Timer さえ生き残ってくれればそれでいい」ということなら、特に異議は唱えません。

    一般論として、「マネージヒープ上に確保されたメモリ以外の資源も GC が管理してくれるので、プログラマは資源管理に配慮する必要はない」という展開になっているように思えたので「違う」と指摘しました。
記事No.28198 のレス /過去ログ51より / 関連記事表示
削除チェック/

■33903  Re[1]: クラスライブラリについて
□投稿者/ Jitta on the way -(2009/03/12(Thu) 19:20:38)
    No33901 (nam さん) に返信
    > いつもお世話になっています。
    >
    > 早速質問なのですが、
    > 今回初めてVB2008でクラスライブラリを作成することになりました。
    >
    > 現在プロト作成中なのですが、
    > 1つ悩んでいる部分があります。
    >
    > クラスライブラリにボタンを配置し、
    > 参照したフォームにクラスライブラリを配置します。
    >
    > この時、フォーム側でクラスライブラリのボタンが
    > 押されたことをハンドルすることはできるのでしょうか?
    >
    > --クラスライブラリの中身--
    > Public Class UserControl1
    この辺でイベント宣言して
    > Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    > Handles Button1.Click
    > MessageBox.Show("test")
    この辺りでハンドラーを呼び出してやる
    > End Sub
    > End Class
    > --------------------------
    >
    > 配置したフォーム側でこの"Button1_Click"を取得したいのです。
    >
    > よろしくお願いします。
    >


    詳しいことは MSDN ライブラリ を参照してから。
記事No.33901 のレス /過去ログ59より / 関連記事表示
削除チェック/

■53709  Re[26]: OracleClient接続のあとにODP接続でエラー発生
□投稿者/ たか -(2010/09/24(Fri) 19:11:21)
    ついに解決しました。

    >本当はODPのバージョン以上のクライアントが必要みたいです。
    なしさんの↑が答えでした。

    ↓のoracle data provider for .net 開発者ガイドを見ると、
    http://otndnld.oracle.co.jp/document/products/oracle10g/102/windows/B31247-01/install001.htm#i1006191
    Oracle Clientリリース10.2以降およびOracle Net Services(ODP.NETソフトウェアを含む)

    確かに、Oracle Clientリリース10.2以降と書いてあります。
    ずっと、Oracle Client10.1で動作してきて問題なかったので盲点でした。

    さっそくOracle Client10.2を入れたところ、(ODPのバージョン以上のクライアントをこれで満たす!)
    問題のコードが動作しました。
    (再現コードも、元の問題のあったWindowsアプリも動作しました)

    何人も私のつまらない質問に時間を使ってくださいまして、みなさん本当にありがとうございました。ここはほんといい掲示板ですね。

    >2回目のエラーは、別スレッド(.net framework?)が、connectionをdisposeしようとして
    >同様のエラーが発生していると思ってよいですよね。
    >
    >ちなみにこのエラーは、catchしてもアプリケーション終了しますが、このアプリ終了はキャンセルできないですよね。
    ↑のエラーについては、AppDomain.CurrentDomain.UnhandledExceptionに登録したイベントでcatchされるので
    別スレッドの後始末が動いているようで。どうもAppDomain.CurrentDomain.UnhandledExceptionで
    catchしたら、もうアプリは終了するしかないようなので、これはこのまま、その旨エラー表示を出すことでOKとしました。
    (ちょっとかっこ悪いですが)

    エラーが出る環境の人には、ODPのバージョン以上のクライアントが必要との説明もつくので
    (Oracleのマニュアルに書いてあるし)
    それを説明して、インストールしてもらうことにします。
記事No.53459 のレス / END /過去ログ90より / 関連記事表示
削除チェック/

■82669  Re[5]: クラスで定義した変数を比較する方法
□投稿者/ 魔界の仮面弁士 -(2017/01/25(Wed) 14:51:35)
    No82668 (魔界の仮面弁士) に追記
    > たとえば HashSet というクラスは「重複しない要素」を管理するコレクションであり、
    > 同じデータを Add しても無視される仕様として設計されています。
    >
    > GetHashCode が一致していた場合にのみ、さらに Equals メソッドで
    > 追加判定されます。これにより、毎回 Equals を呼び出すことなく、
    > 高速に同一データの存在を確認できるようになっています。

    以下、HashSet クラスを交えた具体例です。

    この一致性判定は、HashSet クラスの他、List.Contains メソッドの要素チェックや、
    Dictionary のキーとしても利用されています。



    ◆パターンA◆

     'HashSet.Add メソッドを 2 回呼び出しています。
     '
     '1 回目の Add と 2 回目の Add とで同一のインスタンスを
     '指定していますが、Add 前に値を変更しています。
     '
     Dim o As New test()
     Dim hs1 As New HashSet(Of test)
     o.aaa = "1"
     hs1.Add(o)
     o.aaa = "2"
     hs1.Add(o)
     Console.WriteLine(hs1.Count)  '★

     Dim p As New System.Net.IPAddress(New Byte() {192, 0, 2, 1})
     Dim hs2 As New HashSet(Of System.Net.IPAddress)()
     hs2.Add(p)
     p.Address += 1
     hs2.Add(p)
     Console.WriteLine(hs2.Count)


    Add された時に、GetHashCode 値が取得され、コレクション内に記録されます。

    もし、GetHashCode をオーバーライドしていなかった場合、
    o.aaa を書き換えても GetHashCode は変化しません。このため、
    登録済みデータに合致する情報であるとみなされ、
    2 回目の Add は実施されません。

    そのため、★の件数表示で「1」と出力されます。

    一方、GetHashCode をオーバーライドして o.aaa の変化に追従させた場合、
    別データと看做されるため、両方とも登録され「2」と出力されます。
    IPAddress の場合も 2 件ですね。


    ただしこの場合、hs(0) と hs(1) が同じオブジェクトへの参照になってしまうため、
    『If hs(0) = hs(1) Then』も True になってしまいます。
    異なる要素に同じデータが入ってしまうのは、HashSet クラスの特性に向きません。

    そのため、このような使い方が必要な場合は、後から内容が書き換えられないよう、
    読み取り専用な不変クラス(あるいはそれに準じた実装)とすることを検討してみてください。




    ◆パターンB◆

     'HashSet.Add メソッドを 2 回呼び出しています。
     '
     '1 回目の Add と 2 回目の Add とで異なるインスタンスを
     '指定していますが、インスタンス双方は同じ値を有しています。
     '
     Dim q As New test() With {.aaa = "x", .bbb = "y", .ccc = "z"}
     Dim r As New test() With {.aaa = "x", .bbb = "y", .ccc = "z"}

     Dim hs3 As New HashSet(Of test)
     hs3.Add(q)
     hs3.Add(r)
     Console.WriteLine(hs3.Count)  '☆

     '(s1 Is s2) は「False」、(s1 = s2)は「True」
     Dim sb As New System.Text.StringBuilder("TEST")
     Dim s1 As String = sb.ToString()
     Dim s2 As String = sb.ToString()

     Dim hs4 As New HashSet(Of String)
     hs4.Add(s1)
     hs4.Add(s2)
     Console.WriteLine(hs4.Count)


    このケースでは、☆ は「2」です。
    もし、☆を「1」にしたい場合は、test クラスにさらに

     Public Overrides Function Equals(obj As Object) As Boolean
      Return TypeOf obj Is test AndAlso DirectCast(obj, test) = Me
     End Function

    のように、Object.Equals をオーバライドすれば OK です。
    Equals の既定の動作は参照性一致なので、「値の比較」にしたい場合は、
    その動作を上書きする必要があるわけです。


    HashSet について言えば、Object.Equls の代わりに IEquatable(Of ).Equals でも構いません。
    Object.Equals と IEquatable(Of ).Equals の両方が実装されていた場合、
    IEquatable(Of ) の方が優先されるようになっています。

    Public Class test
     Implements IEquatable(Of test)
     Private Overloads Function Equals(other As test) As Boolean Implements IEquatable(Of test).Equals
      Return TypeOf other Is test AndAlso DirectCast(other, test) = Me
     End Function
     '
     '
     '
    End Class



    ◆ Equals メソッド が True を返す場合、その 2 つのオブジェクトの
     GetHashCode メソッドは、必ず同じ値を返すように実装されていなければなりません。
     すなわち Equals を実装する際には、必然的に GetHashCode の実装も必要ということです。


    ◆ 2 つのオブジェクトの GetHashCode メソッドが同じ値を返したからといって
     必ずしも Equals メソッドが True になるとは限りません。
     極端な話、GetHashCode を「Return 固定値」で実装しても動作はします。
     (探索回数が増えるので、パフォーマンスは犠牲になりますが)


    Equals をオーバーライドしたときに、等価演算子まで用意するかどうかは任意です。
    しかし逆に等価演算子を実装した場合には、一緒に Equals メソッド
    (それと GetHashCode) もオーバーライドした方が良いとおもいます。
    先の例では、Equals を書き漏れていましたが…。
記事No.82660 のレス /過去ログ141より / 関連記事表示
削除チェック/

■85323  Re[1]: ほんの稀に例外エラーがでる
□投稿者/ Azulean -(2017/10/07(Sat) 19:32:18)
    2017/10/07(Sat) 19:52:59 編集(投稿者)

    No85322 (みー さん) に返信
    > 例外が発生するところは,全画面の時のFormの幅を取得している601行で、
    > ActiveForm.getがnull・・・あとは忘れたのですが。取得に失敗している??
    > 全画面の幅を取得して7で割って日付のLabelの幅に代入しています。

    ActiveForm はそのアプリケーションのアクティブになっているフォームが帰ってくるプロパティですが、
    ほかのアプリケーションがアクティブになっているなど、状況によっては null を返します。
    ActiveForm が null を返してもうまく動くようにコードを書く必要があります。

    基本的には ActiveForm に依存する(ActiveForm を使う)ことは避けるべきです。
    今後のアプリケーションの拡張(たとえば、設定画面を追加するなど)を妨げることになるため。
    (設定画面を表示中など、LabelSizeChanged が予期せぬタイミングで呼び出される可能性がある)


    このコードが Form2 自身にある場合は、this を書くか、省略してそのまま
    自分自身の Width, Height プロパティを参照すればいい話です。

    int width7 = Width / 7;

    計算している箇所が Form2 自身ではなく、ユーザコントロールならば、
    ParentForm を参照したら良いでしょう。

    int width7 = ParentForm.Width / 7;

    計算している箇所が Form2 自身ではなく、自前のクラスなら、
    Form2 をあらかじめコンストラクタか何かで渡すようにしておいたら良い話です。

    private readonly Form _form;
    public DesktopCalendar(Form parentForm)
    {
    _form = parentForm;
    }

    private void LabelSizeChanged()
    {
    int width7 = _form.Width / 7;
    // 以下略
    }
記事No.85322 のレス /過去ログ146より / 関連記事表示
削除チェック/

■85324  Re[2]: ほんの稀に例外エラーがでる
□投稿者/ ??[ -(2017/10/07(Sat) 19:50:22)
    No85323 (Azulean さん) に返信
    > 2017/10/07(Sat) 19:44:38 編集(投稿者)

    ありがとうございます。
    教えて頂いたように頑張ってみます。

    >
    > ■No85322 (みー さん) に返信
    >>例外が発生するところは,全画面の時のFormの幅を取得している601行で、
    >>ActiveForm.getがnull・・・あとは忘れたのですが。取得に失敗している??
    >>全画面の幅を取得して7で割って日付のLabelの幅に代入しています。
    >
    > ActiveForm はそのアプリケーションのアクティブになっているフォームが帰ってくるプロパティですが、
    > ほかのアプリケーションがアクティブになっているなど、状況によっては null を返します。
    > ActiveForm が null を返してもうまく動くようにコードを書く必要があります。
    >
    > 基本的には ActiveForm に依存する(ActiveForm を使う)ことは避けるべきです。
    > 今後のアプリケーションの拡張(たとえば、設定画面を追加するなど)を妨げることになるため。
    > このコードが Form2 自身にある場合は、this を書くか、省略してそのまま
    > 自分自身の Width, Height プロパティを参照すればいい話です。
    >
    > int width7 = Width / 7;
    >
    > 計算している箇所が Form2 自身ではなく、ユーザコントロールならば、
    > ParentForm を参照したら良いでしょう。
    >
    > int width7 = ParentForm.Width / 7;
    >
    > 計算している箇所が Form2 自身ではなく、自前のクラスなら、
    > Form2 をあらかじめコンストラクタか何かで渡すようにしておいたら良い話です。
    >
    > private readonly Form _form;
    > public DesktopCalendar(Form parentForm)
    > {
    > _form = parentForm;
    > }
    >
    > private void LabelSizeChanged()
    > {
    > int width7 = _form.Width / 7;
    > // 以下略
    > }
記事No.85322 のレス / END /過去ログ146より / 関連記事表示
削除チェック/

■85326  Re[3]: ほんの稀に例外エラーがでる
□投稿者/ ??[ -(2017/10/07(Sat) 22:34:20)
    No85324 (??[ さん) に返信
    > ■No85323 (Azulean さん) に返信
    >>2017/10/07(Sat) 19:44:38 編集(投稿者)
    >
    > ありがとうございます。
    > 教えて頂いたように頑張ってみます。

    Widthだけで良かったんですね。
    最初は自分なりに考えて、うまくいかず解説本・ネットで探して最終的にActiveFormで動いたんで喜んでいたんですが。
    先が長いですね。
    本当にありがとうございました。

    > int width7 = Width / 7;
記事No.85322 のレス /過去ログ146より / 関連記事表示
削除チェック/

■85332  Re[4]: ほんの稀に例外エラーがでる
□投稿者/ ??[ -(2017/10/09(Mon) 11:36:59)
    No85326 (??[ さん) に返信
    > ■No85324 (??[ さん) に返信
    >>■No85323 (Azulean さん) に返信
    > >>2017/10/07(Sat) 19:44:38 編集(投稿者)
    >>
    >>ありがとうございます。
    >>教えて頂いたように頑張ってみます。
    >
    > Widthだけで良かったんですね。
    > 最初は自分なりに考えて、うまくいかず解説本・ネットで探して最終的にActiveFormで動いたんで喜んでいたんですが。
    > 先が長いですね。
    > 本当にありがとうございました。
    >
    >>int width7 = Width / 7;
記事No.85322 のレス / END /過去ログ146より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -