■91525 / inTopicNo.14) |
Re[4]: メモリリークに関して |
□投稿者/ 魔界の仮面弁士 (2215回)-(2019/07/03(Wed) 17:07:14)
|
■No91519 (WebSurfer さん) に返信 > Form コントロールの場合、Dispose(), Dispose(bool) の実装は Control toha違うようです。 > 下のリンクをクリックして画像を見てください。 > http://surferonwww.info/BlogEngine/image.axd?picture=2019%2f7%2fFormDispose0.jpg
Dispose の実装は、Label と Form で差異が無さそうに見えます。 少なくとも .NET Compact Framework においては。
手元の VS2008 環境で、Form1 の継承関係をたどってみました。 CE 機が無いので、エミュレーターでの動作ですけれども。
× は Dispose(boolean) が実装されていないクラス ※ は Dispose(boolean) が派生元にあるが、実装しなおしてないクラス ☆ は Sub Overrides Dispose(boolean) として実装しなおされているクラス ★ は Sub Overridable Dispose(boolean) として最初に実装されているクラス
.NET Compact Framework の場合
× Object └× MarshalByRefObject └★ Component └☆ Control └※ ScrollableControl └※ ContainerControl └※ Form └☆ Form1
.NET Framework の場合
× Object └× MarshalByRefObject └★ Component └☆ Control └☆ ScrollableControl └☆ ContainerControl └☆ Form └☆ Form1
Imports System.Reflection
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ListBox1.DataSource = New Type(-1) {} ListBox1.DisplayMember = "Name" ListBox2.DataSource = New Type(-1) {} ListBox2.DisplayMember = "Name" ComboBox1.DataSource = New Type() { _ GetType(Form1), _ GetType(Form), _ GetType(Label), _ GetType(Panel), _ GetType(Control) _ } ComboBox1.DisplayMember = "FullName" TextBox1.Text = "Dispose" CheckBox1.Checked = True End Sub
Private Sub Analyze(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged, CheckBox1.CheckStateChanged, TextBox1.TextChanged Analyze() End Sub
Private Sub Analyze() Dim selType As Type = DirectCast(ComboBox1.SelectedItem, Type) Dim methodName As String = TextBox1.Text Dim declaredOnly As Boolean = CheckBox1.Checked CheckBox1.Enabled = Not String.IsNullOrEmpty(methodName)
'Sub Dispose() の実装 ListBox1.DataSource = EnumrateMethodImpl(selType, declaredOnly, methodName)
'Sub Dispose(Boolean) の実装 ListBox2.DataSource = EnumrateMethodImpl(selType, declaredOnly, methodName, GetType(Boolean)) End Sub
Public Shared Function EnumrateMethodImpl(ByVal t As Type, ByVal declaredOnly As Boolean, ByVal methodName As String, ByVal ParamArray params As Type()) As Type() Dim bf As BindingFlags = BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Instance If declaredOnly Then bf = bf Or BindingFlags.DeclaredOnly End If Dim targetType As Type = t Dim types As New List(Of Type)() Dim bt As Type = targetType Do If String.IsNullOrEmpty(methodName) Then types.Add(bt) ElseIf bt.GetMethod(methodName, bf, Type.DefaultBinder, params, Nothing) IsNot Nothing Then types.Add(bt) End If bt = bt.BaseType Loop Until bt Is Nothing Dim result As Type() = types.ToArray() Array.Reverse(result) Return result End Function End Class
|
|